/*******************************************************************************
 * Copyright (c) 2010-2014 SAP AG and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     SAP AG - initial API and implementation
 *******************************************************************************/
package org.eclipse.skalli.testutil;

import java.util.Iterator;
import java.util.UUID;

import org.eclipse.skalli.model.EntityBase;
import org.eclipse.skalli.model.ExtensibleEntityBase;
import org.eclipse.skalli.model.ExtensionEntityBase;

public class TestExtensibleEntityBase extends ExtensibleEntityBase {

    public TestExtensibleEntityBase() {
    }

    public TestExtensibleEntityBase(UUID uuid) {
        setUuid(uuid);
    }

    public static boolean assertEquals(TestExtensibleEntityBase o1, TestExtensibleEntityBase o2) {
        boolean equals = true;
        equals &= o1.getUuid().equals(o2.getUuid());
        equals &= o1.isDeleted() && o2.isDeleted();
        UUID parentId = o1.getParentEntityId();
        if (parentId != null) {
            equals &= parentId.equals(o2.getParentEntityId());
        } else {
            equals &= o2.getParentEntityId() == null;
        }
        EntityBase parent1 = o1.getParentEntity();
        if (parent1 != null) {
            equals &= parent1.equals(o2.getParentEntity());
        } else {
            equals &= o2.getParentEntity() == null;
        }
        EntityBase firstChild1 = o1.getFirstChild();
        if (firstChild1 != null) {
            equals &= firstChild1.equals(o2.getFirstChild());
        } else {
            equals &= o2.getFirstChild() == null;
        }
        Iterator<ExtensionEntityBase> it = o1.getAllExtensions().iterator();
        for (ExtensionEntityBase ext : o2.getAllExtensions()) {
            equals &= TestExtension.assertEquals((TestExtension) ext, (TestExtension) it.next());
            equals &= o1.isInherited(ext.getClass()) && o2.isInherited(ext.getClass());
        }
        return equals;
    }
}
