blob: 59f07958327ee9c621890b8fafa07940332f43e2 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 EclipseSource Muenchen GmbH 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:
* Philip Langer - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.compare.uml2.tests.opaque;
import static com.google.common.base.Predicates.and;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.size;
import static org.eclipse.emf.compare.DifferenceKind.ADD;
import static org.eclipse.emf.compare.DifferenceKind.CHANGE;
import static org.eclipse.emf.compare.DifferenceKind.DELETE;
import static org.eclipse.emf.compare.DifferenceKind.MOVE;
import static org.eclipse.emf.compare.DifferenceSource.LEFT;
import static org.eclipse.emf.compare.DifferenceSource.RIGHT;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind;
import static org.junit.Assert.assertEquals;
import com.google.common.base.Predicate;
import java.io.IOException;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.DifferenceSource;
import org.eclipse.emf.compare.uml2.internal.OpaqueElementBodyChange;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.opaque.data.OpaqueInputData;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.uml2.uml.OpaqueAction;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Tests the detection of {@link OpaqueElementBodyChange opaque element body changes}.
*
* @author Philip Langer <planger@eclipsesource.com>
*/
@SuppressWarnings("nls")
public class OpaqueElementBodyChangeDiffTest extends AbstractUMLTest {
private static final Predicate<Diff> IS_OPAQUE_ELEMENT_CHANGE = new Predicate<Diff>() {
public boolean apply(Diff diff) {
return diff instanceof OpaqueElementBodyChange;
}
};
private static final String OPAQUE_ACTION1_ID = "_opaqueAction1";
private OpaqueInputData input = new OpaqueInputData();
@BeforeClass
public static void setupClass() {
fillRegistries();
}
@AfterClass
public static void teardownClass() {
resetRegistries();
}
@Test
public void testA1UseCaseLeft() throws IOException {
Resource origin = input.getA1Origin();
Resource left = input.getA1Left();
Comparison comparison = compare(left, origin, null);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> opaqueChanges = filter(diffs, IS_OPAQUE_ELEMENT_CHANGE);
assertEquals(1, size(opaqueChanges));
Diff firstDiff = opaqueChanges.iterator().next();
OpaqueElementBodyChange bodyChange = (OpaqueElementBodyChange)firstDiff;
assertEquals(DifferenceKind.CHANGE, bodyChange.getKind());
assertEquals(DifferenceSource.LEFT, bodyChange.getSource());
assertEquals(2, bodyChange.getRefinedBy().size());
assertEquals(1, size(filter(bodyChange.getRefinedBy(), ofKind(ADD))));
assertEquals(1, size(filter(bodyChange.getRefinedBy(), ofKind(DELETE))));
assertEquals(2, size(filter(bodyChange.getRefinedBy(), fromSide(LEFT))));
}
@Test
public void testA1UseCase() throws IOException {
Resource origin = input.getA1Origin();
Resource left = input.getA1Left();
Resource right = input.getA1Right();
Comparison comparison = compare(left, right, origin);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> leftOpaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(LEFT)));
assertEquals(1, size(leftOpaqueChanges));
Diff firstLeftDiff = leftOpaqueChanges.iterator().next();
OpaqueElementBodyChange leftBodyChange = (OpaqueElementBodyChange)firstLeftDiff;
assertEquals(DifferenceKind.CHANGE, leftBodyChange.getKind());
assertEquals(DifferenceSource.LEFT, leftBodyChange.getSource());
assertEquals(2, leftBodyChange.getRefinedBy().size());
assertEquals(0, size(filter(leftBodyChange.getRefinedBy(), fromSide(RIGHT))));
assertEquals(2, size(filter(leftBodyChange.getRefinedBy(), fromSide(LEFT))));
assertEquals(1, size(filter(leftBodyChange.getRefinedBy(), ofKind(ADD))));
assertEquals(1, size(filter(leftBodyChange.getRefinedBy(), ofKind(DELETE))));
Iterable<Diff> rightOpaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(RIGHT)));
assertEquals(1, size(rightOpaqueChanges));
Diff firstRightDiff = rightOpaqueChanges.iterator().next();
OpaqueElementBodyChange rightBodyChange = (OpaqueElementBodyChange)firstRightDiff;
assertEquals(DifferenceKind.CHANGE, rightBodyChange.getKind());
assertEquals(DifferenceSource.RIGHT, rightBodyChange.getSource());
assertEquals(2, rightBodyChange.getRefinedBy().size());
assertEquals(2, size(filter(rightBodyChange.getRefinedBy(), fromSide(RIGHT))));
assertEquals(0, size(filter(rightBodyChange.getRefinedBy(), fromSide(LEFT))));
assertEquals(1, size(filter(rightBodyChange.getRefinedBy(), ofKind(ADD))));
assertEquals(1, size(filter(rightBodyChange.getRefinedBy(), ofKind(DELETE))));
}
@Test
public void testA5UseCaseLeft() throws IOException {
Resource origin = input.getA5Origin();
Resource left = input.getA5Left();
Comparison comparison = compare(left, origin, null);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> opaqueChanges = filter(diffs, IS_OPAQUE_ELEMENT_CHANGE);
assertEquals(1, size(opaqueChanges));
Diff firstDiff = opaqueChanges.iterator().next();
OpaqueElementBodyChange bodyChange = (OpaqueElementBodyChange)firstDiff;
assertEquals(DifferenceKind.ADD, bodyChange.getKind());
assertEquals(DifferenceSource.LEFT, bodyChange.getSource());
assertEquals(2, bodyChange.getRefinedBy().size());
assertEquals(2, size(filter(bodyChange.getRefinedBy(), ofKind(ADD))));
assertEquals(2, size(filter(bodyChange.getRefinedBy(), fromSide(LEFT))));
}
@Test
public void testA5UseCase() throws IOException {
Resource origin = input.getA5Origin();
Resource left = input.getA5Left();
Resource right = input.getA5Right();
Comparison comparison = compare(left, right, origin);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> leftOpaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(LEFT)));
assertEquals(1, size(leftOpaqueChanges));
Diff firstLeftDiff = leftOpaqueChanges.iterator().next();
OpaqueElementBodyChange leftBodyChange = (OpaqueElementBodyChange)firstLeftDiff;
assertEquals(DifferenceKind.ADD, leftBodyChange.getKind());
assertEquals(DifferenceSource.LEFT, leftBodyChange.getSource());
assertEquals(2, leftBodyChange.getRefinedBy().size());
assertEquals(0, size(filter(leftBodyChange.getRefinedBy(), fromSide(RIGHT))));
assertEquals(2, size(filter(leftBodyChange.getRefinedBy(), fromSide(LEFT))));
assertEquals(2, size(filter(leftBodyChange.getRefinedBy(), ofKind(ADD))));
Iterable<Diff> rightOpaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(RIGHT)));
assertEquals(1, size(rightOpaqueChanges));
Diff firstRightDiff = rightOpaqueChanges.iterator().next();
OpaqueElementBodyChange rightBodyChange = (OpaqueElementBodyChange)firstRightDiff;
assertEquals(DifferenceKind.ADD, rightBodyChange.getKind());
assertEquals(DifferenceSource.RIGHT, rightBodyChange.getSource());
assertEquals(2, rightBodyChange.getRefinedBy().size());
assertEquals(2, size(filter(rightBodyChange.getRefinedBy(), fromSide(RIGHT))));
assertEquals(0, size(filter(rightBodyChange.getRefinedBy(), fromSide(LEFT))));
assertEquals(2, size(filter(rightBodyChange.getRefinedBy(), ofKind(ADD))));
}
@Test
public void testA7UseCaseRight_MoveAndChange() throws IOException {
Resource origin = input.getA7Origin();
Resource right = input.getA7Right();
Comparison comparison = compare(right, origin, null);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> opaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(LEFT)));
assertEquals(2, size(opaqueChanges));
assertEquals(1, size(filter(opaqueChanges, ofKind(MOVE))));
assertEquals(1, size(filter(opaqueChanges, ofKind(CHANGE))));
}
@Test
public void testA7UseCaseRight_Move() throws IOException {
Resource origin = input.getA7Origin();
Resource right = input.getA7Right();
// Make sure JAVA body is unchanged
OpaqueAction rightAction = (OpaqueAction)right.getEObject(OPAQUE_ACTION1_ID);
OpaqueAction originAction = (OpaqueAction)origin.getEObject(OPAQUE_ACTION1_ID);
String bodyJava = originAction.getBodies().get(0);
rightAction.getBodies().set(1, bodyJava);
Comparison comparison = compare(right, origin, null);
EList<Diff> diffs = comparison.getDifferences();
Iterable<Diff> opaqueChanges = filter(diffs, and(IS_OPAQUE_ELEMENT_CHANGE, fromSide(LEFT)));
assertEquals(1, size(opaqueChanges));
assertEquals(1, size(filter(opaqueChanges, ofKind(MOVE))));
Diff opaqueChangeDiff = opaqueChanges.iterator().next();
OpaqueElementBodyChange opaqueChange = (OpaqueElementBodyChange)opaqueChangeDiff;
assertEquals(2, opaqueChange.getRefinedBy().size());
assertEquals(2, size(filter(opaqueChange.getRefinedBy(), ofKind(MOVE))));
}
@Override
protected AbstractUMLInputData getInput() {
return input;
}
}