/******************************************************************************* * Copyright (c) 2013 Obeo. * 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: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.emf.compare.uml2.tests.stereotypes; import static com.google.common.base.Predicates.and; import static com.google.common.base.Predicates.instanceOf; import static org.eclipse.emf.compare.utils.EMFComparePredicates.added; import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind; import static org.eclipse.emf.compare.utils.EMFComparePredicates.onFeature; import static org.eclipse.emf.compare.utils.EMFComparePredicates.removed; import static org.eclipse.emf.compare.utils.EMFComparePredicates.valueIs; import static org.eclipse.emf.compare.utils.EMFComparePredicates.valueNameMatches; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import com.google.common.base.Predicate; import com.google.common.collect.Iterators; import com.google.common.collect.UnmodifiableIterator; import java.io.IOException; import java.util.List; import org.eclipse.emf.compare.AttributeChange; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceKind; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.uml2.internal.ProfileApplicationChange; import org.eclipse.emf.compare.uml2.internal.StereotypeApplicationChange; import org.eclipse.emf.compare.uml2.internal.StereotypeAttributeChange; import org.eclipse.emf.compare.uml2.internal.StereotypeReferenceChange; import org.eclipse.emf.compare.uml2.tests.AbstractDynamicProfileTest; import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData; import org.eclipse.emf.compare.uml2.tests.stereotypes.data.dynamic.DynamicStereotypeInputData; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.uml2.uml.UMLPackage; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @SuppressWarnings("nls") public class DynamicStereotypeTest extends AbstractDynamicProfileTest { private DynamicStereotypeInputData input = new DynamicStereotypeInputData(); @BeforeClass public static void setupClass() { initEPackageNsURIToProfileLocationMap(); } @AfterClass public static void teardownClass() { resetEPackageNsURIToProfileLocationMap(); } @Test public void testA10UseCase() throws IOException { final Resource left = input.getA1Left(); final Resource right = input.getA1Right(); final Comparison comparison = compare(left, right); testAB1(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA11UseCase() throws IOException { final Resource left = input.getA1Left(); final Resource right = input.getA1Right(); final Comparison comparison = compare(right, left); testAB1(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA10UseCase3way() throws IOException { final Resource left = input.getA1Left(); final Resource right = input.getA1Right(); final Comparison comparison = compare(left, right, right); testAB1(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA11UseCase3way() throws IOException { final Resource left = input.getA1Left(); final Resource right = input.getA1Right(); final Comparison comparison = compare(left, right, left); testAB1(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA20UseCase() throws IOException { final Resource left = input.getA2Left(); final Resource right = input.getA2Right(); final Comparison comparison = compare(left, right); testAB2(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA21UseCase() throws IOException { final Resource left = input.getA2Left(); final Resource right = input.getA2Right(); final Comparison comparison = compare(right, left); testAB2(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA20UseCase3way() throws IOException { final Resource left = input.getA2Left(); final Resource right = input.getA2Right(); final Comparison comparison = compare(left, right, right); testAB2(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA21UseCase3way() throws IOException { final Resource left = input.getA2Left(); final Resource right = input.getA2Right(); final Comparison comparison = compare(left, right, left); testAB2(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA30UseCase() throws IOException { final Resource left = input.getA3Left(); final Resource right = input.getA3Right(); final Comparison comparison = compare(left, right); testAB3(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA31UseCase() throws IOException { final Resource left = input.getA3Left(); final Resource right = input.getA3Right(); final Comparison comparison = compare(right, left); testAB3(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA30UseCase3way() throws IOException { final Resource left = input.getA3Left(); final Resource right = input.getA3Right(); final Comparison comparison = compare(left, right, right); testAB3(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA31UseCase3way() throws IOException { final Resource left = input.getA3Left(); final Resource right = input.getA3Right(); final Comparison comparison = compare(left, right, left); testAB3(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA40UseCase() throws IOException { final Resource left = input.getA4Left(); final Resource right = input.getA4Right(); final Comparison comparison = compare(left, right); testAB4(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA41UseCase() throws IOException { final Resource left = input.getA4Left(); final Resource right = input.getA4Right(); final Comparison comparison = compare(right, left); testAB4(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA40UseCase3way() throws IOException { final Resource left = input.getA4Left(); final Resource right = input.getA4Right(); final Comparison comparison = compare(left, right, right); testAB4(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA41UseCase3way() throws IOException { final Resource left = input.getA4Left(); final Resource right = input.getA4Right(); final Comparison comparison = compare(left, right, left); testAB4(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA50UseCase() throws IOException { final Resource left = input.getA5Left(); final Resource right = input.getA5Right(); final Comparison comparison = compare(left, right); testAB5(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA51UseCase() throws IOException { final Resource left = input.getA5Left(); final Resource right = input.getA5Right(); final Comparison comparison = compare(right, left); testAB5(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA50UseCase3way() throws IOException { final Resource left = input.getA5Left(); final Resource right = input.getA5Right(); final Comparison comparison = compare(left, right, right); testAB5(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA51UseCase3way() throws IOException { final Resource left = input.getA5Left(); final Resource right = input.getA5Right(); final Comparison comparison = compare(left, right, left); testAB5(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA60UseCase() throws IOException { final Resource left = input.getA6Left(); final Resource right = input.getA6Right(); final Comparison comparison = compare(left, right); testAB6(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA61UseCase() throws IOException { final Resource left = input.getA6Left(); final Resource right = input.getA6Right(); final Comparison comparison = compare(right, left); testAB6(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA60UseCase3way() throws IOException { final Resource left = input.getA6Left(); final Resource right = input.getA6Right(); final Comparison comparison = compare(left, right, right); testAB6(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA61UseCase3way() throws IOException { final Resource left = input.getA6Left(); final Resource right = input.getA6Right(); final Comparison comparison = compare(left, right, left); testAB6(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA70UseCase() throws IOException { final Resource left = input.getA7Left(); final Resource right = input.getA7Right(); final Comparison comparison = compare(left, right); testAB7(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA71UseCase() throws IOException { final Resource left = input.getA7Left(); final Resource right = input.getA7Right(); final Comparison comparison = compare(right, left); testAB7(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA70UseCase3way() throws IOException { final Resource left = input.getA7Left(); final Resource right = input.getA7Right(); final Comparison comparison = compare(left, right, right); testAB7(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA71UseCase3way() throws IOException { final Resource left = input.getA7Left(); final Resource right = input.getA7Right(); final Comparison comparison = compare(left, right, left); testAB7(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA80UseCase() throws IOException { final Resource left = input.getA8Left(); final Resource right = input.getA8Right(); final Comparison comparison = compare(left, right); testAB8(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA81UseCase() throws IOException { final Resource left = input.getA8Left(); final Resource right = input.getA8Right(); final Comparison comparison = compare(right, left); testAB8(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA80UseCase3way() throws IOException { final Resource left = input.getA8Left(); final Resource right = input.getA8Right(); final Comparison comparison = compare(left, right, right); testAB8(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA81UseCase3way() throws IOException { final Resource left = input.getA8Left(); final Resource right = input.getA8Right(); final Comparison comparison = compare(left, right, left); testAB8(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA90UseCase() throws IOException { final Resource left = input.getA9Left(); final Resource right = input.getA9Right(); final Comparison comparison = compare(left, right); testAB9(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA91UseCase() throws IOException { final Resource left = input.getA9Left(); final Resource right = input.getA9Right(); final Comparison comparison = compare(right, left); testAB9(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA90UseCase3way() throws IOException { final Resource left = input.getA9Left(); final Resource right = input.getA9Right(); final Comparison comparison = compare(left, right, right); testAB9(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA91UseCase3way() throws IOException { final Resource left = input.getA9Left(); final Resource right = input.getA9Right(); final Comparison comparison = compare(left, right, left); testAB9(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA100UseCase() throws IOException { final Resource left = input.getA10Left(); final Resource right = input.getA10Right(); final Comparison comparison = compare(left, right); testAB10(TestKind.ADD, comparison); testMergeRightToLeft(left, right, null); testMergeLeftToRight(left, right, null); } @Test public void testA101UseCase() throws IOException { final Resource left = input.getA10Left(); final Resource right = input.getA10Right(); final Comparison comparison = compare(right, left); testAB10(TestKind.DELETE, comparison); testMergeRightToLeft(right, left, null); testMergeLeftToRight(right, left, null); } @Test public void testA100UseCase3way() throws IOException { final Resource left = input.getA10Left(); final Resource right = input.getA10Right(); final Comparison comparison = compare(left, right, right); testAB10(TestKind.ADD, comparison); testMergeRightToLeft(left, right, right); testMergeLeftToRight(left, right, right); } @Test public void testA101UseCase3way() throws IOException { final Resource left = input.getA10Left(); final Resource right = input.getA10Right(); final Comparison comparison = compare(left, right, left); testAB10(TestKind.DELETE, comparison); testMergeRightToLeft(left, right, left); testMergeLeftToRight(left, right, left); } @Test public void testA110UseCase3way() throws IOException { final Resource left = input.getA11Left(); final Resource right = input.getA11Right(); final Resource ancestor = input.getA11Ancestor(); final Comparison comparison = compare(left, right, ancestor); testAB11(comparison); testMergeRightToLeft(left, right, ancestor, true); testMergeLeftToRight(left, right, ancestor, true); } private void testAB1(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 6 differences assertEquals(8, differences.size()); Predicate<? super Diff> addProfileApplicationDescription = null; Predicate<? super Diff> addAppliedProfileInProfileApplicationDescription = null; Predicate<? super Diff> addUMLAnnotationDescription = null; Predicate<? super Diff> addReferencesInUMLAnnotationDescription = null; Predicate<? super Diff> addStereotypeApplicationDescription = null; Predicate<? super Diff> addRefBaseClassDescription = null; if (kind.equals(TestKind.DELETE)) { addProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION)); // addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), // ofKind(DifferenceKind.CHANGE), // onRealFeature(UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE), // not(isChangeAdd())); addUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)); addReferencesInUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(EcorePackage.Literals.EANNOTATION__REFERENCES)); } else { addProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION)); // addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), // ofKind(DifferenceKind.CHANGE), // onRealFeature(UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE), isChangeAdd()); addUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)); addReferencesInUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(EcorePackage.Literals.EANNOTATION__REFERENCES)); } addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("appliedProfile")); addStereotypeApplicationDescription = instanceOf(ResourceAttachmentChange.class); addRefBaseClassDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("base_Class")); final Diff addProfileApplication = Iterators.find(differences.iterator(), addProfileApplicationDescription); final Diff addAppliedProfileInProfileApplication = Iterators.find(differences.iterator(), addAppliedProfileInProfileApplicationDescription); final Diff addUMLAnnotation = Iterators.find(differences.iterator(), addUMLAnnotationDescription); final Diff addReferencesInUMLAnnotation = Iterators.find(differences.iterator(), addReferencesInUMLAnnotationDescription); final Diff addStereotypeApplication = Iterators.find(differences.iterator(), addStereotypeApplicationDescription); final Diff addRefBaseClass = Iterators.find(differences.iterator(), addRefBaseClassDescription); assertNotNull(addProfileApplication); assertNotNull(addAppliedProfileInProfileApplication); assertNotNull(addUMLAnnotation); assertNotNull(addReferencesInUMLAnnotation); assertNotNull(addStereotypeApplication); assertNotNull(addRefBaseClass); // CHECK EXTENSION assertEquals(1, count(differences, instanceOf(ProfileApplicationChange.class))); assertEquals(1, count(differences, instanceOf(StereotypeApplicationChange.class))); Diff addUMLProfileApplication = null; Diff addUMLStereotypeApplication = null; if (kind.equals(TestKind.ADD)) { addUMLProfileApplication = Iterators.find(differences.iterator(), and(instanceOf(ProfileApplicationChange.class), ofKind(DifferenceKind.ADD))); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.ADD))); } else { addUMLProfileApplication = Iterators.find(differences.iterator(), and(instanceOf(ProfileApplicationChange.class), ofKind(DifferenceKind.DELETE))); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.DELETE))); } assertNotNull(addUMLProfileApplication); assertEquals(4, addUMLProfileApplication.getRefinedBy().size()); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addReferencesInUMLAnnotation)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addAppliedProfileInProfileApplication)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addProfileApplication)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addUMLAnnotation)); assertNotNull(addUMLStereotypeApplication); assertEquals(2, addUMLStereotypeApplication.getRefinedBy().size()); assertTrue(addUMLStereotypeApplication.getRefinedBy().contains(addStereotypeApplication)); assertTrue(addUMLStereotypeApplication.getRefinedBy().contains(addRefBaseClass)); // CHECK REQUIREMENT if (kind.equals(TestKind.ADD)) { assertEquals(0, addProfileApplication.getRequires().size()); assertEquals(1, addUMLAnnotation.getRequires().size()); assertTrue(addUMLAnnotation.getRequires().contains(addProfileApplication)); assertEquals(1, addReferencesInUMLAnnotation.getRequires().size()); assertTrue(addReferencesInUMLAnnotation.getRequires().contains(addUMLAnnotation)); assertEquals(0, addUMLProfileApplication.getRequires().size()); assertEquals(1, addUMLStereotypeApplication.getRequires().size()); assertTrue(addUMLStereotypeApplication.getRequires().contains(addUMLProfileApplication)); } else { assertEquals(2, addProfileApplication.getRequires().size()); assertTrue(addProfileApplication.getRequires().contains(addAppliedProfileInProfileApplication)); assertTrue(addProfileApplication.getRequires().contains(addUMLAnnotation)); assertEquals(1, addUMLAnnotation.getRequires().size()); assertTrue(addUMLAnnotation.getRequires().contains(addReferencesInUMLAnnotation)); assertEquals(0, addReferencesInUMLAnnotation.getRequires().size()); assertEquals(1, addUMLProfileApplication.getRequires().size()); assertTrue(addUMLProfileApplication.getRequires().contains(addUMLStereotypeApplication)); assertEquals(0, addUMLStereotypeApplication.getRequires().size()); } // CHECK EQUIVALENCE assertEquals(0, comparison.getEquivalences().size()); testIntersections(comparison); } private void testAB2(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> addAttributeDescription = null; if (kind.equals(TestKind.DELETE)) { addAttributeDescription = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.DELETE), onFeature("manyValuedAttribute")); } else { addAttributeDescription = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.ADD), onFeature("manyValuedAttribute")); } final Diff addAttribute = Iterators.find(differences.iterator(), addAttributeDescription); assertNotNull(addAttribute); testIntersections(comparison); } private void testAB3(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); assertEquals(10, differences.size()); Predicate<? super Diff> addProfileApplicationDescription = null; Predicate<? super Diff> addAppliedProfileInProfileApplicationDescription = null; Predicate<? super Diff> addUMLAnnotationDescription = null; Predicate<? super Diff> addReferencesInUMLAnnotationDescription = null; Predicate<? super Diff> addStereotypeApplicationDescription = null; Predicate<? super Diff> addModelDescription = null; Predicate<? super Diff> addClassDescription = null; Predicate<? super Diff> addRefBaseClassDescription = null; if (kind.equals(TestKind.DELETE)) { addProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION)); // addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), // ofKind(DifferenceKind.CHANGE), // onRealFeature(UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE), // not(isChangeAdd())); addUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)); addReferencesInUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onRealFeature(EcorePackage.Literals.EANNOTATION__REFERENCES)); addModelDescription = removed("model.MyNiceModel"); addClassDescription = removed("model.MyNiceModel.Class1"); } else { addProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(UMLPackage.Literals.PACKAGE__PROFILE_APPLICATION)); // addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), // ofKind(DifferenceKind.CHANGE), // onRealFeature(UMLPackage.Literals.PROFILE_APPLICATION__APPLIED_PROFILE), isChangeAdd()); addUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(EcorePackage.Literals.EMODEL_ELEMENT__EANNOTATIONS)); addReferencesInUMLAnnotationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onRealFeature(EcorePackage.Literals.EANNOTATION__REFERENCES)); addModelDescription = added("model.MyNiceModel"); addClassDescription = added("model.MyNiceModel.Class1"); } addAppliedProfileInProfileApplicationDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("appliedProfile")); addStereotypeApplicationDescription = instanceOf(ResourceAttachmentChange.class); addRefBaseClassDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("base_Class")); final Diff addProfileApplication = Iterators.find(differences.iterator(), addProfileApplicationDescription); final Diff addAppliedProfileInProfileApplication = Iterators.find(differences.iterator(), addAppliedProfileInProfileApplicationDescription); final Diff addUMLAnnotation = Iterators.find(differences.iterator(), addUMLAnnotationDescription); final Diff addReferencesInUMLAnnotation = Iterators.find(differences.iterator(), addReferencesInUMLAnnotationDescription); final Diff addStereotypeApplication = Iterators.find(differences.iterator(), addStereotypeApplicationDescription); final Diff addModel = Iterators.find(differences.iterator(), addModelDescription); final Diff addClass = Iterators.find(differences.iterator(), addClassDescription); final Diff addRefBaseClass = Iterators.find(differences.iterator(), addRefBaseClassDescription); assertNotNull(addProfileApplication); assertNotNull(addAppliedProfileInProfileApplication); assertNotNull(addUMLAnnotation); assertNotNull(addReferencesInUMLAnnotation); assertNotNull(addStereotypeApplication); assertNotNull(addModel); assertNotNull(addClass); assertNotNull(addRefBaseClass); // CHECK EXTENSION assertEquals(1, count(differences, instanceOf(ProfileApplicationChange.class))); assertEquals(1, count(differences, instanceOf(StereotypeApplicationChange.class))); Diff addUMLProfileApplication = null; Diff addUMLStereotypeApplication = null; if (kind.equals(TestKind.ADD)) { addUMLProfileApplication = Iterators.find(differences.iterator(), and(instanceOf(ProfileApplicationChange.class), ofKind(DifferenceKind.ADD))); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.ADD))); } else { addUMLProfileApplication = Iterators.find(differences.iterator(), and(instanceOf(ProfileApplicationChange.class), ofKind(DifferenceKind.DELETE))); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.DELETE))); } assertNotNull(addUMLProfileApplication); assertEquals(4, addUMLProfileApplication.getRefinedBy().size()); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addReferencesInUMLAnnotation)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addAppliedProfileInProfileApplication)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addProfileApplication)); assertTrue(addUMLProfileApplication.getRefinedBy().contains(addUMLAnnotation)); assertNotNull(addUMLStereotypeApplication); assertEquals(2, addUMLStereotypeApplication.getRefinedBy().size()); assertTrue(addUMLStereotypeApplication.getRefinedBy().contains(addStereotypeApplication)); assertTrue(addUMLStereotypeApplication.getRefinedBy().contains(addRefBaseClass)); // CHECK REQUIREMENT if (kind.equals(TestKind.ADD)) { assertEquals(1, addProfileApplication.getRequires().size()); assertTrue(addProfileApplication.getRequires().contains(addModel)); assertEquals(1, addUMLAnnotation.getRequires().size()); assertTrue(addUMLAnnotation.getRequires().contains(addProfileApplication)); assertEquals(1, addReferencesInUMLAnnotation.getRequires().size()); assertTrue(addReferencesInUMLAnnotation.getRequires().contains(addUMLAnnotation)); assertEquals(1, addUMLProfileApplication.getRequires().size()); assertEquals(2, addUMLStereotypeApplication.getRequires().size()); assertTrue(addUMLStereotypeApplication.getRequires().contains(addUMLProfileApplication)); } else { assertEquals(2, addProfileApplication.getRequires().size()); assertTrue(addProfileApplication.getRequires().contains(addAppliedProfileInProfileApplication)); assertTrue(addProfileApplication.getRequires().contains(addUMLAnnotation)); assertEquals(1, addUMLAnnotation.getRequires().size()); assertTrue(addUMLAnnotation.getRequires().contains(addReferencesInUMLAnnotation)); assertEquals(0, addReferencesInUMLAnnotation.getRequires().size()); assertEquals(1, addUMLProfileApplication.getRequires().size()); assertTrue(addUMLProfileApplication.getRequires().contains(addUMLStereotypeApplication)); assertEquals(0, addUMLStereotypeApplication.getRequires().size()); } // CHECK EQUIVALENCE assertEquals(0, comparison.getEquivalences().size()); testIntersections(comparison); } private void testAB4(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 4 differences assertEquals(4, differences.size()); Predicate<? super Diff> addStereotypeApplicationDescription = null; Predicate<? super Diff> addClassDescription = null; Diff addUMLStereotypeApplication = null; if (kind.equals(TestKind.DELETE)) { addClassDescription = removed("model.Class0"); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.DELETE))); } else { addClassDescription = added("model.Class0"); addUMLStereotypeApplication = Iterators.find(differences.iterator(), and(instanceOf(StereotypeApplicationChange.class), ofKind(DifferenceKind.ADD))); } addStereotypeApplicationDescription = instanceOf(ResourceAttachmentChange.class); final Diff addClass = Iterators.find(differences.iterator(), addClassDescription); final Diff addStereotypeApplication = Iterators.find(differences.iterator(), addStereotypeApplicationDescription); assertNotNull(addClass); assertNotNull(addStereotypeApplication); assertNotNull(addUMLStereotypeApplication); testIntersections(comparison); } private void testAB5(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 4 differences assertEquals(4, differences.size()); Predicate<? super Diff> changeAttributeDescription1 = null; Predicate<? super Diff> changeAttributeDescription2 = null; changeAttributeDescription1 = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.CHANGE), onFeature("xmlName"), valueIs("clazz")); changeAttributeDescription2 = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.CHANGE), onFeature("className"), valueIs("theEClassName")); final Diff changeAttribute1 = Iterators.find(differences.iterator(), changeAttributeDescription1); final Diff changeAttribute2 = Iterators.find(differences.iterator(), changeAttributeDescription2); final UnmodifiableIterator<Diff> changeUMLStereotypeProperties = Iterators.filter( differences.iterator(), and(instanceOf(StereotypeAttributeChange.class), ofKind(DifferenceKind.CHANGE))); assertTrue(changeUMLStereotypeProperties.hasNext()); final Diff changeUMLStereotypeProperty1 = changeUMLStereotypeProperties.next(); assertTrue(changeUMLStereotypeProperties.hasNext()); final Diff changeUMLStereotypeProperty2 = changeUMLStereotypeProperties.next(); assertNotNull(changeAttribute1); assertNotNull(changeAttribute2); assertNotNull(changeUMLStereotypeProperty1); assertNotNull(changeUMLStereotypeProperty2); assertEquals(1, changeUMLStereotypeProperty1.getRefinedBy().size()); assertTrue(changeUMLStereotypeProperty1.getRefinedBy().contains(changeAttribute1)); assertEquals(1, changeUMLStereotypeProperty2.getRefinedBy().size()); assertTrue(changeUMLStereotypeProperty2.getRefinedBy().contains(changeAttribute2)); testIntersections(comparison); } private void testAB6(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> addStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; if (kind.equals(TestKind.ADD)) { addStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.ADD), onFeature("manyValuedReference")); } else { addStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.DELETE), onFeature("manyValuedReference")); } changeUMLStereotypeDescription = and(instanceOf(StereotypeReferenceChange.class), ofKind(DifferenceKind.CHANGE)); final Diff addStereotypeRef = Iterators.find(differences.iterator(), addStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(addStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(addStereotypeRef)); testIntersections(comparison); } private void testAB7(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> moveStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; moveStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.MOVE), onFeature("manyValuedReference")); changeUMLStereotypeDescription = and(instanceOf(StereotypeReferenceChange.class), ofKind(DifferenceKind.CHANGE)); final Diff moveStereotypeRef = Iterators.find(differences.iterator(), moveStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(moveStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(moveStereotypeRef)); testIntersections(comparison); } private void testAB8(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> changeStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; if (kind.equals(TestKind.ADD)) { changeStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("singleValuedReference"), valueNameMatches("class0")); } else { changeStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("singleValuedReference"), valueNameMatches("class1")); } changeUMLStereotypeDescription = and(instanceOf(StereotypeReferenceChange.class), ofKind(DifferenceKind.CHANGE)); final Diff changeStereotypeRef = Iterators.find(differences.iterator(), changeStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(changeStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(changeStereotypeRef)); testIntersections(comparison); } private void testAB9(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> changeStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; changeStereotypeRefDescription = and(instanceOf(ReferenceChange.class), ofKind(DifferenceKind.CHANGE), onFeature("singleValuedReference"), valueNameMatches("class0")); changeUMLStereotypeDescription = and(instanceOf(StereotypeReferenceChange.class), ofKind(DifferenceKind.CHANGE)); final Diff changeStereotypeRef = Iterators.find(differences.iterator(), changeStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(changeStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(changeStereotypeRef)); testIntersections(comparison); } private void testAB10(TestKind kind, final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> changeStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; if (kind.equals(TestKind.ADD)) { changeStereotypeRefDescription = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.CHANGE), onFeature("singleValuedAttribute"), valueIs("myValue")); } else { changeStereotypeRefDescription = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.CHANGE), onFeature("singleValuedAttribute"), valueIs("oldValue")); } changeUMLStereotypeDescription = and(instanceOf(StereotypeAttributeChange.class), ofKind(DifferenceKind.CHANGE)); final Diff changeStereotypeRef = Iterators.find(differences.iterator(), changeStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(changeStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(changeStereotypeRef)); testIntersections(comparison); } private void testAB11(final Comparison comparison) { final List<Diff> differences = comparison.getDifferences(); // We should have no less and no more than 2 differences assertEquals(2, differences.size()); Predicate<? super Diff> changeStereotypeRefDescription = null; Predicate<? super Diff> changeUMLStereotypeDescription = null; changeStereotypeRefDescription = and(instanceOf(AttributeChange.class), ofKind(DifferenceKind.CHANGE)); changeUMLStereotypeDescription = and(instanceOf(StereotypeAttributeChange.class), ofKind(DifferenceKind.CHANGE)); final Diff changeStereotypeRef = Iterators.find(differences.iterator(), changeStereotypeRefDescription); final Diff changeUMLStereotype = Iterators.find(differences.iterator(), changeUMLStereotypeDescription); assertNotNull(changeStereotypeRef); assertNotNull(changeUMLStereotype); assertEquals(1, changeUMLStereotype.getRefinedBy().size()); assertTrue(changeUMLStereotype.getRefinedBy().contains(changeStereotypeRef)); testIntersections(comparison); } @Override protected AbstractUMLInputData getInput() { return input; } }