| /******************************************************************************* |
| * 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; |
| } |
| |
| } |