From 118b62be3c4744c47df68aedfb3bc29696c92f78 Mon Sep 17 00:00:00 2001 From: Mathieu Cartaud Date: Mon, 25 Apr 2016 14:42:37 +0200 Subject: [492261] Merge ResourceAttChange in the right resource Add test to make sure that diffs linked to a merged RAC are now created in the right resource Bug: 492261 Change-Id: I4de6c63d16add447241c891a22e46c224f819cd3 Signed-off-by: Mathieu Cartaud --- .../ResourceAttachmentChangeBug492261.java | 247 +++++++++++++++++++++ .../fragmentation/data/FragmentationInputData.java | 18 ++ .../ancestor/control/origin.nodes | 7 + .../ancestor/uncontrol/fragment.nodes | 4 + .../ancestor/uncontrol/origin.nodes | 10 + .../data/rootelementimplication/left/origin.nodes | 7 + .../rootelementimplication/right/fragment.nodes | 4 + .../data/rootelementimplication/right/origin.nodes | 4 + .../eclipse/emf/compare/tests/suite/AllTests.java | 3 +- 9 files changed, 303 insertions(+), 1 deletion(-) create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/ResourceAttachmentChangeBug492261.java create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/control/origin.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/fragment.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/origin.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/left/origin.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/fragment.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/origin.nodes (limited to 'plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare') diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/ResourceAttachmentChangeBug492261.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/ResourceAttachmentChangeBug492261.java new file mode 100644 index 000000000..b3ee01c19 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/ResourceAttachmentChangeBug492261.java @@ -0,0 +1,247 @@ +/** + * Copyright (c) 2016 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.tests.fragmentation; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import com.google.common.base.Predicates; +import com.google.common.collect.Collections2; + +import java.io.IOException; +import java.util.Collection; +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.DifferenceState; +import org.eclipse.emf.compare.EMFCompare; +import org.eclipse.emf.compare.ReferenceChange; +import org.eclipse.emf.compare.ResourceAttachmentChange; +import org.eclipse.emf.compare.merge.IMerger; +import org.eclipse.emf.compare.scope.DefaultComparisonScope; +import org.eclipse.emf.compare.scope.IComparisonScope; +import org.eclipse.emf.compare.tests.fragmentation.data.FragmentationInputData; +import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.resource.ResourceSet; +import org.eclipse.emf.ecore.util.EcoreUtil; +import org.junit.Test; + +public class ResourceAttachmentChangeBug492261 { + + private final FragmentationInputData input = new FragmentationInputData(); + + private final IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance(); + + @Test + public void testUncontrolRootResourceImplication_1() throws IOException { + final Resource left = input.getRootElementImplicationLeft(); + final Resource origin = input.getRootElementImplicationUncontrolOrigin(); + final Resource right = input.getRootElementImplicationRight(); + + final ResourceSet leftSet = left.getResourceSet(); + final ResourceSet originSet = origin.getResourceSet(); + final ResourceSet rightSet = right.getResourceSet(); + + assertNotNull(leftSet); + assertNotNull(originSet); + assertNotNull(rightSet); + + EcoreUtil.resolveAll(leftSet); + EcoreUtil.resolveAll(originSet); + EcoreUtil.resolveAll(rightSet); + + assertEquals(1, leftSet.getResources().size()); + assertEquals(2, originSet.getResources().size()); + assertEquals(2, rightSet.getResources().size()); + + mergeUncontrolDiffsAndAssertResult(leftSet, originSet, rightSet, true); + } + + @Test + public void testUncontrolRootResourceImplication_2() throws IOException { + final Resource left = input.getRootElementImplicationRight(); + final Resource origin = input.getRootElementImplicationUncontrolOrigin(); + final Resource right = input.getRootElementImplicationLeft(); + + final ResourceSet leftSet = left.getResourceSet(); + final ResourceSet originSet = origin.getResourceSet(); + final ResourceSet rightSet = right.getResourceSet(); + + assertNotNull(leftSet); + assertNotNull(originSet); + assertNotNull(rightSet); + + EcoreUtil.resolveAll(leftSet); + EcoreUtil.resolveAll(originSet); + EcoreUtil.resolveAll(rightSet); + + assertEquals(2, leftSet.getResources().size()); + assertEquals(2, originSet.getResources().size()); + assertEquals(1, rightSet.getResources().size()); + + mergeUncontrolDiffsAndAssertResult(leftSet, originSet, rightSet, false); + } + + @Test + public void testControlRootResourceImplication_1() throws IOException { + final Resource left = input.getRootElementImplicationLeft(); + final Resource origin = input.getRootElementImplicationControlOrigin(); + final Resource right = input.getRootElementImplicationRight(); + + final ResourceSet leftSet = left.getResourceSet(); + final ResourceSet originSet = origin.getResourceSet(); + final ResourceSet rightSet = right.getResourceSet(); + + assertNotNull(leftSet); + assertNotNull(originSet); + assertNotNull(rightSet); + + EcoreUtil.resolveAll(leftSet); + EcoreUtil.resolveAll(originSet); + EcoreUtil.resolveAll(rightSet); + + assertEquals(1, leftSet.getResources().size()); + assertEquals(1, originSet.getResources().size()); + assertEquals(2, rightSet.getResources().size()); + + mergeControlDiffsAndAssertResult(leftSet, originSet, rightSet, false); + } + + @Test + public void testControlRootResourceImplication_2() throws IOException { + final Resource left = input.getRootElementImplicationRight(); + final Resource origin = input.getRootElementImplicationControlOrigin(); + final Resource right = input.getRootElementImplicationLeft(); + + final ResourceSet leftSet = left.getResourceSet(); + final ResourceSet originSet = origin.getResourceSet(); + final ResourceSet rightSet = right.getResourceSet(); + + assertNotNull(leftSet); + assertNotNull(originSet); + assertNotNull(rightSet); + + EcoreUtil.resolveAll(leftSet); + EcoreUtil.resolveAll(originSet); + EcoreUtil.resolveAll(rightSet); + + assertEquals(2, leftSet.getResources().size()); + assertEquals(1, originSet.getResources().size()); + assertEquals(1, rightSet.getResources().size()); + + mergeControlDiffsAndAssertResult(leftSet, originSet, rightSet, true); + } + + private void mergeUncontrolDiffsAndAssertResult(final ResourceSet leftSet, final ResourceSet originSet, + final ResourceSet rightSet, boolean fragmentedOnLeft) { + final IComparisonScope scope = new DefaultComparisonScope(leftSet, rightSet, originSet); + Comparison comparison = EMFCompare.builder().build().compare(scope); + + final List differences = comparison.getDifferences(); + + Collection racFilter = Collections2.filter(differences, Predicates + .instanceOf(ResourceAttachmentChange.class)); + Collection rcFilter = Collections2.filter(differences, Predicates + .instanceOf(ReferenceChange.class)); + assertEquals(1, racFilter.size()); + assertEquals(2, rcFilter.size()); + Diff rac = racFilter.iterator().next(); + Diff container = null; + Diff innerNode = null; + for (Diff diff : rcFilter) { + if (fragmentedOnLeft && diff.getMatch().getLeft() == null) { + innerNode = diff; + } else if (!fragmentedOnLeft && diff.getMatch().getRight() == null) { + innerNode = diff; + } else { + container = diff; + } + } + + assertNotNull(container); + assertNotNull(innerNode); + + if (fragmentedOnLeft) { + mergerRegistry.getHighestRankingMerger(rac).copyRightToLeft(rac, new BasicMonitor()); + } else { + mergerRegistry.getHighestRankingMerger(rac).copyLeftToRight(rac, new BasicMonitor()); + } + assertEquals(DifferenceState.MERGED, rac.getState()); + assertEquals(DifferenceState.MERGED, container.getState()); + assertEquals(DifferenceState.UNRESOLVED, innerNode.getState()); + + if (fragmentedOnLeft) { + mergerRegistry.getHighestRankingMerger(innerNode).copyRightToLeft(innerNode, new BasicMonitor()); + } else { + mergerRegistry.getHighestRankingMerger(innerNode).copyLeftToRight(innerNode, new BasicMonitor()); + } + assertEquals(DifferenceState.MERGED, rac.getState()); + assertEquals(DifferenceState.MERGED, container.getState()); + assertEquals(DifferenceState.MERGED, innerNode.getState()); + + comparison = EMFCompare.builder().build().compare(scope); + assertEquals(0, comparison.getDifferences().size()); + } + + private void mergeControlDiffsAndAssertResult(final ResourceSet leftSet, final ResourceSet originSet, + final ResourceSet rightSet, boolean fragmentedOnLeft) { + final IComparisonScope scope = new DefaultComparisonScope(leftSet, rightSet, originSet); + Comparison comparison = EMFCompare.builder().build().compare(scope); + + final List differences = comparison.getDifferences(); + + Collection racFilter = Collections2.filter(differences, Predicates + .instanceOf(ResourceAttachmentChange.class)); + Collection rcFilter = Collections2.filter(differences, Predicates + .instanceOf(ReferenceChange.class)); + assertEquals(1, racFilter.size()); + assertEquals(2, rcFilter.size()); + Diff rac = racFilter.iterator().next(); + Diff container = null; + Diff innerNode = null; + for (Diff diff : rcFilter) { + if (fragmentedOnLeft && diff.getMatch().getRight() == null) { + innerNode = diff; + } else if (!fragmentedOnLeft && diff.getMatch().getLeft() == null) { + innerNode = diff; + } else { + container = diff; + } + } + + assertNotNull(container); + assertNotNull(innerNode); + + if (fragmentedOnLeft) { + mergerRegistry.getHighestRankingMerger(rac).copyRightToLeft(rac, new BasicMonitor()); + } else { + mergerRegistry.getHighestRankingMerger(rac).copyLeftToRight(rac, new BasicMonitor()); + } + assertEquals(DifferenceState.MERGED, rac.getState()); + assertEquals(DifferenceState.UNRESOLVED, container.getState()); + assertEquals(DifferenceState.UNRESOLVED, innerNode.getState()); + + if (fragmentedOnLeft) { + mergerRegistry.getHighestRankingMerger(container).copyRightToLeft(container, new BasicMonitor()); + } else { + mergerRegistry.getHighestRankingMerger(container).copyLeftToRight(container, new BasicMonitor()); + } + assertEquals(DifferenceState.MERGED, rac.getState()); + assertEquals(DifferenceState.MERGED, container.getState()); + assertEquals(DifferenceState.MERGED, innerNode.getState()); + + comparison = EMFCompare.builder().build().compare(scope); + assertEquals(0, comparison.getDifferences().size()); + } + +} diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/FragmentationInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/FragmentationInputData.java index 7d2f3eb7d..a32d37334 100644 --- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/FragmentationInputData.java +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/FragmentationInputData.java @@ -78,4 +78,22 @@ public class FragmentationInputData extends AbstractInputData { public Resource getNewRootRight() throws IOException { return loadFromClassLoader("newroot/right.nodes", new ResourceSetImpl()); } + + public Resource getRootElementImplicationLeft() throws IOException { + return loadFromClassLoader("rootelementimplication/left/origin.nodes", new ResourceSetImpl()); + } + + public Resource getRootElementImplicationUncontrolOrigin() throws IOException { + return loadFromClassLoader("rootelementimplication/ancestor/uncontrol/origin.nodes", + new ResourceSetImpl()); + } + + public Resource getRootElementImplicationControlOrigin() throws IOException { + return loadFromClassLoader("rootelementimplication/ancestor/control/origin.nodes", + new ResourceSetImpl()); + } + + public Resource getRootElementImplicationRight() throws IOException { + return loadFromClassLoader("rootelementimplication/right/origin.nodes", new ResourceSetImpl()); + } } diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/control/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/control/origin.nodes new file mode 100644 index 000000000..3c737e8e0 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/control/origin.nodes @@ -0,0 +1,7 @@ + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/fragment.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/fragment.nodes new file mode 100644 index 000000000..0eba84fee --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/fragment.nodes @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/origin.nodes new file mode 100644 index 000000000..7192229e8 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/ancestor/uncontrol/origin.nodes @@ -0,0 +1,10 @@ + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/left/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/left/origin.nodes new file mode 100644 index 000000000..3c737e8e0 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/left/origin.nodes @@ -0,0 +1,7 @@ + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/fragment.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/fragment.nodes new file mode 100644 index 000000000..0eba84fee --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/fragment.nodes @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/origin.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/origin.nodes new file mode 100644 index 000000000..b75ab1666 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/fragmentation/data/rootelementimplication/right/origin.nodes @@ -0,0 +1,4 @@ + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java index 11b6cad45..749e98933 100644 --- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/suite/AllTests.java @@ -32,6 +32,7 @@ import org.eclipse.emf.compare.tests.diff.URIDistanceTest; import org.eclipse.emf.compare.tests.edit.AllEditTests; import org.eclipse.emf.compare.tests.equi.EquiComputingTest; import org.eclipse.emf.compare.tests.fragmentation.FragmentationTest; +import org.eclipse.emf.compare.tests.fragmentation.ResourceAttachmentChangeBug492261; import org.eclipse.emf.compare.tests.fullcomparison.DynamicInstanceComparisonTest; import org.eclipse.emf.compare.tests.fullcomparison.ExtLibraryTest; import org.eclipse.emf.compare.tests.fullcomparison.IdentifierComparisonTest; @@ -93,7 +94,7 @@ import org.junit.runners.Suite.SuiteClasses; MultiLineAttributeConflictDetectionTest.class, ThreeWayTextDiffTest.class, MultiLineAttributeMergeTest.class, MonitorCancelTest.class, IdentifierEObjectMatcherTest.class, MatchUtilFeatureContainsTest.class, RefineMergeTest.class, Bug484557ConflictTest.class, - Bug485266_MoveDeleteConflict_Test.class }) + Bug485266_MoveDeleteConflict_Test.class, ResourceAttachmentChangeBug492261.class }) public class AllTests { /** * Standalone launcher for all of compare's tests. -- cgit v1.2.3