/******************************************************************************* * 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.timeConstraint; 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.IntervalConstraintChange; import org.eclipse.emf.compare.uml2.tests.AbstractUMLInputData; import org.eclipse.emf.compare.uml2.tests.AbstractUMLTest; import org.eclipse.emf.compare.uml2.tests.timeConstraint.data.TimeConstraintInputData; import org.eclipse.emf.ecore.resource.Resource; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @SuppressWarnings("nls") public class AddTimeConstraintTest extends AbstractUMLTest { private TimeConstraintInputData input = new TimeConstraintInputData(); @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 10 differences assertEquals(10, differences.size()); Predicate<? super Diff> addTimeConstraintDescription = null; Predicate<? super Diff> addTimeIntervalDescription = null; Predicate<? super Diff> addTimeExpressionMinDescription = null; Predicate<? super Diff> addTimeExpressionMaxDescription = null; Predicate<? super Diff> addMinValueDescription = null; Predicate<? super Diff> addMaxValueDescription = null; Predicate<? super Diff> addConstrainedElementInTimeConstraintDescription = null; Predicate<? super Diff> addMinInTimeIntervalDescription = null; Predicate<? super Diff> addMaxInTimeIntervalDescription = null; if (kind.equals(TestKind.DELETE)) { addTimeConstraintDescription = removed("model.interaction0.TimeConstraint0"); //$NON-NLS-1$ addTimeIntervalDescription = removed("model.interaction0.TimeConstraint0.TimeInterval"); //$NON-NLS-1$ addTimeExpressionMinDescription = removed("model.TimeIntervalMin0"); //$NON-NLS-1$ addTimeExpressionMaxDescription = removed("model.TimeIntervalMax0"); addMinValueDescription = removed("model.TimeIntervalMin0.min"); //$NON-NLS-1$ addMaxValueDescription = removed("model.TimeIntervalMax0.max"); //$NON-NLS-1$ addConstrainedElementInTimeConstraintDescription = removedFromReference( "model.interaction0.TimeConstraint0", "constrainedElement", "model.interaction0.Message0Send0"); addMinInTimeIntervalDescription = changedReference( "model.interaction0.TimeConstraint0.TimeInterval", "min", "model.TimeIntervalMin0", null); addMaxInTimeIntervalDescription = changedReference( "model.interaction0.TimeConstraint0.TimeInterval", "max", "model.TimeIntervalMax0", null); } else { addTimeConstraintDescription = added("model.interaction0.TimeConstraint0"); //$NON-NLS-1$ addTimeIntervalDescription = added("model.interaction0.TimeConstraint0.TimeInterval"); //$NON-NLS-1$ addTimeExpressionMinDescription = added("model.TimeIntervalMin0"); //$NON-NLS-1$ addTimeExpressionMaxDescription = added("model.TimeIntervalMax0"); addMinValueDescription = added("model.TimeIntervalMin0.min"); //$NON-NLS-1$ addMaxValueDescription = added("model.TimeIntervalMax0.max"); //$NON-NLS-1$ addConstrainedElementInTimeConstraintDescription = addedToReference( "model.interaction0.TimeConstraint0", "constrainedElement", "model.interaction0.Message0Send0"); addMinInTimeIntervalDescription = changedReference( "model.interaction0.TimeConstraint0.TimeInterval", "min", null, "model.TimeIntervalMin0"); addMaxInTimeIntervalDescription = changedReference( "model.interaction0.TimeConstraint0.TimeInterval", "max", null, "model.TimeIntervalMax0"); } final Diff addTimeConstraint = Iterators.find(differences.iterator(), addTimeConstraintDescription); final Diff addTimeInterval = Iterators.find(differences.iterator(), addTimeIntervalDescription); final Diff addTimeExpressionMin = Iterators.find(differences.iterator(), addTimeExpressionMinDescription); final Diff addTimeExpressionMax = Iterators.find(differences.iterator(), addTimeExpressionMaxDescription); final Diff addMinValue = Iterators.find(differences.iterator(), addMinValueDescription); final Diff addMaxValue = Iterators.find(differences.iterator(), addMaxValueDescription); final Diff addConstrainedElementInTimeConstraint = Iterators.find(differences.iterator(), addConstrainedElementInTimeConstraintDescription); final Diff addMinInTimeInterval = Iterators.find(differences.iterator(), addMinInTimeIntervalDescription); final Diff addMaxInTimeInterval = Iterators.find(differences.iterator(), addMaxInTimeIntervalDescription); assertNotNull(addTimeConstraint); assertNotNull(addTimeInterval); assertNotNull(addTimeExpressionMin); assertNotNull(addTimeExpressionMax); assertNotNull(addMinValue); assertNotNull(addMaxValue); assertNotNull(addConstrainedElementInTimeConstraint); assertNotNull(addMinInTimeInterval); assertNotNull(addMaxInTimeInterval); // CHECK EXTENSION assertEquals(1, count(differences, instanceOf(IntervalConstraintChange.class))); Diff addUMLMessage = null; if (kind.equals(TestKind.ADD)) { addUMLMessage = Iterators.find(differences.iterator(), and(instanceOf(IntervalConstraintChange.class), ofKind(DifferenceKind.ADD))); } else { addUMLMessage = Iterators.find(differences.iterator(), and(instanceOf(IntervalConstraintChange.class), ofKind(DifferenceKind.DELETE))); } assertNotNull(addUMLMessage); assertEquals(9, addUMLMessage.getRefinedBy().size()); assertTrue(addUMLMessage.getRefinedBy().contains(addConstrainedElementInTimeConstraint)); assertTrue(addUMLMessage.getRefinedBy().contains(addTimeInterval)); assertTrue(addUMLMessage.getRefinedBy().contains(addMinInTimeInterval)); assertTrue(addUMLMessage.getRefinedBy().contains(addMaxInTimeInterval)); assertTrue(addUMLMessage.getRefinedBy().contains(addMinValue)); assertTrue(addUMLMessage.getRefinedBy().contains(addMaxValue)); assertTrue(addUMLMessage.getRefinedBy().contains(addTimeExpressionMin)); assertTrue(addUMLMessage.getRefinedBy().contains(addTimeExpressionMax)); assertTrue(addUMLMessage.getRefinedBy().contains(addTimeConstraint)); // CHECK REQUIREMENT if (kind.equals(TestKind.ADD)) { assertEquals(0, addTimeConstraint.getRequires().size()); assertEquals(1, addTimeInterval.getRequires().size()); assertTrue(addTimeInterval.getRequires().contains(addTimeConstraint)); assertEquals(0, addTimeExpressionMin.getRequires().size()); assertEquals(0, addTimeExpressionMax.getRequires().size()); assertEquals(1, addMinValue.getRequires().size()); assertTrue(addMinValue.getRequires().contains(addTimeExpressionMin)); assertEquals(1, addMaxValue.getRequires().size()); assertTrue(addMaxValue.getRequires().contains(addTimeExpressionMax)); assertEquals(1, addConstrainedElementInTimeConstraint.getRequires().size()); assertTrue(addTimeInterval.getRequires().contains(addTimeConstraint)); assertEquals(2, addMinInTimeInterval.getRequires().size()); assertTrue(addMinInTimeInterval.getRequires().contains(addTimeInterval)); assertTrue(addMinInTimeInterval.getRequires().contains(addTimeExpressionMin)); assertEquals(2, addMaxInTimeInterval.getRequires().size()); assertTrue(addMaxInTimeInterval.getRequires().contains(addTimeInterval)); assertTrue(addMaxInTimeInterval.getRequires().contains(addTimeExpressionMax)); } else { assertEquals(2, addTimeConstraint.getRequires().size()); assertTrue(addTimeConstraint.getRequires().contains(addConstrainedElementInTimeConstraint)); assertTrue(addTimeConstraint.getRequires().contains(addTimeInterval)); assertEquals(2, addTimeInterval.getRequires().size()); assertTrue(addTimeInterval.getRequires().contains(addMinInTimeInterval)); assertTrue(addTimeInterval.getRequires().contains(addMaxInTimeInterval)); assertEquals(2, addTimeExpressionMin.getRequires().size()); assertTrue(addTimeExpressionMin.getRequires().contains(addMinValue)); assertTrue(addTimeExpressionMin.getRequires().contains(addMinInTimeInterval)); assertEquals(2, addTimeExpressionMax.getRequires().size()); assertTrue(addTimeExpressionMax.getRequires().contains(addMaxValue)); assertTrue(addTimeExpressionMax.getRequires().contains(addMaxInTimeInterval)); assertEquals(0, addMinValue.getRequires().size()); assertEquals(0, addMaxValue.getRequires().size()); assertEquals(0, addConstrainedElementInTimeConstraint.getRequires().size()); assertEquals(0, addMinInTimeInterval.getRequires().size()); assertEquals(0, addMaxInTimeInterval.getRequires().size()); } // CHECK EQUIVALENCE assertEquals(0, comparison.getEquivalences().size()); testIntersections(comparison); } @Override protected AbstractUMLInputData getInput() { return input; } }