/*******************************************************************************
* Copyright (c) 2012, 2014 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
* Stefan Dirix - added test for bug 455255
*******************************************************************************/
package org.eclipse.emf.compare.tests.merge;
import static com.google.common.base.Predicates.and;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.addedToAttribute;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.addedToReference;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedAttribute;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedReference;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.moved;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.movedInAttribute;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.movedInReference;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.removedFromAttribute;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.removedFromReference;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.util.Collection;
import java.util.Iterator;
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.DifferenceSource;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.Match;
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.merge.data.IndividualDiffInputData;
import org.eclipse.emf.compare.tests.nodes.NodeEnum;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.junit.Test;
@SuppressWarnings("nls")
public class IndividualMergeTest {
private IndividualDiffInputData input = new IndividualDiffInputData();
private final IMerger.Registry mergerRegistry = IMerger.RegistryImpl.createStandaloneInstance();
@Test
public void testAttributeMonoChange2WayLtR() throws IOException {
final Resource left = input.getAttributeMonoChangeLeft();
final Resource right = input.getAttributeMonoChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoChange2WayRtL() throws IOException {
final Resource left = input.getAttributeMonoChangeLeft();
final Resource right = input.getAttributeMonoChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoChange3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMonoChangeLeft();
final Resource right = input.getAttributeMonoChangeRight();
final Resource origin = input.getAttributeMonoChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange2WayLtR() throws IOException {
final Resource left = input.getAttributeMonoEEnumChangeLeft();
final Resource right = input.getAttributeMonoEEnumChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.B, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange2WayRtL() throws IOException {
final Resource left = input.getAttributeMonoEEnumChangeLeft();
final Resource right = input.getAttributeMonoEEnumChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.A, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMonoEEnumChangeLeft();
final Resource right = input.getAttributeMonoEEnumChangeRight();
final Resource origin = input.getAttributeMonoEEnumChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.B, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMonoEEnumChangeLeft();
final Resource right = input.getAttributeMonoEEnumChangeRight();
final Resource origin = input.getAttributeMonoEEnumChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.A, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoEEnumChangeRight();
final Resource right = input.getAttributeMonoEEnumChangeLeft();
final Resource origin = input.getAttributeMonoEEnumChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.A, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMonoChange3WayRightChangeRtL() throws IOException {
final Resource left = input.getAttributeMonoEEnumChangeRight();
final Resource right = input.getAttributeMonoEEnumChangeLeft();
final Resource origin = input.getAttributeMonoEEnumChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singlevalueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root", featureName, NodeEnum.A, NodeEnum.B)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals(NodeEnum.B, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoChange3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMonoChangeLeft();
final Resource right = input.getAttributeMonoChangeRight();
final Resource origin = input.getAttributeMonoChangeOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoChange3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoChangeRight();
final Resource right = input.getAttributeMonoChangeLeft();
final Resource origin = input.getAttributeMonoChangeOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoChange3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoChangeRight();
final Resource right = input.getAttributeMonoChangeLeft();
final Resource origin = input.getAttributeMonoChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, "originValue", "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet2WayLtR() throws IOException {
final Resource left = input.getAttributeMonoSetLeft();
final Resource right = input.getAttributeMonoSetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet2WayRtL() throws IOException {
final Resource left = input.getAttributeMonoSetLeft();
final Resource right = input.getAttributeMonoSetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMonoSetLeft();
final Resource right = input.getAttributeMonoSetRight();
final Resource origin = input.getAttributeMonoSetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMonoSetLeft();
final Resource right = input.getAttributeMonoSetRight();
final Resource origin = input.getAttributeMonoSetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoSetRight();
final Resource right = input.getAttributeMonoSetLeft();
final Resource origin = input.getAttributeMonoSetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoSet3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoSetRight();
final Resource right = input.getAttributeMonoSetLeft();
final Resource origin = input.getAttributeMonoSetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, null, "leftValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("leftValue", originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset2WayLtR() throws IOException {
final Resource left = input.getAttributeMonoUnsetLeft();
final Resource right = input.getAttributeMonoUnsetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset2WayRtL() throws IOException {
final Resource left = input.getAttributeMonoUnsetLeft();
final Resource right = input.getAttributeMonoUnsetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMonoUnsetLeft();
final Resource right = input.getAttributeMonoUnsetRight();
final Resource origin = input.getAttributeMonoUnsetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMonoUnsetLeft();
final Resource right = input.getAttributeMonoUnsetRight();
final Resource origin = input.getAttributeMonoUnsetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoUnsetRight();
final Resource right = input.getAttributeMonoUnsetLeft();
final Resource origin = input.getAttributeMonoUnsetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertEquals("originValue", originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMonoUnset3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMonoUnsetRight();
final Resource right = input.getAttributeMonoUnsetLeft();
final Resource origin = input.getAttributeMonoUnsetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedAttribute("root.origin", featureName, "originValue", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd2WayLtR() throws IOException {
final Resource left = input.getAttributeEEnumMultiAddLeft();
final Resource right = input.getAttributeEEnumMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(3, differences.size());
final String featureName = "multiValueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.A)));
final Diff diff2 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.B)));
final Diff diff3 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.C)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff2).copyLeftToRight(diff2, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff3).copyLeftToRight(diff3, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof List<?>);
assertEquals(featureValue, Lists.newArrayList(NodeEnum.A, NodeEnum.B, NodeEnum.C));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd2WayRtL() throws IOException {
final Resource left = input.getAttributeEEnumMultiAddLeft();
final Resource right = input.getAttributeEEnumMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(3, differences.size());
final String featureName = "multiValueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.A)));
final Diff diff2 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.B)));
final Diff diff3 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.C)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff2).copyRightToLeft(diff2, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff3).copyRightToLeft(diff3, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).isEmpty());
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeEEnumMultiAddLeft();
final Resource right = input.getAttributeEEnumMultiAddRight();
final Resource origin = input.getAttributeEEnumMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(3, differences.size());
final String featureName = "multiValueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.A)));
final Diff diff2 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.B)));
final Diff diff3 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.C)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff2).copyLeftToRight(diff2, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff3).copyLeftToRight(diff3, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue)
.containsAll(Lists.newArrayList(NodeEnum.A, NodeEnum.B, NodeEnum.C)));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeEEnumMultiAddLeft();
final Resource right = input.getAttributeEEnumMultiAddRight();
final Resource origin = input.getAttributeEEnumMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(3, differences.size());
final String featureName = "multiValueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.A)));
final Diff diff2 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.B)));
final Diff diff3 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root", featureName, NodeEnum.C)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff2).copyRightToLeft(diff2, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff3).copyRightToLeft(diff3, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).isEmpty());
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd3WayRightChangeLtR() throws IOException {
final Resource left = input.getAttributeEEnumMultiAddRight();
final Resource right = input.getAttributeEEnumMultiAddLeft();
final Resource origin = input.getAttributeEEnumMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(3, differences.size());
final String featureName = "multiValueEEnumAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.RIGHT), addedToAttribute("root", featureName, NodeEnum.A)));
final Diff diff2 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.RIGHT), addedToAttribute("root", featureName, NodeEnum.B)));
final Diff diff3 = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.RIGHT), addedToAttribute("root", featureName, NodeEnum.C)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff2).copyLeftToRight(diff2, new BasicMonitor());
mergerRegistry.getHighestRankingMerger(diff3).copyLeftToRight(diff3, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "root");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).isEmpty());
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeEEnumMultiAdd3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiAddRight();
final Resource right = input.getAttributeMultiAddLeft();
final Resource origin = input.getAttributeMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd2WayLtR() throws IOException {
final Resource left = input.getAttributeMultiAddLeft();
final Resource right = input.getAttributeMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd2WayRtL() throws IOException {
final Resource left = input.getAttributeMultiAddLeft();
final Resource right = input.getAttributeMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMultiAddLeft();
final Resource right = input.getAttributeMultiAddRight();
final Resource origin = input.getAttributeMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMultiAddLeft();
final Resource right = input.getAttributeMultiAddRight();
final Resource origin = input.getAttributeMultiAddOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiAddRight();
final Resource right = input.getAttributeMultiAddLeft();
final Resource origin = input.getAttributeMultiAddOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiAdd3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiAddRight();
final Resource right = input.getAttributeMultiAddLeft();
final Resource origin = input.getAttributeMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
addedToAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel2WayLtR() throws IOException {
final Resource left = input.getAttributeMultiDelLeft();
final Resource right = input.getAttributeMultiDelRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel2WayRtL() throws IOException {
final Resource left = input.getAttributeMultiDelLeft();
final Resource right = input.getAttributeMultiDelRight();
IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMultiDelLeft();
final Resource right = input.getAttributeMultiDelRight();
final Resource origin = input.getAttributeMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMultiDelLeft();
final Resource right = input.getAttributeMultiDelRight();
final Resource origin = input.getAttributeMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiDelRight();
final Resource right = input.getAttributeMultiDelLeft();
final Resource origin = input.getAttributeMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains("value1"));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testAttributeMultiDel3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiDelRight();
final Resource right = input.getAttributeMultiDelLeft();
final Resource origin = input.getAttributeMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
removedFromAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains("value1"));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove2WayLtR() throws IOException {
final Resource left = input.getAttributeMultiMoveLeft();
final Resource right = input.getAttributeMultiMoveRight();
IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(left, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove2WayRtL() throws IOException {
final Resource left = input.getAttributeMultiMoveLeft();
final Resource right = input.getAttributeMultiMoveRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(right, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove3WayLeftChangeLtR() throws IOException {
final Resource left = input.getAttributeMultiMoveLeft();
final Resource right = input.getAttributeMultiMoveRight();
final Resource origin = input.getAttributeMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(left, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove3WayLeftChangeRtL() throws IOException {
final Resource left = input.getAttributeMultiMoveLeft();
final Resource right = input.getAttributeMultiMoveRight();
final Resource origin = input.getAttributeMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(origin, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiMoveRight();
final Resource right = input.getAttributeMultiMoveLeft();
final Resource origin = input.getAttributeMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(origin, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testAttributeMultiMove3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getAttributeMultiMoveRight();
final Resource right = input.getAttributeMultiMoveLeft();
final Resource origin = input.getAttributeMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedAttribute";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
movedInAttribute("root.origin", featureName, "value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(right, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(((List<Object>)targetFeatureValue), ((List<Object>)sourceFeatureValue));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange2WayLtR() throws IOException {
final Resource left = input.getReferenceMonoChangeLeft();
final Resource right = input.getReferenceMonoChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "targetValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange2WayRtL() throws IOException {
final Resource left = input.getReferenceMonoChangeLeft();
final Resource right = input.getReferenceMonoChangeRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "originValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMonoChangeLeft();
final Resource right = input.getReferenceMonoChangeRight();
final Resource origin = input.getReferenceMonoChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "targetValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMonoChangeLeft();
final Resource right = input.getReferenceMonoChangeRight();
final Resource origin = input.getReferenceMonoChangeOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "originValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoChangeRight();
final Resource right = input.getReferenceMonoChangeLeft();
final Resource origin = input.getReferenceMonoChangeOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "originValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoChange3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoChangeRight();
final Resource right = input.getReferenceMonoChangeLeft();
final Resource origin = input.getReferenceMonoChangeOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, "root.originValue", "root.targetValue")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "targetValue");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet2WayLtR() throws IOException {
final Resource left = input.getReferenceMonoSetLeft();
final Resource right = input.getReferenceMonoSetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "left");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet2WayRtL() throws IOException {
final Resource left = input.getReferenceMonoSetLeft();
final Resource right = input.getReferenceMonoSetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMonoSetLeft();
final Resource right = input.getReferenceMonoSetRight();
final Resource origin = input.getReferenceMonoSetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "left");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMonoSetLeft();
final Resource right = input.getReferenceMonoSetRight();
final Resource origin = input.getReferenceMonoSetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoSetRight();
final Resource right = input.getReferenceMonoSetLeft();
final Resource origin = input.getReferenceMonoSetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoSet3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoSetRight();
final Resource right = input.getReferenceMonoSetLeft();
final Resource origin = input.getReferenceMonoSetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, null, "root.left")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "left");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset2WayLtR() throws IOException {
final Resource left = input.getReferenceMonoUnsetLeft();
final Resource right = input.getReferenceMonoUnsetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset2WayRtL() throws IOException {
final Resource left = input.getReferenceMonoUnsetLeft();
final Resource right = input.getReferenceMonoUnsetRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMonoUnsetLeft();
final Resource right = input.getReferenceMonoUnsetRight();
final Resource origin = input.getReferenceMonoUnsetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMonoUnsetLeft();
final Resource right = input.getReferenceMonoUnsetRight();
final Resource origin = input.getReferenceMonoUnsetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoUnsetRight();
final Resource right = input.getReferenceMonoUnsetLeft();
final Resource origin = input.getReferenceMonoUnsetOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertSame(targetNode, originNode.eGet(feature));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMonoUnset3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMonoUnsetRight();
final Resource right = input.getReferenceMonoUnsetLeft();
final Resource origin = input.getReferenceMonoUnsetOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "singleValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
changedReference("root.origin", featureName, "root.target", null)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
assertNull(originNode.eGet(feature));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd2WayLtR() throws IOException {
final Resource left = input.getReferenceMultiAddLeft();
final Resource right = input.getReferenceMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd2WayRtL() throws IOException {
final Resource left = input.getReferenceMultiAddLeft();
final Resource right = input.getReferenceMultiAddRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMultiAddLeft();
final Resource right = input.getReferenceMultiAddRight();
final Resource origin = input.getReferenceMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMultiAddLeft();
final Resource right = input.getReferenceMultiAddRight();
final Resource origin = input.getReferenceMultiAddOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiAddRight();
final Resource right = input.getReferenceMultiAddLeft();
final Resource origin = input.getReferenceMultiAddOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiAdd3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiAddRight();
final Resource right = input.getReferenceMultiAddLeft();
final Resource origin = input.getReferenceMultiAddOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
addedToReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel2WayLtR() throws IOException {
final Resource left = input.getReferenceMultiDelLeft();
final Resource right = input.getReferenceMultiDelRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel2WayRtL() throws IOException {
final Resource left = input.getReferenceMultiDelLeft();
final Resource right = input.getReferenceMultiDelRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMultiDelLeft();
final Resource right = input.getReferenceMultiDelRight();
final Resource origin = input.getReferenceMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMultiDelLeft();
final Resource right = input.getReferenceMultiDelRight();
final Resource origin = input.getReferenceMultiDelOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiDelRight();
final Resource right = input.getReferenceMultiDelLeft();
final Resource origin = input.getReferenceMultiDelOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(right, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(right, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertTrue(((Collection<?>)featureValue).contains(targetNode));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceMultiDel3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiDelRight();
final Resource right = input.getReferenceMultiDelLeft();
final Resource origin = input.getReferenceMultiDelOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
removedFromReference("root.origin", featureName, "root.target")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject originNode = getNodeNamed(left, "origin");
assertNotNull(originNode);
final EObject targetNode = getNodeNamed(left, "target");
assertNotNull(targetNode);
final EStructuralFeature feature = originNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object featureValue = originNode.eGet(feature);
assertTrue(featureValue instanceof Collection<?>);
assertFalse(((Collection<?>)featureValue).contains(targetNode));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove2WayLtR() throws IOException {
final Resource left = input.getReferenceMultiMoveLeft();
final Resource right = input.getReferenceMultiMoveRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(left, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove2WayRtL() throws IOException {
final Resource left = input.getReferenceMultiMoveLeft();
final Resource right = input.getReferenceMultiMoveRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(right, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove3WayLeftChangeLtR() throws IOException {
final Resource left = input.getReferenceMultiMoveLeft();
final Resource right = input.getReferenceMultiMoveRight();
final Resource origin = input.getReferenceMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(left, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove3WayLeftChangeRtL() throws IOException {
final Resource left = input.getReferenceMultiMoveLeft();
final Resource right = input.getReferenceMultiMoveRight();
final Resource origin = input.getReferenceMultiMoveOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.LEFT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(origin, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove3WayRightChangeLtR() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiMoveRight();
final Resource right = input.getReferenceMultiMoveLeft();
final Resource origin = input.getReferenceMultiMoveOrigin();
final IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(origin, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@SuppressWarnings("unchecked")
@Test
public void testReferenceMultiMove3WayRightChangeRtL() throws IOException {
// In order to have changes on the right side, we'll invert right and left
final Resource left = input.getReferenceMultiMoveRight();
final Resource right = input.getReferenceMultiMoveLeft();
final Resource origin = input.getReferenceMultiMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "multiValuedReference";
final Diff diff = Iterators.find(differences.iterator(), and(fromSide(DifferenceSource.RIGHT),
movedInReference("root.origin", featureName, "root.value1")));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(left, "origin");
assertNotNull(targetNode);
final EObject sourceNode = getNodeNamed(right, "origin");
assertNotNull(sourceNode);
final EStructuralFeature feature = targetNode.eClass().getEStructuralFeature(featureName);
assertNotNull(feature);
final Object targetFeatureValue = targetNode.eGet(feature);
final Object sourceFeatureValue = sourceNode.eGet(feature);
assertTrue(targetFeatureValue instanceof List<?>);
assertTrue(sourceFeatureValue instanceof List<?>);
assertEqualContents(comparison, ((List<EObject>)targetFeatureValue),
((List<EObject>)sourceFeatureValue));
// We should have no difference between left and right ... though they might be different from origin
scope = new DefaultComparisonScope(left, right, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceContainmentMultiMove2WayLtR() throws IOException {
final Resource left = input.getReferenceContainmentMultiMoveLeft();
final Resource right = input.getReferenceContainmentMultiMoveRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "containmentRef1";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), moved("root.value2", featureName)));
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "value2");
assertNotNull(targetNode);
final EObject targetContainerNode = getNodeNamed(right, "root");
assertNotNull(targetContainerNode);
assertEquals(targetContainerNode, targetNode.eContainer());
final EObject sourceNode = getNodeNamed(left, "value2");
assertNotNull(sourceNode);
final EObject sourceContainerNode = getNodeNamed(left, "root");
assertNotNull(sourceContainerNode);
assertEquals(sourceContainerNode, sourceNode.eContainer());
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceContainmentMultiMove2WayRtL() throws IOException {
final Resource left = input.getReferenceContainmentMultiMoveLeft();
final Resource right = input.getReferenceContainmentMultiMoveRight();
final IComparisonScope scope = new DefaultComparisonScope(left, right, null);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
assertEquals(1, differences.size());
final String featureName = "containmentRef1";
final Diff diff = Iterators.find(differences.iterator(),
and(fromSide(DifferenceSource.LEFT), moved("root.value2", featureName)));
mergerRegistry.getHighestRankingMerger(diff).copyRightToLeft(diff, new BasicMonitor());
final EObject targetNode = getNodeNamed(right, "value2");
assertNotNull(targetNode);
final EObject targetContainerNode = getNodeNamed(right, "value3");
assertNotNull(targetContainerNode);
assertEquals(targetContainerNode, targetNode.eContainer());
final EObject sourceNode = getNodeNamed(left, "value2");
assertNotNull(sourceNode);
final EObject sourceContainerNode = getNodeNamed(left, "value3");
assertNotNull(sourceContainerNode);
assertEquals(sourceContainerNode, sourceNode.eContainer());
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
@Test
public void testReferenceDifferentContainmentMove3Way() throws IOException {
final Resource left = input.getReferenceDifferentContainmentMoveLeft();
final Resource right = input.getReferenceDifferentContainmentMoveRight();
final Resource origin = input.getReferenceDifferentContainmentMoveOrigin();
IComparisonScope scope = new DefaultComparisonScope(left, right, origin);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
for (Diff diff : differences) {
mergerRegistry.getHighestRankingMerger(diff).copyLeftToRight(diff, new BasicMonitor());
}
scope = new DefaultComparisonScope(right, origin, null);
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
/**
* Ensures that the two given lists contain the same elements in the same order. The kind of list does not
* matter.
*
* @param list1
* First of the two lists to compare.
* @param list2
* Second of the two lists to compare.
*/
private static <T> void assertEqualContents(List<T> list1, List<T> list2) {
final int size = list1.size();
assertEquals(size, list2.size());
for (int i = 0; i < size; i++) {
final Object object1 = list1.get(i);
final Object object2 = list2.get(i);
assertEquals(object1, object2);
}
}
/**
* Ensures that the two given lists contain the same elements in the same order. The kind of list does not
* matter.
*
* @param list1
* First of the two lists to compare.
* @param list2
* Second of the two lists to compare.
*/
private static <T extends EObject> void assertEqualContents(Comparison comparison, List<T> list1,
List<T> list2) {
final int size = list1.size();
assertEquals(size, list2.size());
boolean list2IsOrigin = false;
for (int i = 0; i < size; i++) {
final EObject eObject1 = list1.get(i);
final EObject eObject2 = list2.get(i);
final Match match = comparison.getMatch(eObject1);
if (match.getLeft() == eObject1) {
if (i == 0) {
if (match.getOrigin() == eObject2) {
list2IsOrigin = true;
} else {
assertSame(match.getRight(), eObject2);
}
} else if (list2IsOrigin) {
assertSame(match.getOrigin(), eObject2);
} else {
assertSame(match.getRight(), eObject2);
}
} else {
assertSame(match.getRight(), eObject1);
if (i == 0) {
if (match.getOrigin() == eObject2) {
list2IsOrigin = true;
} else {
assertSame(match.getLeft(), eObject2);
}
} else if (list2IsOrigin) {
assertSame(match.getOrigin(), eObject2);
} else {
assertSame(match.getLeft(), eObject2);
}
}
}
}
private EObject getNodeNamed(Resource res, String name) {
final Iterator<EObject> iterator = EcoreUtil.getAllProperContents(res, false);
while (iterator.hasNext()) {
final EObject next = iterator.next();
final EStructuralFeature nameFeature = next.eClass().getEStructuralFeature("name");
if (nameFeature != null && name.equals(next.eGet(nameFeature))) {
return next;
}
}
return null;
}
}