| /******************************************************************************* |
| * Copyright (c) 2012, 2016 Obeo 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: |
| * Obeo - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.compare.uml2.tests.implications; |
| |
| 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.addedToReference; |
| import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedReference; |
| 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.onFeature; |
| import static org.eclipse.emf.compare.utils.EMFComparePredicates.removed; |
| import static org.eclipse.emf.compare.utils.EMFComparePredicates.removedFromReference; |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertNull; |
| 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.common.util.BasicMonitor; |
| 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.AssociationChange; |
| import org.eclipse.emf.compare.uml2.internal.MultiplicityElementChange; |
| import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData; |
| import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest; |
| import org.eclipse.emf.compare.uml2.tests.implications.data.ImplicationsInputData; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.junit.AfterClass; |
| import org.junit.BeforeClass; |
| import org.junit.Test; |
| |
| @SuppressWarnings("nls") |
| public class ImplicationsAssociationTest extends AbstractUMLTest { |
| |
| // 16 diffs of interest and 4 MultiplicityElementChanges |
| private static final int NB_DIFFS = 20; |
| |
| private ImplicationsInputData input = new ImplicationsInputData(); |
| |
| @BeforeClass |
| public static void setupClass() { |
| fillRegistries(); |
| } |
| |
| @AfterClass |
| public static void teardownClass() { |
| resetRegistries(); |
| } |
| |
| private DiffsOfInterest getDiffs(Comparison comparison, TestKind kind) { |
| final List<Diff> differences = comparison.getDifferences(); |
| Predicate<? super Diff> addAssociationDescription = null; |
| Predicate<? super Diff> addNavigableOwnedEndClass1InAssociationDescription = null; |
| Predicate<? super Diff> addNavigableOwnedEndClass2InAssociationDescription = null; |
| Predicate<? super Diff> addRefAssociationInPropertyClass1Description = null; |
| Predicate<? super Diff> addRefTypeInPropertyClass1Description = null; |
| Predicate<? super Diff> addRefAssociationInPropertyClass2Description = null; |
| Predicate<? super Diff> addRefTypeInPropertyClass2Description = null; |
| Predicate<? super Diff> addLiteralIntegerInClass1Description = null; |
| Predicate<? super Diff> addUnlimitedNaturalInClass1Description = null; |
| Predicate<? super Diff> addLiteralIntegerInClass2Description = null; |
| Predicate<? super Diff> addUnlimitedNaturalInClass2Description = null; |
| Predicate<? super Diff> addMemberEndClass1InAssociationDescription = null; |
| Predicate<? super Diff> addMemberEndClass2InAssociationDescription = null; |
| Predicate<? super Diff> addOwnedEndClass1Description = null; |
| Predicate<? super Diff> addOwnedEndClass2Description = null; |
| |
| if (kind.equals(TestKind.DELETE)) { |
| addAssociationDescription = removed("myModel.class1sToClass2s"); //$NON-NLS-1$ |
| addNavigableOwnedEndClass1InAssociationDescription = removedFromReference( |
| "myModel.class1sToClass2s", "navigableOwnedEnd", "myModel.class1sToClass2s.class1s"); |
| addNavigableOwnedEndClass2InAssociationDescription = removedFromReference( |
| "myModel.class1sToClass2s", "navigableOwnedEnd", "myModel.class1sToClass2s.class2s"); |
| addRefAssociationInPropertyClass1Description = changedReference( |
| "myModel.class1sToClass2s.class1s", "association", "myModel.class1sToClass2s", null); |
| addRefTypeInPropertyClass1Description = changedReference("myModel.class1sToClass2s.class1s", |
| "type", "myModel.Class1", null); |
| addRefAssociationInPropertyClass2Description = changedReference( |
| "myModel.class1sToClass2s.class2s", "association", "myModel.class1sToClass2s", null); |
| addRefTypeInPropertyClass2Description = changedReference("myModel.class1sToClass2s.class2s", |
| "type", "myModel.Class2", null); |
| addLiteralIntegerInClass1Description = removedLowerValueIn("myModel.class1sToClass2s.class1s"); |
| addUnlimitedNaturalInClass1Description = removedUpperValueIn("myModel.class1sToClass2s.class1s"); |
| addLiteralIntegerInClass2Description = removedLowerValueIn("myModel.class1sToClass2s.class2s"); |
| addUnlimitedNaturalInClass2Description = removedUpperValueIn("myModel.class1sToClass2s.class2s"); |
| addMemberEndClass1InAssociationDescription = removedFromReference("myModel.class1sToClass2s", |
| "memberEnd", "myModel.class1sToClass2s.class1s"); |
| addMemberEndClass2InAssociationDescription = removedFromReference("myModel.class1sToClass2s", |
| "memberEnd", "myModel.class1sToClass2s.class2s"); |
| addOwnedEndClass1Description = removedFromReference("myModel.class1sToClass2s", "ownedEnd", |
| "myModel.class1sToClass2s.class1s"); |
| addOwnedEndClass2Description = removedFromReference("myModel.class1sToClass2s", "ownedEnd", |
| "myModel.class1sToClass2s.class2s"); |
| } else { |
| addAssociationDescription = added("myModel.class1sToClass2s"); //$NON-NLS-1$ |
| addNavigableOwnedEndClass1InAssociationDescription = addedToReference("myModel.class1sToClass2s", |
| "navigableOwnedEnd", "myModel.class1sToClass2s.class1s"); |
| addNavigableOwnedEndClass2InAssociationDescription = addedToReference("myModel.class1sToClass2s", |
| "navigableOwnedEnd", "myModel.class1sToClass2s.class2s"); |
| addRefAssociationInPropertyClass1Description = changedReference( |
| "myModel.class1sToClass2s.class1s", "association", null, "myModel.class1sToClass2s"); |
| addRefTypeInPropertyClass1Description = changedReference("myModel.class1sToClass2s.class1s", |
| "type", null, "myModel.Class1"); |
| addRefAssociationInPropertyClass2Description = changedReference( |
| "myModel.class1sToClass2s.class2s", "association", null, "myModel.class1sToClass2s"); |
| addRefTypeInPropertyClass2Description = changedReference("myModel.class1sToClass2s.class2s", |
| "type", null, "myModel.Class2"); |
| addLiteralIntegerInClass1Description = addedLowerValueIn("myModel.class1sToClass2s.class1s"); |
| addUnlimitedNaturalInClass1Description = addedUpperValueIn("myModel.class1sToClass2s.class1s"); |
| addLiteralIntegerInClass2Description = addedLowerValueIn("myModel.class1sToClass2s.class2s"); |
| addUnlimitedNaturalInClass2Description = addedUpperValueIn("myModel.class1sToClass2s.class2s"); |
| addMemberEndClass1InAssociationDescription = addedToReference("myModel.class1sToClass2s", |
| "memberEnd", "myModel.class1sToClass2s.class1s"); |
| addMemberEndClass2InAssociationDescription = addedToReference("myModel.class1sToClass2s", |
| "memberEnd", "myModel.class1sToClass2s.class2s"); |
| addOwnedEndClass1Description = addedToReference("myModel.class1sToClass2s", "ownedEnd", |
| "myModel.class1sToClass2s.class1s"); |
| addOwnedEndClass2Description = addedToReference("myModel.class1sToClass2s", "ownedEnd", |
| "myModel.class1sToClass2s.class2s"); |
| } |
| |
| DiffsOfInterest diffs = new DiffsOfInterest(); |
| diffs.addAssociation = Iterators.find(differences.iterator(), addAssociationDescription, null); |
| diffs.addNavigableOwnedEndClass1InAssociation = Iterators.find(differences.iterator(), |
| addNavigableOwnedEndClass1InAssociationDescription, null); |
| diffs.addNavigableOwnedEndClass2InAssociation = Iterators.find(differences.iterator(), |
| addNavigableOwnedEndClass2InAssociationDescription, null); |
| diffs.addMemberEndClass1InAssociation = Iterators.find(differences.iterator(), |
| addMemberEndClass1InAssociationDescription, null); |
| diffs.addMemberEndClass2InAssociation = Iterators.find(differences.iterator(), |
| addMemberEndClass2InAssociationDescription, null); |
| diffs.addOwnedEndClass1InAssociation = Iterators.find(differences.iterator(), |
| addOwnedEndClass1Description, null); |
| diffs.addOwnedEndClass2InAssociation = Iterators.find(differences.iterator(), |
| addOwnedEndClass2Description, null); |
| diffs.addUMLAssociation = Iterators.find(differences.iterator(), instanceOf(AssociationChange.class), |
| null); |
| diffs.addRefAssociationInPropertyClass1 = Iterators.find(differences.iterator(), |
| addRefAssociationInPropertyClass1Description, null); |
| diffs.addRefTypeInPropertyClass1 = Iterators.find(differences.iterator(), |
| addRefTypeInPropertyClass1Description, null); |
| diffs.addRefAssociationInPropertyClass2 = Iterators.find(differences.iterator(), |
| addRefAssociationInPropertyClass2Description, null); |
| diffs.addRefTypeInPropertyClass2 = Iterators.find(differences.iterator(), |
| addRefTypeInPropertyClass2Description, null); |
| diffs.addLiteralIntegerInClass1 = Iterators.find(differences.iterator(), |
| addLiteralIntegerInClass1Description, null); |
| diffs.addUnlimitedNaturalInClass1 = Iterators.find(differences.iterator(), |
| addUnlimitedNaturalInClass1Description, null); |
| diffs.addLiteralIntegerInClass2 = Iterators.find(differences.iterator(), |
| addLiteralIntegerInClass2Description, null); |
| diffs.addUnlimitedNaturalInClass2 = Iterators.find(differences.iterator(), |
| addUnlimitedNaturalInClass2Description, null); |
| |
| return diffs; |
| } |
| |
| @Test |
| public void testA10UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| testAB1(TestKind.ADD, comparison); |
| } |
| |
| @Test |
| // local ADD |
| public void testA10UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| testAB1(TestKind.ADD, comparison); |
| } |
| |
| @Test |
| // remote ADD |
| public void testA10UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| testAB1(TestKind.ADD, comparison); |
| } |
| |
| @Test |
| public void testA10MergeLtR1UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| private void checkMergeAddNavigableOwnedEnd(Comparison comparison, DiffsOfInterest diffs) { |
| assertEquals(NB_DIFFS - 6, comparison.getDifferences().size()); |
| assertNull(diffs.addNavigableOwnedEndClass1InAssociation); |
| assertNull(diffs.addOwnedEndClass1InAssociation); |
| assertNull(diffs.addMemberEndClass1InAssociation); |
| assertNull(diffs.addRefAssociationInPropertyClass1); |
| assertNull(diffs.addAssociation); |
| assertNull(diffs.addUMLAssociation); |
| } |
| |
| @Test |
| public void testA10MergeLtR1UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeLtR1UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| private void checkMergeDeleteNavigableOwnedEnd(Comparison comparison, DiffsOfInterest diffs) { |
| // 7 diffs of interest + 2 MultiplicityElementChanges |
| assertEquals(NB_DIFFS - 9, comparison.getDifferences().size()); |
| assertNull(diffs.addNavigableOwnedEndClass1InAssociation); |
| assertNull(diffs.addOwnedEndClass1InAssociation); |
| assertNull(diffs.addMemberEndClass1InAssociation); |
| assertNull(diffs.addRefAssociationInPropertyClass1); |
| assertNull(diffs.addLiteralIntegerInClass1); |
| assertNull(diffs.addUnlimitedNaturalInClass1); |
| assertNull(diffs.addRefTypeInPropertyClass1); |
| } |
| |
| @Test |
| public void testA10MergeLtR2UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| private void checkMergeAddOwnedEnd(Comparison comparison, DiffsOfInterest diffs) { |
| assertEquals(NB_DIFFS - 6, comparison.getDifferences().size()); |
| assertNull(diffs.addOwnedEndClass1InAssociation); |
| assertNull(diffs.addMemberEndClass1InAssociation); |
| assertNull(diffs.addNavigableOwnedEndClass1InAssociation); |
| assertNull(diffs.addRefAssociationInPropertyClass1); |
| assertNull(diffs.addAssociation); |
| assertNull(diffs.addUMLAssociation); |
| } |
| |
| @Test |
| public void testA10MergeLtR2UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeLtR2UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| private void checkMergeDeleteOwnedEnd(Comparison comparison, DiffsOfInterest diffs) { |
| // 7 diffs of interest+ 2 MultiplicityElementChanges |
| assertEquals(NB_DIFFS - 9, comparison.getDifferences().size()); |
| assertNull(diffs.addOwnedEndClass1InAssociation); |
| assertNull(diffs.addMemberEndClass1InAssociation); |
| assertNull(diffs.addRefAssociationInPropertyClass1); |
| assertNull(diffs.addNavigableOwnedEndClass1InAssociation); |
| assertNull(diffs.addLiteralIntegerInClass1); |
| assertNull(diffs.addUnlimitedNaturalInClass1); |
| assertNull(diffs.addRefTypeInPropertyClass1); |
| } |
| |
| @Test |
| public void testA10MergeLtR3UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| private void checkMergeAddMemberEnd(Comparison comparison, DiffsOfInterest diffs) { |
| assertEquals(NB_DIFFS - 6, comparison.getDifferences().size()); |
| assertNull(diffs.addMemberEndClass1InAssociation); |
| assertNull(diffs.addRefAssociationInPropertyClass1); |
| assertNull(diffs.addOwnedEndClass1InAssociation); |
| assertNull(diffs.addNavigableOwnedEndClass1InAssociation); |
| assertNull(diffs.addAssociation); |
| assertNull(diffs.addUMLAssociation); |
| } |
| |
| @Test |
| public void testA10MergeLtR3UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeLtR3UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL1UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL1UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL1UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL2UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL2UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL2UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL3UseCase() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL3UseCase3way1() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA10MergeRtL3UseCase3way2() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.ADD); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.ADD); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| testAB1(TestKind.DELETE, comparison); |
| } |
| |
| @Test |
| // local DELETE |
| public void testA11UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| testAB1(TestKind.DELETE, comparison); |
| } |
| |
| @Test |
| // remote DELETE |
| public void testA11UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| testAB1(TestKind.DELETE, comparison); |
| } |
| |
| @Test |
| public void testA11MergeLtR1UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR1UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR1UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyLeftToRight(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR2UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR2UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR2UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyLeftToRight( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR3UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR3UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeLtR3UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyLeftToRight( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL1UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL1UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL1UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addNavigableOwnedEndClass1InAssociation) |
| .copyRightToLeft(diffs.addNavigableOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteNavigableOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL2UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL2UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL2UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addOwnedEndClass1InAssociation).copyRightToLeft( |
| diffs.addOwnedEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL3UseCase() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL3UseCase3way1() throws IOException { |
| final Resource left = input.getA1Right(); |
| final Resource right = input.getA1Left(); |
| |
| Comparison comparison = compare(left, right, right); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeAddMemberEnd(comparison, diffs); |
| } |
| |
| @Test |
| public void testA11MergeRtL3UseCase3way2() throws IOException { |
| final Resource left = input.getA1Left(); |
| final Resource right = input.getA1Right(); |
| |
| Comparison comparison = compare(left, right, left); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| // ** MERGE ** |
| getMergerRegistry().getHighestRankingMerger(diffs.addMemberEndClass1InAssociation).copyRightToLeft( |
| diffs.addMemberEndClass1InAssociation, new BasicMonitor()); |
| |
| comparison = compare(left, right); |
| diffs = getDiffs(comparison, TestKind.DELETE); |
| |
| checkMergeDeleteOwnedEnd(comparison, diffs); |
| } |
| |
| private void testAB1(TestKind kind, final Comparison comparison) { |
| final List<Diff> differences = comparison.getDifferences(); |
| |
| // We should have no less and no more than 16 differences |
| assertEquals(NB_DIFFS, differences.size()); |
| |
| DiffsOfInterest diffs = getDiffs(comparison, kind); |
| |
| if (kind.equals(TestKind.DELETE)) { |
| assertEquals(0, diffs.addNavigableOwnedEndClass1InAssociation.getImplies().size()); |
| assertEquals(1, diffs.addNavigableOwnedEndClass1InAssociation.getImpliedBy().size()); |
| assertTrue(diffs.addNavigableOwnedEndClass1InAssociation.getImpliedBy().contains( |
| diffs.addOwnedEndClass1InAssociation)); |
| |
| assertEquals(1, diffs.addOwnedEndClass1InAssociation.getImplies().size()); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImplies().contains( |
| diffs.addNavigableOwnedEndClass1InAssociation)); |
| assertEquals(2, diffs.addOwnedEndClass1InAssociation.getImpliedBy().size()); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImpliedBy().contains( |
| diffs.addMemberEndClass1InAssociation)); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImpliedBy().contains( |
| diffs.addRefAssociationInPropertyClass1)); |
| |
| assertEquals(1, diffs.addMemberEndClass1InAssociation.getImplies().size()); |
| assertTrue(diffs.addMemberEndClass1InAssociation.getImplies().contains( |
| diffs.addOwnedEndClass1InAssociation)); |
| assertEquals(0, diffs.addMemberEndClass1InAssociation.getImpliedBy().size()); |
| } else { |
| assertEquals(1, diffs.addNavigableOwnedEndClass1InAssociation.getImplies().size()); |
| assertTrue(diffs.addNavigableOwnedEndClass1InAssociation.getImplies().contains( |
| diffs.addOwnedEndClass1InAssociation)); |
| assertEquals(0, diffs.addNavigableOwnedEndClass1InAssociation.getImpliedBy().size()); |
| |
| assertEquals(2, diffs.addOwnedEndClass1InAssociation.getImplies().size()); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImplies().contains( |
| diffs.addMemberEndClass1InAssociation)); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImplies().contains( |
| diffs.addRefAssociationInPropertyClass1)); |
| assertEquals(1, diffs.addOwnedEndClass1InAssociation.getImpliedBy().size()); |
| assertTrue(diffs.addOwnedEndClass1InAssociation.getImpliedBy().contains( |
| diffs.addNavigableOwnedEndClass1InAssociation)); |
| |
| assertEquals(0, diffs.addMemberEndClass1InAssociation.getImplies().size()); |
| assertEquals(1, diffs.addMemberEndClass1InAssociation.getImpliedBy().size()); |
| assertTrue(diffs.addMemberEndClass1InAssociation.getImpliedBy().contains( |
| diffs.addOwnedEndClass1InAssociation)); |
| } |
| |
| } |
| |
| @Override |
| protected AbstractUMLInputData getInput() { |
| return input; |
| } |
| |
| private static Predicate<? super Diff> addedLowerValueIn(final String qualifiedName) { |
| return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("lowerValue"), |
| refinesMultiplicityElementChange()); |
| } |
| |
| private static Predicate<? super Diff> addedUpperValueIn(final String qualifiedName) { |
| return and(ofKind(DifferenceKind.ADD), onEObject(qualifiedName), onFeature("upperValue"), |
| refinesMultiplicityElementChange()); |
| } |
| |
| private static Predicate<? super Diff> removedLowerValueIn(final String qualifiedName) { |
| return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("lowerValue"), |
| refinesMultiplicityElementChange()); |
| } |
| |
| private static Predicate<? super Diff> removedUpperValueIn(final String qualifiedName) { |
| return and(ofKind(DifferenceKind.DELETE), onEObject(qualifiedName), onFeature("upperValue"), |
| refinesMultiplicityElementChange()); |
| } |
| |
| private static Predicate<? super Diff> refinesMultiplicityElementChange() { |
| return new Predicate<Diff>() { |
| public boolean apply(Diff input) { |
| return Iterators.any(input.getRefines().iterator(), instanceOf( |
| MultiplicityElementChange.class)); |
| } |
| }; |
| } |
| |
| private class DiffsOfInterest { |
| public Diff addAssociation; |
| |
| public Diff addNavigableOwnedEndClass1InAssociation; |
| |
| public Diff addNavigableOwnedEndClass2InAssociation; |
| |
| public Diff addMemberEndClass1InAssociation; |
| |
| public Diff addMemberEndClass2InAssociation; |
| |
| public Diff addOwnedEndClass1InAssociation; |
| |
| public Diff addOwnedEndClass2InAssociation; |
| |
| public Diff addRefAssociationInPropertyClass1; |
| |
| public Diff addRefTypeInPropertyClass1; |
| |
| public Diff addRefAssociationInPropertyClass2; |
| |
| public Diff addRefTypeInPropertyClass2; |
| |
| public Diff addLiteralIntegerInClass1; |
| |
| public Diff addUnlimitedNaturalInClass1; |
| |
| public Diff addLiteralIntegerInClass2; |
| |
| public Diff addUnlimitedNaturalInClass2; |
| |
| public Diff addUMLAssociation; |
| } |
| } |