blob: 0b94742d270fc44a61b04fe234008eeac27fcaff [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2014 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.uml2.tests.executionSpecification;
import static com.google.common.base.Predicates.and;
import static com.google.common.base.Predicates.instanceOf;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.added;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.addedToReference;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.changedReference;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.removed;
import static org.eclipse.emf.compare.utils.EMFComparePredicates.removedFromReference;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterators;
import java.io.IOException;
import java.util.List;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.DifferenceKind;
import org.eclipse.emf.compare.uml2.internal.ExecutionSpecificationChange;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData;
import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest;
import org.eclipse.emf.compare.uml2.tests.executionSpecification.data.ExecutionSpecificationInputData;
import org.eclipse.emf.ecore.resource.Resource;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
@SuppressWarnings("nls")
public class AddActionExecutionSpecificationTest extends AbstractUMLTest {
private ExecutionSpecificationInputData input = new ExecutionSpecificationInputData();
@BeforeClass
public static void setupClass() {
fillRegistries();
}
@AfterClass
public static void teardownClass() {
resetRegistries();
}
@Test
public void testA10UseCase() throws IOException {
final Resource left = input.getA1Left();
final Resource right = input.getA1Right();
final Comparison comparison = compare(left, right);
testAB1(TestKind.ADD, comparison);
testMergeLeftToRight(left, right, null);
testMergeRightToLeft(left, right, null);
}
@Test
public void testA11UseCase() throws IOException {
final Resource left = input.getA1Left();
final Resource right = input.getA1Right();
final Comparison comparison = compare(right, left);
testAB1(TestKind.DELETE, comparison);
testMergeLeftToRight(right, left, null);
testMergeRightToLeft(right, left, null);
}
@Test
public void testA10UseCase3way() throws IOException {
final Resource left = input.getA1Left();
final Resource right = input.getA1Right();
final Comparison comparison = compare(left, right, right);
testAB1(TestKind.ADD, comparison);
testMergeLeftToRight(left, right, right);
testMergeRightToLeft(left, right, right);
}
@Test
public void testA11UseCase3way() throws IOException {
final Resource left = input.getA1Left();
final Resource right = input.getA1Right();
final Comparison comparison = compare(left, right, left);
testAB1(TestKind.DELETE, comparison);
testMergeLeftToRight(left, right, left);
testMergeRightToLeft(left, right, left);
}
private void testAB1(TestKind kind, final Comparison comparison) {
final List<Diff> differences = comparison.getDifferences();
// We should have no less and no more than 14 differences
assertEquals(14, differences.size());
Predicate<? super Diff> addActionExecSpecDescription = null;
Predicate<? super Diff> addCoveredInStartDescription = null;
Predicate<? super Diff> addExecutionInStartDescription = null;
Predicate<? super Diff> addCoveredInFinishDescription = null;
Predicate<? super Diff> addExecutionInFinishDescription = null;
Predicate<? super Diff> addCoveredByInLifeline1Description1 = null;
Predicate<? super Diff> addCoveredByInLifeline1Description2 = null;
Predicate<? super Diff> addCoveredByInLifeline1Description3 = null;
Predicate<? super Diff> addFinishInActionExecSpecDescription = null;
Predicate<? super Diff> addStartInActionExecSpecDescription = null;
Predicate<? super Diff> addStartDescription = null;
Predicate<? super Diff> addFinishDescription = null;
Predicate<? super Diff> addCoveredInActionExecSpecDescription = null;
if (kind.equals(TestKind.DELETE)) {
addActionExecSpecDescription = removed("model.interaction0.ActionExecSpec0"); //$NON-NLS-1$
addStartDescription = removed("model.interaction0.ActionExecSpec0Start0"); //$NON-NLS-1$
addFinishDescription = removed("model.interaction0.ActionExecSpec0Finish0"); //$NON-NLS-1$
addCoveredInStartDescription = removedFromReference("model.interaction0.ActionExecSpec0Start0",
"covered", "model.interaction0.Lifeline1");
addExecutionInStartDescription = changedReference("model.interaction0.ActionExecSpec0Start0",
"execution", "model.interaction0.ActionExecSpec0", null);
addCoveredInFinishDescription = removedFromReference("model.interaction0.ActionExecSpec0Finish0",
"covered", "model.interaction0.Lifeline1");
addExecutionInFinishDescription = changedReference("model.interaction0.ActionExecSpec0Finish0",
"execution", "model.interaction0.ActionExecSpec0", null);
addFinishInActionExecSpecDescription = changedReference("model.interaction0.ActionExecSpec0",
"finish", "model.interaction0.ActionExecSpec0Finish0", null);
addStartInActionExecSpecDescription = changedReference("model.interaction0.ActionExecSpec0",
"start", "model.interaction0.ActionExecSpec0Start0", null);
addCoveredByInLifeline1Description1 = removedFromReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0Start0");
addCoveredByInLifeline1Description2 = removedFromReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0Finish0");
addCoveredByInLifeline1Description3 = removedFromReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0");
addCoveredInActionExecSpecDescription = removedFromReference("model.interaction0.ActionExecSpec0",
"covered", "model.interaction0.Lifeline1");
} else {
addActionExecSpecDescription = added("model.interaction0.ActionExecSpec0"); //$NON-NLS-1$
addStartDescription = added("model.interaction0.ActionExecSpec0Start0"); //$NON-NLS-1$
addFinishDescription = added("model.interaction0.ActionExecSpec0Finish0");
addCoveredInStartDescription = addedToReference("model.interaction0.ActionExecSpec0Start0",
"covered", "model.interaction0.Lifeline1");
addExecutionInStartDescription = changedReference("model.interaction0.ActionExecSpec0Start0",
"execution", null, "model.interaction0.ActionExecSpec0");
addCoveredInFinishDescription = addedToReference("model.interaction0.ActionExecSpec0Finish0",
"covered", "model.interaction0.Lifeline1");
addExecutionInFinishDescription = changedReference("model.interaction0.ActionExecSpec0Finish0",
"execution", null, "model.interaction0.ActionExecSpec0");
addFinishInActionExecSpecDescription = changedReference("model.interaction0.ActionExecSpec0",
"finish", null, "model.interaction0.ActionExecSpec0Finish0");
addStartInActionExecSpecDescription = changedReference("model.interaction0.ActionExecSpec0",
"start", null, "model.interaction0.ActionExecSpec0Start0");
addCoveredByInLifeline1Description1 = addedToReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0Start0");
addCoveredByInLifeline1Description2 = addedToReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0Finish0");
addCoveredByInLifeline1Description3 = addedToReference("model.interaction0.Lifeline1",
"coveredBy", "model.interaction0.ActionExecSpec0");
addCoveredInActionExecSpecDescription = addedToReference("model.interaction0.ActionExecSpec0",
"covered", "model.interaction0.Lifeline1");
}
final Diff addActionExecSpec = Iterators.find(differences.iterator(), addActionExecSpecDescription);
final Diff addCoveredInStart = Iterators.find(differences.iterator(), addCoveredInStartDescription);
final Diff addExecutionInStart = Iterators.find(differences.iterator(),
addExecutionInStartDescription);
final Diff addCoveredInFinish = Iterators.find(differences.iterator(), addCoveredInFinishDescription);
final Diff addExecutionInFinish = Iterators.find(differences.iterator(),
addExecutionInFinishDescription);
final Diff addFinishInActionExecSpec = Iterators.find(differences.iterator(),
addFinishInActionExecSpecDescription);
final Diff addStartInActionExecSpec = Iterators.find(differences.iterator(),
addStartInActionExecSpecDescription);
final Diff addCoveredByInLifeline1_1 = Iterators.find(differences.iterator(),
addCoveredByInLifeline1Description1);
final Diff addCoveredByInLifeline1_2 = Iterators.find(differences.iterator(),
addCoveredByInLifeline1Description2);
final Diff addCoveredByInLifeline1_3 = Iterators.find(differences.iterator(),
addCoveredByInLifeline1Description3);
final Diff addStart = Iterators.find(differences.iterator(), addStartDescription);
final Diff addFinish = Iterators.find(differences.iterator(), addFinishDescription);
final Diff addCoveredInActionExecSpec = Iterators.find(differences.iterator(),
addCoveredInActionExecSpecDescription);
assertNotNull(addActionExecSpec);
assertNotNull(addCoveredInStart);
assertNotNull(addExecutionInStart);
assertNotNull(addCoveredInFinish);
assertNotNull(addExecutionInFinish);
assertNotNull(addFinishInActionExecSpec);
assertNotNull(addStartInActionExecSpec);
assertNotNull(addCoveredByInLifeline1_1);
assertNotNull(addCoveredByInLifeline1_2);
assertNotNull(addCoveredByInLifeline1_3);
assertNotNull(addStart);
assertNotNull(addFinish);
assertNotNull(addCoveredInActionExecSpec);
// CHECK EXTENSION
assertEquals(1, count(differences, instanceOf(ExecutionSpecificationChange.class)));
Diff addUMLMessage = null;
if (kind.equals(TestKind.ADD)) {
addUMLMessage = Iterators.find(differences.iterator(),
and(instanceOf(ExecutionSpecificationChange.class), ofKind(DifferenceKind.ADD)));
} else {
addUMLMessage = Iterators.find(differences.iterator(),
and(instanceOf(ExecutionSpecificationChange.class), ofKind(DifferenceKind.DELETE)));
}
assertNotNull(addUMLMessage);
assertEquals(13, addUMLMessage.getRefinedBy().size());
assertTrue(addUMLMessage.getRefinedBy().contains(addFinishInActionExecSpec));
assertTrue(addUMLMessage.getRefinedBy().contains(addStartInActionExecSpec));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredInFinish));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredInStart));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredInActionExecSpec));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredByInLifeline1_1));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredByInLifeline1_2));
assertTrue(addUMLMessage.getRefinedBy().contains(addStart));
assertTrue(addUMLMessage.getRefinedBy().contains(addFinish));
assertTrue(addUMLMessage.getRefinedBy().contains(addActionExecSpec));
assertTrue(addUMLMessage.getRefinedBy().contains(addExecutionInFinish));
assertTrue(addUMLMessage.getRefinedBy().contains(addCoveredByInLifeline1_3));
assertTrue(addUMLMessage.getRefinedBy().contains(addExecutionInStart));
// CHECK REQUIREMENT
if (kind.equals(TestKind.ADD)) {
assertEquals(0, addActionExecSpec.getRequires().size());
assertEquals(1, addCoveredInStart.getRequires().size());
assertTrue(addCoveredInStart.getRequires().contains(addStart));
assertEquals(2, addExecutionInStart.getRequires().size());
assertTrue(addExecutionInStart.getRequires().contains(addStart));
assertTrue(addExecutionInStart.getRequires().contains(addActionExecSpec));
assertEquals(1, addCoveredInFinish.getRequires().size());
assertTrue(addCoveredInFinish.getRequires().contains(addFinish));
assertEquals(2, addExecutionInFinish.getRequires().size());
assertTrue(addExecutionInFinish.getRequires().contains(addFinish));
assertTrue(addExecutionInFinish.getRequires().contains(addActionExecSpec));
assertEquals(2, addFinishInActionExecSpec.getRequires().size());
assertTrue(addFinishInActionExecSpec.getRequires().contains(addActionExecSpec));
assertTrue(addFinishInActionExecSpec.getRequires().contains(addFinish));
assertEquals(2, addStartInActionExecSpec.getRequires().size());
assertTrue(addStartInActionExecSpec.getRequires().contains(addActionExecSpec));
assertTrue(addStartInActionExecSpec.getRequires().contains(addStart));
assertEquals(1, addCoveredByInLifeline1_1.getRequires().size());
assertTrue(addCoveredByInLifeline1_1.getRequires().contains(addStart));
assertEquals(1, addCoveredByInLifeline1_2.getRequires().size());
assertTrue(addCoveredByInLifeline1_2.getRequires().contains(addFinish));
assertEquals(1, addCoveredByInLifeline1_3.getRequires().size());
assertTrue(addCoveredByInLifeline1_3.getRequires().contains(addActionExecSpec));
assertEquals(0, addStart.getRequires().size());
assertEquals(0, addFinish.getRequires().size());
assertEquals(1, addCoveredInActionExecSpec.getRequires().size());
assertTrue(addCoveredInActionExecSpec.getRequires().contains(addActionExecSpec));
} else {
assertEquals(6, addActionExecSpec.getRequires().size());
assertTrue(addActionExecSpec.getRequires().contains(addFinishInActionExecSpec));
assertTrue(addActionExecSpec.getRequires().contains(addStartInActionExecSpec));
assertTrue(addActionExecSpec.getRequires().contains(addCoveredInActionExecSpec));
assertTrue(addActionExecSpec.getRequires().contains(addExecutionInFinish));
assertTrue(addActionExecSpec.getRequires().contains(addExecutionInStart));
assertTrue(addActionExecSpec.getRequires().contains(addCoveredByInLifeline1_3));
assertEquals(0, addCoveredInStart.getRequires().size());
assertEquals(0, addExecutionInStart.getRequires().size());
assertEquals(0, addCoveredInFinish.getRequires().size());
assertEquals(0, addExecutionInFinish.getRequires().size());
assertEquals(0, addFinishInActionExecSpec.getRequires().size());
assertEquals(0, addStartInActionExecSpec.getRequires().size());
assertEquals(0, addCoveredByInLifeline1_1.getRequires().size());
assertEquals(0, addCoveredByInLifeline1_2.getRequires().size());
assertEquals(0, addCoveredByInLifeline1_3.getRequires().size());
assertEquals(4, addStart.getRequires().size());
assertTrue(addStart.getRequires().contains(addStartInActionExecSpec));
assertTrue(addStart.getRequires().contains(addCoveredByInLifeline1_1));
assertTrue(addStart.getRequires().contains(addCoveredInStart));
assertTrue(addStart.getRequires().contains(addExecutionInStart));
assertEquals(4, addFinish.getRequires().size());
assertTrue(addFinish.getRequires().contains(addFinishInActionExecSpec));
assertTrue(addFinish.getRequires().contains(addCoveredByInLifeline1_2));
assertTrue(addFinish.getRequires().contains(addCoveredInFinish));
assertTrue(addFinish.getRequires().contains(addExecutionInFinish));
assertEquals(0, addCoveredInActionExecSpec.getRequires().size());
}
// CHECK EQUIVALENCE
assertEquals(3, comparison.getEquivalences().size());
assertNotNull(addCoveredInStart.getEquivalence());
assertEquals(2, addCoveredInStart.getEquivalence().getDifferences().size());
assertTrue(addCoveredInStart.getEquivalence().getDifferences().contains(addCoveredInStart));
assertTrue(addCoveredInStart.getEquivalence().getDifferences().contains(addCoveredByInLifeline1_1));
assertNotNull(addCoveredInFinish.getEquivalence());
assertEquals(2, addCoveredInFinish.getEquivalence().getDifferences().size());
assertTrue(addCoveredInFinish.getEquivalence().getDifferences().contains(addCoveredInFinish));
assertTrue(addCoveredInFinish.getEquivalence().getDifferences().contains(addCoveredByInLifeline1_2));
assertNotNull(addCoveredInActionExecSpec.getEquivalence());
assertEquals(2, addCoveredInActionExecSpec.getEquivalence().getDifferences().size());
assertTrue(addCoveredInActionExecSpec.getEquivalence().getDifferences()
.contains(addCoveredInActionExecSpec));
assertTrue(addCoveredInActionExecSpec.getEquivalence().getDifferences()
.contains(addCoveredByInLifeline1_3));
testIntersections(comparison);
}
@Override
protected AbstractUMLInputData getInput() {
return input;
}
}