/**
* Copyright (c) 2005 IBM Corporation 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:
* IBM - Initial API and implementation
*/
package org.eclipse.emf.test.core.common.util;
import java.util.Date;
import java.util.List;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.ETypedElement;
import org.eclipse.emf.ecore.EcoreFactory;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.util.ExtendedMetaData;
import org.eclipse.emf.ecore.xml.type.internal.XMLCalendar;
import org.eclipse.emf.test.core.featuremap.supplier.PurchaseOrder;
import org.eclipse.emf.test.core.featuremap.supplier.Supplier;
import org.eclipse.emf.test.core.featuremap.supplier.SupplierFactory;
import org.eclipse.emf.test.models.customer.AddressType;
import org.eclipse.emf.test.models.customer.CreditInfo;
import org.eclipse.emf.test.models.customer.CustomerFactory;
import org.eclipse.emf.test.models.customer.CustomerType;
public class EqualityTest extends TestCase
{
private static SupplierFactory supplierFactoryInstance;
private static PurchaseOrder po1;
private static PurchaseOrder po2;
private static Supplier supplier1;
private static Supplier supplier2;
private static CustomerFactory customerFactoryInstance;
private static CustomerType customer1;
private static CustomerType customer2;
private static AddressType address1;
private static AddressType address2;
private static CreditInfo credit1;
private static CreditInfo credit2;
private static EPackage employeePackage;
private static EClass employeeClass;
private static EAttribute nameAttr;
private static EReference employeesRef;
private static EAttribute ratingsAttr;
private static EAttribute ordersAttr;
private static EAttribute preferredAttr;
private static EAttribute standardAttr;
/*
* @see TestCase#setUp()
*/
@Override
protected void setUp() throws Exception
{
if (employeePackage == null)
{
employeePackage = getEmployeePackage();
}
supplierFactoryInstance = SupplierFactory.eINSTANCE;
po1 = supplierFactoryInstance.createPurchaseOrder();
po2 = supplierFactoryInstance.createPurchaseOrder();
supplier1 = supplierFactoryInstance.createSupplier();
supplier2 = supplierFactoryInstance.createSupplier();
customerFactoryInstance = CustomerFactory.eINSTANCE;
customer1 = customerFactoryInstance.createCustomerType();
customer2 = customerFactoryInstance.createCustomerType();
address1 = customerFactoryInstance.createUSAddr();
address2 = customerFactoryInstance.createUSAddr();
credit1 = customerFactoryInstance.createCreditInfo();
credit2 = customerFactoryInstance.createCreditInfo();
}
/*
* @see TestCase#tearDown()
*/
@Override
protected void tearDown() throws Exception
{
super.tearDown();
}
/**
* Constructor for CompareTest.
* @param name
*/
public EqualityTest(String name)
{
super(name);
}
public static Test suite()
{
TestSuite ts = new TestSuite("EqualityTest");
ts.addTest(new EqualityTest("shallowTest"));
ts.addTest(new EqualityTest("featureMapTest"));
ts.addTest(new EqualityTest("deepTest"));
ts.addTest(new EqualityTest("crossReferenceTest"));
return ts;
}
public void shallowTest()
{
// basic == and null comparisons
assertTrue(EcoreUtil.equals(po1, po1));
assertTrue(EcoreUtil.equals((EObject)null, (EObject)null));
assertTrue(!EcoreUtil.equals(null, po1));
assertTrue(!EcoreUtil.equals(po1, null));
// the eClass is different.
assertTrue(!EcoreUtil.equals(po1, supplier1));
assertTrue(EcoreUtil.equals(po1, po2));
// make sure copy and areEquals are consistent
EObject po1Copy = EcoreUtil.copy(po1);
assertTrue(EcoreUtil.equals(po1, po1Copy));
// customer1's ID is unset
customer2.setID("987654321");
assertTrue(!EcoreUtil.equals(customer1, customer2));
supplier1.setName("BlueLabel");
// supplier2's name is unset
assertTrue(!EcoreUtil.equals(supplier1, supplier2));
supplier1.eUnset(supplier1.eClass().getEStructuralFeature("name"));
assertTrue(EcoreUtil.equals(supplier1, supplier2));
// test attribute
address1.setTown("New Orleans");
assertTrue(!EcoreUtil.equals(address1, address2));
address2.setTown("Chicago");
assertTrue(!EcoreUtil.equals(address1, address2));
address2.setTown(null);
assertTrue(!EcoreUtil.equals(address1, address2));
assertTrue(!EcoreUtil.equals(address2, address1));
address1.setTown(null);
assertTrue(EcoreUtil.equals(address1, address2));
// make sure copy and areEqual are consistent
address1.setStreet("Satchmo road");
address1.setTown("LA");
EObject address1Copy = EcoreUtil.copy(address1);
assertTrue(EcoreUtil.equals(address1Copy, address1));
// test multiplicity-many attributes
EObject employee1 = createEmployee("Mr. J. C.");
EObject employee2 = EcoreUtil.copy(employee1);
assertTrue(EcoreUtil.equals(employee1, employee2));
@SuppressWarnings("unchecked")
List<Integer> ratings1 = (List<Integer>)employee1.eGet(ratingsAttr);
@SuppressWarnings("unchecked")
List<Integer> ratings2 = (List<Integer>)employee2.eGet(ratingsAttr);
ratings1.add(456);
ratings1.add(123);
ratings2.add(123);
ratings2.add(456);
assertTrue(!EcoreUtil.equals(employee1, employee2));
ratings1.clear();
ratings2.clear();
ratings1.add(123);
ratings1.add(456);
ratings2.add(123);
ratings2.add(456);
assertTrue(EcoreUtil.equals(employee1, employee2));
}
public void featureMapTest()
{
supplier1 = supplierFactoryInstance.createSupplier();
supplier2 = supplierFactoryInstance.createSupplier();
po1 = supplierFactoryInstance.createPurchaseOrder();
po2 = supplierFactoryInstance.createPurchaseOrder();
// test FeatureMaps with EReference Entries
assertTrue(EcoreUtil.equals(supplier1, supplier2));
supplier1.getPreferredOrders().add(po1);
po2.setId("newID");
supplier2.getPreferredOrders().add(po2);
assertTrue(!EcoreUtil.equals(supplier1, supplier2));
supplier1.getPreferredOrders().clear();
supplier2.getPreferredOrders().clear();
assertTrue(EcoreUtil.equals(supplier1, supplier2));
supplier1.getStandardOrders().add(po1);
supplier1.getPreferredOrders().add(po2);
supplier1.getStandardOrders().add(EcoreUtil.copy(po2));
supplier2.getStandardOrders().add(EcoreUtil.copy(po1));
supplier2.getPreferredOrders().add(EcoreUtil.copy(po2));
supplier2.getStandardOrders().add(EcoreUtil.copy(po2));
assertTrue(EcoreUtil.equals(supplier1, supplier2));
EObject employee1 = createEmployee("Mr. M. D.");
EObject employee2 = EcoreUtil.copy(employee1);
// test FeatureMaps with EAttributes entries
assertTrue(EcoreUtil.equals(employee1, employee2));
@SuppressWarnings("unchecked")
List<String> standards1 = (List<String>)employee1.eGet(standardAttr);
standards1.add("abcd");
assertTrue(!EcoreUtil.equals(employee1, employee2));
@SuppressWarnings("unchecked")
List<String> standards2 = (List<String>)employee2.eGet(standardAttr);
standards2.add("abcd");
assertTrue(EcoreUtil.equals(employee1, employee2));
standards1.add("efgh");
@SuppressWarnings("unchecked")
List<String> preferreds2 = (List<String>)employee2.eGet(preferredAttr);
preferreds2.add("efgh");
assertTrue(!EcoreUtil.equals(employee1, employee2));
@SuppressWarnings("unchecked")
List<String> preferreds1 = (List<String>)employee1.eGet(preferredAttr);
preferreds1.add("efgh");
standards1.remove("efgh");
assertTrue(EcoreUtil.equals(employee1, employee2));
}
public void deepTest()
{
customer1 = customerFactoryInstance.createCustomerType();
customer2 = customerFactoryInstance.createCustomerType();
address1 = customerFactoryInstance.createUSAddr();
address2 = customerFactoryInstance.createUSAddr();
// differ on a String value
assertTrue(EcoreUtil.equals(customer1, customer2));
address1.setTown("New Orleans");
address2.setTown("Chicago");
customer1.setAddress(address1);
customer2.setAddress(address2);
assertTrue(!EcoreUtil.equals(customer1, customer2));
address1.setTown(address2.getTown());
assertTrue(EcoreUtil.equals(customer1, customer2));
// differ on a Date value
address1.setTown(address2.getTown());
assertTrue(EcoreUtil.equals(customer1, customer2));
long now = System.currentTimeMillis();
XMLCalendar date1 = new XMLCalendar(new Date(now), XMLCalendar.DATETIME);
XMLCalendar date2 = new XMLCalendar(new Date(now + 3600000), XMLCalendar.DATETIME);
credit1.setExpireDate(date1);
credit2.setExpireDate(date2);
customer1.setCreditCard(credit1);
customer2.setCreditCard(credit2);
assertTrue(!EcoreUtil.equals(customer1, customer2));
credit1.setExpireDate(credit2.getExpireDate());
assertTrue(EcoreUtil.equals(customer2, customer1));
// credit1 and credit2 don't have the same container but are areEqual anyway.
address1.setTown("Montreal");
assertTrue(EcoreUtil.equals(credit1, credit2));
}
//Test cases described in cases.gif, where all circles
// are shallow-areEqual DataObjects.
// Note that no two objects in r1, r2, ..., r8 are areEqual.
public void crossReferenceTest()
{
EObject employee1 = createEmployee("Mr. J. C.");
EObject employee2 = EcoreUtil.copy(employee1);
EObject employee3 = EcoreUtil.copy(employee2);
assertTrue(EcoreUtil.equals(employee1, employee3));
// adding employee2 to employee1's employees
@SuppressWarnings("unchecked")
List<EObject> employees1 = (List<EObject>)employee1.eGet(employeesRef);
employees1.add(employee2);
// adding employee3 to employee1's employees
employees1.add(employee3);
// adding employee2 to employee3's employees
@SuppressWarnings("unchecked")
List<EObject> employees3 = (List<EObject>)employee3.eGet(employeesRef);
employees3.add(employee2);
// create a clone of this employee graph
// Cross-Referencer could be used instead.
EObject employee1Prime = EcoreUtil.copy(employee1);
EObject employee2Prime = EcoreUtil.copy(employee2);
EObject employee3Prime = EcoreUtil.copy(employee3);
@SuppressWarnings("unchecked")
List<EObject> employees1Prime = (List<EObject>)employee1Prime.eGet(employeesRef);
employees1Prime.clear();
employees1Prime.add(employee2Prime);
employees1Prime.add(employee3Prime);
@SuppressWarnings("unchecked")
List<EObject> employees3Prime = (List<EObject>)employee3Prime.eGet(employeesRef);
employees3Prime.clear();
employees3Prime.add(employee2Prime);
assertTrue(EcoreUtil.equals(employee1, employee1Prime));
employees3Prime.clear();
employees3Prime.add(employee1Prime);
// employee1 is r1, employee1Prime is r2.
assertTrue(!EcoreUtil.equals(employee1, employee1Prime));
employees3Prime.clear();
employees3Prime.add(employee2);
// employee1 is r4, employee1Prime is r3.
assertTrue(!EcoreUtil.equals(employee1, employee1Prime));
employees3.clear();
employees3.add(employee2Prime);
assertTrue(EcoreUtil.equals(employee1, employee1Prime));
@SuppressWarnings("unchecked")
List<EObject> employees2 = (List<EObject>)employee2.eGet(employeesRef);
@SuppressWarnings("unchecked")
List<EObject> employees2Prime = (List<EObject>)employee2Prime.eGet(employeesRef);
employees1.clear();
employees2.clear();
employees3.clear();
employees1Prime.clear();
employees2Prime.clear();
employees3Prime.clear();
employees1.add(employee2);
employees1Prime.add(employee2Prime);
employees2.add(employee3);
employees2Prime.add(employee3Prime);
assertTrue(EcoreUtil.equals(employee1, employee1Prime));
employees3.add(employee2);
employees3Prime.add(employee1Prime);
// employee1 is r5, employee1Prime is r6
assertTrue(!EcoreUtil.equals(employee1, employee1Prime));
employees3Prime.clear();
employees3Prime.add(employee2Prime);
assertTrue(EcoreUtil.equals(employee1, employee1Prime));
employees2.clear();
employees2Prime.clear();
employees2.add(employee1Prime);
employees2Prime.add(employee1Prime);
// employee1 is r7, employee1Prime is r8.
assertTrue(!EcoreUtil.equals(employee1Prime, employee1));
employees2Prime.clear();
employees2Prime.add(employee1);
assertTrue(EcoreUtil.equals(employee1Prime, employee1));
}
private static EPackage getEmployeePackage()
{
EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
EcorePackage ecorePackage = EcorePackage.eINSTANCE;
EPackage employeePackage = ecoreFactory.createEPackage();
employeePackage.setName("emp");
employeePackage.setNsPrefix("emp");
employeePackage.setNsURI("http://www.example.com/Emp");
employeeClass = ecoreFactory.createEClass();
employeePackage.getEClassifiers().add(employeeClass);
employeeClass.setName("Employee");
EClass poClass = ecoreFactory.createEClass();
employeePackage.getEClassifiers().add(poClass);
poClass.setName("PurchaseOrder");
nameAttr = ecoreFactory.createEAttribute();
employeeClass.getEStructuralFeatures().add(nameAttr);
nameAttr.setName("name");
nameAttr.setEType(ecorePackage.getEString());
// to test multiplicity-many attributes.
ratingsAttr = ecoreFactory.createEAttribute();
employeeClass.getEStructuralFeatures().add(ratingsAttr);
ratingsAttr.setName("phoneNumbers");
ratingsAttr.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
ratingsAttr.setEType(ecorePackage.getEIntegerObject());
// create a one-way reference to an Employee, employeesRef.
// This is used to test cases described in cases.gif.
employeesRef = ecoreFactory.createEReference();
employeeClass.getEStructuralFeatures().add(employeesRef);
employeesRef.setName("employees");
employeesRef.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
employeesRef.setEType(employeeClass);
// to test FeatureMaps with EAttributes Entries
ordersAttr = ecoreFactory.createEAttribute();
employeeClass.getEStructuralFeatures().add(ordersAttr);
ordersAttr.setName("orders");
ordersAttr.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
ordersAttr.setEType(ecorePackage.getEFeatureMapEntry());
ExtendedMetaData.INSTANCE.setFeatureKind(ordersAttr, ExtendedMetaData.GROUP_FEATURE);
preferredAttr = ecoreFactory.createEAttribute();
employeeClass.getEStructuralFeatures().add(preferredAttr);
preferredAttr.setName("preferredOrders");
preferredAttr.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
preferredAttr.setEType(ecorePackage.getEString());
preferredAttr.setVolatile(true);
preferredAttr.setTransient(true);
preferredAttr.setDerived(true);
ExtendedMetaData.INSTANCE.setGroup(preferredAttr, ordersAttr);
standardAttr = ecoreFactory.createEAttribute();
employeeClass.getEStructuralFeatures().add(standardAttr);
standardAttr.setName("standardOrders");
standardAttr.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
standardAttr.setEType(ecorePackage.getEString());
standardAttr.setVolatile(true);
standardAttr.setTransient(true);
standardAttr.setDerived(true);
ExtendedMetaData.INSTANCE.setGroup(standardAttr, ordersAttr);
return employeePackage;
}
private static EObject createEmployee(String name)
{
EFactory employeeFactory = employeePackage.getEFactoryInstance();
EObject employee = employeeFactory.create(employeeClass);
employee.eSet(nameAttr, name);
return employee;
}
}