diff options
4 files changed, 110 insertions, 4 deletions
diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/conflict/ConflictSearchTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/conflict/ConflictSearchTest.java new file mode 100644 index 000000000..7e5be3e6b --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/conflict/ConflictSearchTest.java @@ -0,0 +1,94 @@ +package org.eclipse.emf.compare.tests.conflict; + +import static java.util.Arrays.asList; +import static org.eclipse.emf.compare.ConflictKind.REAL; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.eclipse.emf.common.util.BasicMonitor; +import org.eclipse.emf.compare.CompareFactory; +import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.Conflict; +import org.eclipse.emf.compare.ConflictKind; +import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.Equivalence; +import org.eclipse.emf.compare.Match; +import org.eclipse.emf.compare.internal.conflict.AbstractConflictSearch; +import org.eclipse.emf.compare.internal.conflict.ComparisonIndex; +import org.junit.Before; +import org.junit.Test; + +public class ConflictSearchTest { + + private Diff diff; + + private Match match; + + private Comparison comparison; + + private ComparisonIndex index; + + private Diff other; + + private Diff equivToDiff; + + private Diff equivToOther; + + private Equivalence equivDiff; + + private Equivalence equivOther; + + /** + * @see <a href="http://eclip.se/510704">Bug 510704</a> + */ + @Test + public void testEquivalentDiffsAreInSameConflict() { + // Given + TestConflictSearch search = new TestConflictSearch(diff, index); + // When + search.conflict(other, REAL); + // then + assertEquals(1, comparison.getConflicts().size()); + Conflict conflict = comparison.getConflicts().get(0); + assertEquals(4, conflict.getDifferences().size()); + assertTrue(conflict.getDifferences().containsAll(asList(diff, equivToDiff, other, equivToOther))); + } + + @Before + public void setUp() throws Exception { + comparison = CompareFactory.eINSTANCE.createComparison(); + match = CompareFactory.eINSTANCE.createMatch(); + comparison.getMatches().add(match); + diff = CompareFactory.eINSTANCE.createDiff(); + diff.setMatch(match); + other = CompareFactory.eINSTANCE.createDiff(); + other.setMatch(match); + equivToDiff = CompareFactory.eINSTANCE.createDiff(); + equivToDiff.setMatch(match); + equivToOther = CompareFactory.eINSTANCE.createDiff(); + equivToOther.setMatch(match); + equivDiff = CompareFactory.eINSTANCE.createEquivalence(); + equivOther = CompareFactory.eINSTANCE.createEquivalence(); + equivDiff.getDifferences().addAll(asList(diff, equivToDiff)); + equivOther.getDifferences().addAll(asList(other, equivToOther)); + index = ComparisonIndex.index(comparison, new BasicMonitor()); + } + + public static final class TestConflictSearch extends AbstractConflictSearch<Diff> { + + public TestConflictSearch(Diff diff, ComparisonIndex index) { + super(diff, index, new BasicMonitor()); + } + + @Override + public void detectConflicts() { + // Nothing to do + } + + @Override + public void conflict(Diff other, ConflictKind kind) { + super.conflict(other, kind); + } + + } +} 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 69b2cd077..a69af8112 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 @@ -17,6 +17,7 @@ package org.eclipse.emf.compare.tests.suite; import org.eclipse.emf.compare.ComparePackage; import org.eclipse.emf.compare.tests.command.CommandStackTestSuite; import org.eclipse.emf.compare.tests.conflict.ConflictDetectionTest; +import org.eclipse.emf.compare.tests.conflict.ConflictSearchTest; import org.eclipse.emf.compare.tests.conflict.MultiLineAttributeConflictDetectionTest; import org.eclipse.emf.compare.tests.conflict.PseudoConflictDetectionTest; import org.eclipse.emf.compare.tests.conflict.data.bug484557.Bug484557ConflictTest; @@ -106,8 +107,8 @@ import junit.textui.TestRunner; Bug485266_MoveDeleteConflict_Test.class, ResourceAttachmentChangeBug492261.class, RankedAdapterFactoryRegistryTest.class, ComparisonScopeAdapterTest.class, EMFComparePredicatesTest.class, ImplicationsMergeTest.class, GraphTest.class, - ConflictImplicationsTest_Bug484579.class, PseudoConflictDetectionTest.class, - ComplexMergeTest.class, }) + ConflictImplicationsTest_Bug484579.class, PseudoConflictDetectionTest.class, ComplexMergeTest.class, + ConflictSearchTest.class, }) public class AllTests { /** * Standalone launcher for all of compare's tests. diff --git a/plugins/org.eclipse.emf.compare/META-INF/MANIFEST.MF b/plugins/org.eclipse.emf.compare/META-INF/MANIFEST.MF index 941bdaaad..890f6fd4a 100644 --- a/plugins/org.eclipse.emf.compare/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.emf.compare/META-INF/MANIFEST.MF @@ -14,6 +14,7 @@ Export-Package: org.eclipse.emf.compare, org.eclipse.emf.compare.graph, org.eclipse.emf.compare.impl, org.eclipse.emf.compare.internal;x-friends:="org.eclipse.emf.compare.logical,org.eclipse.emf.compare.ide,org.eclipse.emf.compare.edit", + org.eclipse.emf.compare.internal.conflict;x-internal:=true, org.eclipse.emf.compare.internal.dmp;x-friends:="org.eclipse.emf.compare.ide.ui", org.eclipse.emf.compare.internal.merge;x-friends:="org.eclipse.emf.compare.ide.ui,org.eclipse.emf.compare.rcp.ui,org.eclipse.emf.compare.edit", org.eclipse.emf.compare.internal.postprocessor.factories;x-internal:=true, diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/conflict/AbstractConflictSearch.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/conflict/AbstractConflictSearch.java index 4adecb1b2..90592af95 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/conflict/AbstractConflictSearch.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/internal/conflict/AbstractConflictSearch.java @@ -13,13 +13,16 @@ package org.eclipse.emf.compare.internal.conflict; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; +import static com.google.common.collect.Sets.newLinkedHashSet; import static org.eclipse.emf.compare.ConflictKind.PSEUDO; import static org.eclipse.emf.compare.ConflictKind.REAL; import com.google.common.base.Predicate; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.util.List; +import java.util.Set; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.Monitor; @@ -307,8 +310,15 @@ public abstract class AbstractConflictSearch<T extends Diff> { toBeMerged.getDifferences().clear(); } - conflict.getDifferences().add(diff); - conflict.getDifferences().add(other); + Set<Diff> toAdd = newLinkedHashSet(); + for (Diff conflicting : ImmutableSet.of(diff, other)) { + if (conflicting.getEquivalence() == null) { + toAdd.add(conflicting); + } else { + toAdd.addAll(conflicting.getEquivalence().getDifferences()); + } + } + conflict.getDifferences().addAll(toAdd); } /** |