| /******************************************************************************* |
| * Copyright (c) 2012, 2014 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.generalizationSet; |
| |
| 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.onEObject; |
| import static org.eclipse.emf.compare.utils.EMFComparePredicates.referenceValueMatch; |
| import static org.eclipse.emf.compare.utils.EMFComparePredicates.removed; |
| 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 java.io.IOException; |
| import java.util.List; |
| |
| import org.eclipse.emf.compare.Comparison; |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.DifferenceKind; |
| import org.eclipse.emf.compare.uml2.internal.GeneralizationSetChange; |
| import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData; |
| import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest; |
| import org.eclipse.emf.compare.uml2.tests.generalizationSet.data.GeneralizationSetInputData; |
| import org.eclipse.emf.ecore.EStructuralFeature; |
| 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 AddGeneralizationSetTest extends AbstractUMLTest { |
| |
| private GeneralizationSetInputData input = new GeneralizationSetInputData(); |
| |
| @BeforeClass |
| public static void setupClass() { |
| fillRegistries(); |
| } |
| |
| @AfterClass |
| public static void teardownClass() { |
| resetRegistries(); |
| } |
| |
| @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); |
| |
| testMergeLeftToRight(left, right, null); |
| testMergeRightToLeft(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); |
| |
| testMergeLeftToRight(right, left, null); |
| testMergeRightToLeft(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); |
| |
| testMergeLeftToRight(left, right, right); |
| testMergeRightToLeft(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); |
| |
| testMergeLeftToRight(left, right, left); |
| testMergeRightToLeft(left, right, left); |
| } |
| |
| 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(6, differences.size()); |
| |
| Predicate<? super Diff> addGeneralizationSetDescription = null; |
| Predicate<? super Diff> addRefGeneralizationSetInClass2Description = null; |
| Predicate<? super Diff> addRefGeneralizationSetInClass0Description = null; |
| Predicate<? super Diff> addRefGeneralizationInGeneralizationSetDescription1 = null; |
| Predicate<? super Diff> addRefGeneralizationInGeneralizationSetDescription2 = null; |
| |
| if (kind.equals(TestKind.DELETE)) { |
| addGeneralizationSetDescription = removed("model.GeneralizationSet_Class2_Class0"); //$NON-NLS-1$ |
| addRefGeneralizationSetInClass2Description = removedFromReference1("model.Class2.Class1", |
| "generalizationSet", "model.GeneralizationSet_Class2_Class0", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationSetInClass0Description = removedFromReference1("model.Class0.Class1", |
| "generalizationSet", "model.GeneralizationSet_Class2_Class0", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationInGeneralizationSetDescription1 = removedFromReference2( |
| "model.GeneralizationSet_Class2_Class0", "generalization", "model.Class0.Class1", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationInGeneralizationSetDescription2 = removedFromReference2( |
| "model.GeneralizationSet_Class2_Class0", "generalization", "model.Class2.Class1", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| } else { |
| addGeneralizationSetDescription = added("model.GeneralizationSet_Class2_Class0"); //$NON-NLS-1$ |
| addRefGeneralizationSetInClass2Description = addedToReference1("model.Class2.Class1", |
| "generalizationSet", "model.GeneralizationSet_Class2_Class0", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationSetInClass0Description = addedToReference1("model.Class0.Class1", |
| "generalizationSet", "model.GeneralizationSet_Class2_Class0", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationInGeneralizationSetDescription1 = addedToReference2( |
| "model.GeneralizationSet_Class2_Class0", "generalization", "model.Class0.Class1", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| addRefGeneralizationInGeneralizationSetDescription2 = addedToReference2( |
| "model.GeneralizationSet_Class2_Class0", "generalization", "model.Class2.Class1", |
| UMLPackage.Literals.GENERALIZATION__GENERAL); |
| } |
| |
| final Diff addGeneralizationSet = Iterators.find(differences.iterator(), |
| addGeneralizationSetDescription); |
| final Diff addRefGeneralizationSetInClass0 = Iterators.find(differences.iterator(), |
| addRefGeneralizationSetInClass0Description); |
| final Diff addRefGeneralizationSetInClass2 = Iterators.find(differences.iterator(), |
| addRefGeneralizationSetInClass2Description); |
| final Diff addRefGeneralizationInGeneralizationSet1 = Iterators.find(differences.iterator(), |
| addRefGeneralizationInGeneralizationSetDescription1); |
| final Diff addRefGeneralizationInGeneralizationSet2 = Iterators.find(differences.iterator(), |
| addRefGeneralizationInGeneralizationSetDescription2); |
| |
| assertNotNull(addGeneralizationSet); |
| assertNotNull(addRefGeneralizationSetInClass0); |
| assertNotNull(addRefGeneralizationSetInClass2); |
| assertNotNull(addRefGeneralizationInGeneralizationSet1); |
| assertNotNull(addRefGeneralizationInGeneralizationSet2); |
| |
| // CHECK EXTENSION |
| assertEquals(1, count(differences, instanceOf(GeneralizationSetChange.class))); |
| Diff addUMLGeneralizationSet = null; |
| if (kind.equals(TestKind.ADD)) { |
| addUMLGeneralizationSet = Iterators.find(differences.iterator(), |
| and(instanceOf(GeneralizationSetChange.class), ofKind(DifferenceKind.ADD))); |
| } else { |
| addUMLGeneralizationSet = Iterators.find(differences.iterator(), |
| and(instanceOf(GeneralizationSetChange.class), ofKind(DifferenceKind.DELETE))); |
| } |
| assertNotNull(addUMLGeneralizationSet); |
| assertEquals(5, addUMLGeneralizationSet.getRefinedBy().size()); |
| assertTrue(addUMLGeneralizationSet.getRefinedBy().contains(addRefGeneralizationInGeneralizationSet1)); |
| assertTrue(addUMLGeneralizationSet.getRefinedBy().contains(addRefGeneralizationInGeneralizationSet2)); |
| assertTrue(addUMLGeneralizationSet.getRefinedBy().contains(addGeneralizationSet)); |
| assertTrue(addUMLGeneralizationSet.getRefinedBy().contains(addRefGeneralizationSetInClass0)); |
| assertTrue(addUMLGeneralizationSet.getRefinedBy().contains(addRefGeneralizationSetInClass2)); |
| |
| // CHECK REQUIREMENT |
| if (kind.equals(TestKind.ADD)) { |
| assertEquals(1, addRefGeneralizationInGeneralizationSet1.getRequires().size()); |
| assertTrue(addRefGeneralizationInGeneralizationSet1.getRequires().contains(addGeneralizationSet)); |
| |
| assertEquals(1, addRefGeneralizationInGeneralizationSet2.getRequires().size()); |
| assertTrue(addRefGeneralizationInGeneralizationSet2.getRequires().contains(addGeneralizationSet)); |
| |
| assertEquals(1, addRefGeneralizationSetInClass0.getRequires().size()); |
| assertTrue(addRefGeneralizationSetInClass0.getRequires().contains(addGeneralizationSet)); |
| |
| assertEquals(1, addRefGeneralizationSetInClass2.getRequires().size()); |
| assertTrue(addRefGeneralizationSetInClass2.getRequires().contains(addGeneralizationSet)); |
| |
| assertEquals(0, addGeneralizationSet.getRequires().size()); |
| assertEquals(0, addUMLGeneralizationSet.getRequires().size()); |
| } else { |
| assertEquals(0, addRefGeneralizationInGeneralizationSet1.getRequires().size()); |
| |
| assertEquals(0, addRefGeneralizationInGeneralizationSet2.getRequires().size()); |
| |
| assertEquals(0, addRefGeneralizationSetInClass0.getRequires().size()); |
| |
| assertEquals(0, addRefGeneralizationSetInClass2.getRequires().size()); |
| |
| assertEquals(4, addGeneralizationSet.getRequires().size()); |
| assertTrue(addGeneralizationSet.getRequires().contains(addRefGeneralizationInGeneralizationSet1)); |
| assertTrue(addGeneralizationSet.getRequires().contains(addRefGeneralizationInGeneralizationSet2)); |
| assertTrue(addGeneralizationSet.getRequires().contains(addRefGeneralizationSetInClass0)); |
| assertTrue(addGeneralizationSet.getRequires().contains(addRefGeneralizationSetInClass2)); |
| |
| assertEquals(0, addUMLGeneralizationSet.getRequires().size()); |
| } |
| |
| // CHECK EQUIVALENCE |
| assertEquals(2, comparison.getEquivalences().size()); |
| |
| assertNotNull(addRefGeneralizationInGeneralizationSet1.getEquivalence()); |
| assertEquals(2, addRefGeneralizationInGeneralizationSet1.getEquivalence().getDifferences().size()); |
| assertTrue(addRefGeneralizationInGeneralizationSet1.getEquivalence().getDifferences() |
| .contains(addRefGeneralizationSetInClass0)); |
| |
| assertNotNull(addRefGeneralizationInGeneralizationSet2.getEquivalence()); |
| assertEquals(2, addRefGeneralizationInGeneralizationSet2.getEquivalence().getDifferences().size()); |
| assertTrue(addRefGeneralizationInGeneralizationSet2.getEquivalence().getDifferences() |
| .contains(addRefGeneralizationSetInClass2)); |
| |
| testIntersections(comparison); |
| |
| } |
| |
| public static Predicate<? super Diff> removedFromReference1(final String qualifiedName, |
| final String referenceName, final String removedQualifiedName, |
| final EStructuralFeature featureDelegate) { |
| // This is only meant for multi-valued references |
| return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName, featureDelegate), |
| referenceValueMatch(referenceName, removedQualifiedName, true)); |
| } |
| |
| public static Predicate<? super Diff> removedFromReference2(final String qualifiedName, |
| final String referenceName, final String removedQualifiedName, |
| final EStructuralFeature featureDelegate) { |
| // This is only meant for multi-valued references |
| return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), |
| referenceValueMatch(referenceName, removedQualifiedName, true, featureDelegate)); |
| } |
| |
| public static Predicate<? super Diff> addedToReference1(final String qualifiedName, |
| final String referenceName, final String removedQualifiedName, |
| final EStructuralFeature featureDelegate) { |
| // This is only meant for multi-valued references |
| return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName, featureDelegate), |
| referenceValueMatch(referenceName, removedQualifiedName, true)); |
| } |
| |
| public static Predicate<? super Diff> addedToReference2(final String qualifiedName, |
| final String referenceName, final String removedQualifiedName, |
| final EStructuralFeature featureDelegate) { |
| // This is only meant for multi-valued references |
| return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), |
| referenceValueMatch(referenceName, removedQualifiedName, true, featureDelegate)); |
| } |
| |
| @Override |
| protected AbstractUMLInputData getInput() { |
| return input; |
| } |
| |
| } |