/**
* Copyright (c) 2016 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*/
package org.eclipse.emf.compare.tests.fragmentation;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import com.google.common.base.Predicates;
import com.google.common.collect.Collections2;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceState;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.ResourceAttachmentChange;
import org.eclipse.emf.compare.merge.BatchMerger;
import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.scope.DefaultComparisonScope;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.compare.tests.fragmentation.data.FragmentationInputData;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.junit.Test;
public class ResourceAttachmentChangeBug492261 {
private final FragmentationInputData input = new FragmentationInputData();
private final BatchMerger batchMerger = new BatchMerger(IMerger.RegistryImpl.createStandaloneInstance());
@Test
public void testUncontrolRootResourceImplication_1() throws IOException {
final Resource left = input.getRootElementImplicationLeft();
final Resource origin = input.getRootElementImplicationUncontrolOrigin();
final Resource right = input.getRootElementImplicationRight();
final ResourceSet leftSet = left.getResourceSet();
final ResourceSet originSet = origin.getResourceSet();
final ResourceSet rightSet = right.getResourceSet();
assertNotNull(leftSet);
assertNotNull(originSet);
assertNotNull(rightSet);
EcoreUtil.resolveAll(leftSet);
EcoreUtil.resolveAll(originSet);
EcoreUtil.resolveAll(rightSet);
assertEquals(1, leftSet.getResources().size());
assertEquals(2, originSet.getResources().size());
assertEquals(2, rightSet.getResources().size());
mergeUncontrolDiffsAndAssertResult(leftSet, originSet, rightSet, true);
}
@Test
public void testUncontrolRootResourceImplication_2() throws IOException {
final Resource left = input.getRootElementImplicationRight();
final Resource origin = input.getRootElementImplicationUncontrolOrigin();
final Resource right = input.getRootElementImplicationLeft();
final ResourceSet leftSet = left.getResourceSet();
final ResourceSet originSet = origin.getResourceSet();
final ResourceSet rightSet = right.getResourceSet();
assertNotNull(leftSet);
assertNotNull(originSet);
assertNotNull(rightSet);
EcoreUtil.resolveAll(leftSet);
EcoreUtil.resolveAll(originSet);
EcoreUtil.resolveAll(rightSet);
assertEquals(2, leftSet.getResources().size());
assertEquals(2, originSet.getResources().size());
assertEquals(1, rightSet.getResources().size());
mergeUncontrolDiffsAndAssertResult(leftSet, originSet, rightSet, false);
}
@Test
public void testControlRootResourceImplication_1() throws IOException {
final Resource left = input.getRootElementImplicationLeft();
final Resource origin = input.getRootElementImplicationControlOrigin();
final Resource right = input.getRootElementImplicationRight();
final ResourceSet leftSet = left.getResourceSet();
final ResourceSet originSet = origin.getResourceSet();
final ResourceSet rightSet = right.getResourceSet();
assertNotNull(leftSet);
assertNotNull(originSet);
assertNotNull(rightSet);
EcoreUtil.resolveAll(leftSet);
EcoreUtil.resolveAll(originSet);
EcoreUtil.resolveAll(rightSet);
assertEquals(1, leftSet.getResources().size());
assertEquals(1, originSet.getResources().size());
assertEquals(2, rightSet.getResources().size());
mergeControlDiffsAndAssertResult(leftSet, originSet, rightSet, false);
}
@Test
public void testControlRootResourceImplication_2() throws IOException {
final Resource left = input.getRootElementImplicationRight();
final Resource origin = input.getRootElementImplicationControlOrigin();
final Resource right = input.getRootElementImplicationLeft();
final ResourceSet leftSet = left.getResourceSet();
final ResourceSet originSet = origin.getResourceSet();
final ResourceSet rightSet = right.getResourceSet();
assertNotNull(leftSet);
assertNotNull(originSet);
assertNotNull(rightSet);
EcoreUtil.resolveAll(leftSet);
EcoreUtil.resolveAll(originSet);
EcoreUtil.resolveAll(rightSet);
assertEquals(2, leftSet.getResources().size());
assertEquals(1, originSet.getResources().size());
assertEquals(1, rightSet.getResources().size());
mergeControlDiffsAndAssertResult(leftSet, originSet, rightSet, true);
}
private void mergeUncontrolDiffsAndAssertResult(final ResourceSet leftSet, final ResourceSet originSet,
final ResourceSet rightSet, boolean fragmentedOnLeft) {
final IComparisonScope scope = new DefaultComparisonScope(leftSet, rightSet, originSet);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
Collection<Diff> racFilter = Collections2.filter(differences,
Predicates.instanceOf(ResourceAttachmentChange.class));
Collection<Diff> rcFilter = Collections2.filter(differences,
Predicates.instanceOf(ReferenceChange.class));
assertEquals(1, racFilter.size());
assertEquals(2, rcFilter.size());
Diff rac = racFilter.iterator().next();
Diff container = null;
Diff innerNode = null;
for (Diff diff : rcFilter) {
if (fragmentedOnLeft && diff.getMatch().getLeft() == null) {
innerNode = diff;
} else if (!fragmentedOnLeft && diff.getMatch().getRight() == null) {
innerNode = diff;
} else {
container = diff;
}
}
assertNotNull(container);
assertNotNull(innerNode);
if (fragmentedOnLeft) {
batchMerger.copyAllRightToLeft(Arrays.asList(rac), new BasicMonitor());
} else {
batchMerger.copyAllLeftToRight(Arrays.asList(rac), new BasicMonitor());
}
assertEquals(DifferenceState.DISCARDED, rac.getState());
assertEquals(DifferenceState.DISCARDED, container.getState());
assertEquals(DifferenceState.UNRESOLVED, innerNode.getState());
if (fragmentedOnLeft) {
batchMerger.copyAllRightToLeft(Arrays.asList(innerNode), new BasicMonitor());
} else {
batchMerger.copyAllLeftToRight(Arrays.asList(innerNode), new BasicMonitor());
}
assertEquals(DifferenceState.DISCARDED, rac.getState());
assertEquals(DifferenceState.DISCARDED, container.getState());
assertEquals(DifferenceState.DISCARDED, innerNode.getState());
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
private void mergeControlDiffsAndAssertResult(final ResourceSet leftSet, final ResourceSet originSet,
final ResourceSet rightSet, boolean fragmentedOnLeft) {
final IComparisonScope scope = new DefaultComparisonScope(leftSet, rightSet, originSet);
Comparison comparison = EMFCompare.builder().build().compare(scope);
final List<Diff> differences = comparison.getDifferences();
Collection<Diff> racFilter = Collections2.filter(differences,
Predicates.instanceOf(ResourceAttachmentChange.class));
Collection<Diff> rcFilter = Collections2.filter(differences,
Predicates.instanceOf(ReferenceChange.class));
assertEquals(1, racFilter.size());
assertEquals(2, rcFilter.size());
Diff rac = racFilter.iterator().next();
Diff container = null;
Diff innerNode = null;
for (Diff diff : rcFilter) {
if (fragmentedOnLeft && diff.getMatch().getRight() == null) {
innerNode = diff;
} else if (!fragmentedOnLeft && diff.getMatch().getLeft() == null) {
innerNode = diff;
} else {
container = diff;
}
}
assertNotNull(container);
assertNotNull(innerNode);
if (fragmentedOnLeft) {
batchMerger.copyAllRightToLeft(Arrays.asList(rac), new BasicMonitor());
} else {
batchMerger.copyAllLeftToRight(Arrays.asList(rac), new BasicMonitor());
}
assertEquals(DifferenceState.DISCARDED, rac.getState());
assertEquals(DifferenceState.UNRESOLVED, container.getState());
assertEquals(DifferenceState.UNRESOLVED, innerNode.getState());
if (fragmentedOnLeft) {
batchMerger.copyAllRightToLeft(Arrays.asList(container), new BasicMonitor());
} else {
batchMerger.copyAllLeftToRight(Arrays.asList(container), new BasicMonitor());
}
assertEquals(DifferenceState.DISCARDED, rac.getState());
assertEquals(DifferenceState.DISCARDED, container.getState());
assertEquals(DifferenceState.DISCARDED, innerNode.getState());
comparison = EMFCompare.builder().build().compare(scope);
assertEquals(0, comparison.getDifferences().size());
}
}