From f329adf95051fb11b3ca322a7fc8363cd6561c1a Mon Sep 17 00:00:00 2001 From: Mikaƫl Barbero Date: Mon, 27 Aug 2012 15:13:51 +0200 Subject: fix getContainer() as revealed by added test -- was using the match of the Diff#getValue (can be null if the value is out of scope) --- .../emf/compare/tests/req/ReqComputingTest.java | 71 +++++++++++++++++----- .../emf/compare/tests/req/data/ReqInputData.java | 7 +++ .../emf/compare/tests/req/data/g1/left.nodes | 13 ++++ .../emf/compare/tests/req/data/g1/others.nodes | 14 +++++ .../emf/compare/tests/req/data/g1/right.nodes | 7 +++ .../org/eclipse/emf/compare/utils/MatchUtil.java | 20 +++--- 6 files changed, 106 insertions(+), 26 deletions(-) create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/left.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/others.nodes create mode 100644 plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/right.nodes diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/ReqComputingTest.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/ReqComputingTest.java index aa40e1b33..57e84d0af 100644 --- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/ReqComputingTest.java +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/ReqComputingTest.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.emf.compare.tests.req; +import static com.google.common.collect.Iterables.filter; +import static com.google.common.collect.Iterables.getOnlyElement; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertSame; import static org.eclipse.emf.compare.utils.EMFComparePredicates.added; @@ -26,9 +28,12 @@ import com.google.common.collect.Iterators; import java.io.IOException; import java.util.List; +import org.eclipse.emf.common.notify.Notifier; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.EMFCompare; +import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.tests.req.data.ReqInputData; import org.eclipse.emf.ecore.resource.Resource; import org.junit.Test; @@ -551,7 +556,41 @@ public class ReqComputingTest { testCD5(TestKind.ADD, comparison); } - private static void testAB1(TestKind kind, final Comparison comparison) { + @Test + public void testG1UseCase() throws IOException { + final Resource left = input.getG1Left(); + final Resource right = input.getG1Right(); + + final Comparison comparison = EMFCompare.compare(left, right, (Notifier)null); + String root = "root"; + String node1 = root + ".node1"; + String node2 = node1 + ".node2"; + + EList differences = comparison.getDifferences(); + + assertSame(3, differences.size()); + Diff added1 = getOnlyElement(filter(differences, added(node1)), null); + assertNotNull(added1); + Diff added2 = getOnlyElement(filter(differences, added(node2)), null); + assertNotNull(added2); + + ReferenceChange singleChange = null; + for (ReferenceChange change : filter(differences, ReferenceChange.class)) { + if ("singleValuedReference".equals(change.getReference().getName())) { + singleChange = change; + break; + } + } + assertNotNull(singleChange); + assertTrue(singleChange.getValue().eIsProxy()); + assertSame(0, added1.getRequires().size()); + assertSame(1, added2.getRequires().size()); + assertTrue(added2.getRequires().contains(added1)); + assertSame(1, singleChange.getRequires().size()); + assertTrue(singleChange.getRequires().contains(added2)); + } + + private void testAB1(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 3 differences @@ -607,7 +646,7 @@ public class ReqComputingTest { } } - private static void testAB2(TestKind kind, final Comparison comparison) { + private void testAB2(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 3 differences @@ -660,7 +699,7 @@ public class ReqComputingTest { } } - private static void testAB3(TestKind kind, final Comparison comparison) { + private void testAB3(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 2 differences @@ -703,7 +742,7 @@ public class ReqComputingTest { } } - private static void testAB4(TestKind kind, final Comparison comparison) { + private void testAB4(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 3 differences @@ -759,7 +798,7 @@ public class ReqComputingTest { } - private static void testAB5(TestKind kind, final Comparison comparison) { + private void testAB5(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 8 differences @@ -869,7 +908,7 @@ public class ReqComputingTest { } - private static void testAB6(TestKind kind, final Comparison comparison) { + private void testAB6(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 7 differences @@ -970,7 +1009,7 @@ public class ReqComputingTest { } - private static void testAB7(TestKind kind, final Comparison comparison) { + private void testAB7(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 4 differences @@ -1026,7 +1065,7 @@ public class ReqComputingTest { } - private static void testAB8(TestKind kind, final Comparison comparison) { + private void testAB8(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 7 differences @@ -1119,7 +1158,7 @@ public class ReqComputingTest { } - private static void testAB9(TestKind kind, final Comparison comparison) { + private void testAB9(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 2 differences @@ -1157,7 +1196,7 @@ public class ReqComputingTest { } - private static void testAB10(TestKind kind, final Comparison comparison) { + private void testAB10(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 4 differences @@ -1218,7 +1257,7 @@ public class ReqComputingTest { } - private static void testAB11(TestKind kind, final Comparison comparison) { + private void testAB11(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 4 differences @@ -1276,7 +1315,7 @@ public class ReqComputingTest { } - private static void testCD1(TestKind kind, final Comparison comparison) { + private void testCD1(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 5 differences @@ -1351,7 +1390,7 @@ public class ReqComputingTest { } - private static void testCD2(TestKind kind, final Comparison comparison) { + private void testCD2(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 5 differences @@ -1415,7 +1454,7 @@ public class ReqComputingTest { } - private static void testCD3(TestKind kind, final Comparison comparison) { + private void testCD3(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 5 differences @@ -1477,7 +1516,7 @@ public class ReqComputingTest { } - private static void testCD4(TestKind kind, final Comparison comparison) { + private void testCD4(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 5 differences @@ -1528,7 +1567,7 @@ public class ReqComputingTest { } - private static void testCD5(TestKind kind, final Comparison comparison) { + private void testCD5(TestKind kind, final Comparison comparison) { final List differences = comparison.getDifferences(); // We should have no less and no more than 2 differences diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/ReqInputData.java b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/ReqInputData.java index e5df381fe..09423094b 100644 --- a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/ReqInputData.java +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/ReqInputData.java @@ -408,4 +408,11 @@ public class ReqInputData extends AbstractInputData { return loadFromClassloader("f11/ancestor.nodes"); //$NON-NLS-1$ } + public Resource getG1Left() throws IOException { + return loadFromClassloader("g1/left.nodes"); //$NON-NLS-1$ + } + + public Resource getG1Right() throws IOException { + return loadFromClassloader("g1/right.nodes"); //$NON-NLS-1$ + } } diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/left.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/left.nodes new file mode 100644 index 000000000..78522bbbe --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/left.nodes @@ -0,0 +1,13 @@ + + + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/others.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/others.nodes new file mode 100644 index 000000000..46c16c93b --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/others.nodes @@ -0,0 +1,14 @@ + + + + + + diff --git a/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/right.nodes b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/right.nodes new file mode 100644 index 000000000..df723ff25 --- /dev/null +++ b/plugins/org.eclipse.emf.compare.tests/src/org/eclipse/emf/compare/tests/req/data/g1/right.nodes @@ -0,0 +1,7 @@ + + diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java index 6ecf032f2..e0fc132ba 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/utils/MatchUtil.java @@ -10,6 +10,8 @@ *******************************************************************************/ package org.eclipse.emf.compare.utils; +import static org.eclipse.emf.compare.utils.ReferenceUtil.getAsList; + import org.eclipse.emf.compare.AttributeChange; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; @@ -114,16 +116,14 @@ public final class MatchUtil { */ public static EObject getContainer(Comparison comparison, ReferenceChange difference) { EObject result = null; - final EObject obj = difference.getValue(); - Match valueMatch = comparison.getMatch(obj); - if (valueMatch != null) { - if (valueMatch.getLeft() == obj) { - result = difference.getMatch().getLeft(); - } else if (valueMatch.getRight() == obj) { - result = difference.getMatch().getRight(); - } else if (valueMatch.getOrigin() == obj) { - result = difference.getMatch().getOrigin(); - } + final EObject value = difference.getValue(); + Match match = difference.getMatch(); + if (getAsList(match.getLeft(), difference.getReference()).contains(value)) { + result = match.getLeft(); + } else if (getAsList(match.getRight(), difference.getReference()).contains(value)) { + result = match.getRight(); + } else if (getAsList(match.getOrigin(), difference.getReference()).contains(value)) { + result = match.getOrigin(); } return result; } -- cgit v1.2.3