/**
* <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. 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 </copyright>
*/
package org.eclipse.emf.emfstore.client.test.changeTracking.topology;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.emfstore.client.model.exceptions.UnsupportedNotificationException;
import org.eclipse.emf.emfstore.client.test.model.requirement.RequirementFactory;
import org.eclipse.emf.emfstore.client.test.model.requirement.UseCase;
import org.eclipse.emf.emfstore.client.test.model.task.Milestone;
import org.eclipse.emf.emfstore.client.test.model.task.TaskFactory;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.CompositeOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiReferenceOperation;
import org.junit.Test;
/**
* Tests operations in n:n topologies.
*
* @author chodnick
*/
public class TopologyNtoNTest extends TopologyTest {
/**
* Add to an empty annotation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void addToEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone);
clearOperations();
useCase.getAnnotations().add(mileStone);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStoneId = ModelUtil.getProject(mileStone).getModelElementId(mileStone);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(mileStoneId, op.getReferencedModelElements().get(0));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
/**
* Add many to an empty annotation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void addManyToEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone1 = TaskFactory.eINSTANCE.createMilestone();
Milestone mileStone2 = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone1);
getProject().addModelElement(mileStone2);
Milestone[] stones = { mileStone1, mileStone2 };
clearOperations();
useCase.getAnnotations().addAll(Arrays.asList(stones));
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStone1Id = ModelUtil.getProject(mileStone1).getModelElementId(mileStone1);
ModelElementId mileStone2Id = ModelUtil.getProject(mileStone2).getModelElementId(mileStone2);
for (int i = 0; i < 2; i++) {
assertTrue(subOperations.get(i) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(i);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), ModelUtil.getProject(stones[i]).getModelElementId(stones[i]));
assertEquals(op.getIndex(), 0);
}
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(2);
assertTrue(op.isAdd());
assertEquals(2, op.getReferencedModelElements().size());
assertEquals(mileStone1Id, op.getReferencedModelElements().get(0));
assertEquals(mileStone2Id, op.getReferencedModelElements().get(1));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
/**
* Add to a non-empty annotation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void addToNonEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone = TaskFactory.eINSTANCE.createMilestone();
Milestone otherMileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone);
getProject().addModelElement(otherMileStone);
useCase.getAnnotations().add(otherMileStone);
clearOperations();
useCase.getAnnotations().add(mileStone);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStoneId = ModelUtil.getProject(mileStone).getModelElementId(mileStone);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(mileStoneId, op.getReferencedModelElements().get(0));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 1);
}
/**
* Add many to an nonempty annotation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void addManyToNonEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone1 = TaskFactory.eINSTANCE.createMilestone();
Milestone mileStone2 = TaskFactory.eINSTANCE.createMilestone();
Milestone otherMileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone1);
getProject().addModelElement(mileStone2);
getProject().addModelElement(otherMileStone);
Milestone[] stones = { mileStone1, mileStone2 };
useCase.getAnnotations().add(otherMileStone);
clearOperations();
useCase.getAnnotations().addAll(Arrays.asList(stones));
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStone1Id = ModelUtil.getProject(mileStone1).getModelElementId(mileStone1);
ModelElementId mileStone2Id = ModelUtil.getProject(mileStone2).getModelElementId(mileStone2);
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
for (int i = 0; i < 2; i++) {
assertTrue(subOperations.get(i) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(i);
assertTrue(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), ModelUtil.getProject(stones[i]).getModelElementId(stones[i]));
assertEquals(op.getIndex(), 0);
}
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(2);
assertTrue(op.isAdd());
assertEquals(2, op.getReferencedModelElements().size());
assertEquals(mileStone1Id, op.getReferencedModelElements().get(0));
assertEquals(mileStone2Id, op.getReferencedModelElements().get(1));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 1);
}
/**
* Remove an element to empty annotations.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void removeAndEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone);
useCase.getAnnotations().add(mileStone);
clearOperations();
useCase.getAnnotations().remove(mileStone);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
assertTrue(operations.get(0) instanceof CompositeOperation);
operations = ((CompositeOperation) operations.get(0)).getSubOperations();
assertTrue(operations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) operations.get(0);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStoneId = ModelUtil.getProject(mileStone).getModelElementId(mileStone);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(operations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) operations.get(1);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(mileStoneId, op.getReferencedModelElements().get(0));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
/**
* Remove an element and leave non-empty annotations.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void removePart() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone = TaskFactory.eINSTANCE.createMilestone();
Milestone otherMileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone);
getProject().addModelElement(otherMileStone);
useCase.getAnnotations().add(mileStone);
useCase.getAnnotations().add(otherMileStone);
clearOperations();
useCase.getAnnotations().remove(mileStone);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
assertTrue(operations.get(0) instanceof CompositeOperation);
operations = ((CompositeOperation) operations.get(0)).getSubOperations();
assertTrue(operations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) operations.get(0);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStoneId = ModelUtil.getProject(mileStone).getModelElementId(mileStone);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(operations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) operations.get(1);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(mileStoneId, op.getReferencedModelElements().get(0));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
/**
* Remove some element and leave empty annotations.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void removeManyAndEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone = TaskFactory.eINSTANCE.createMilestone();
Milestone otherMileStone = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone);
getProject().addModelElement(otherMileStone);
useCase.getAnnotations().add(mileStone);
useCase.getAnnotations().add(otherMileStone);
Milestone[] stones = { mileStone, otherMileStone };
clearOperations();
useCase.getAnnotations().removeAll(Arrays.asList(stones));
// if you use clear instead of explicit removal, op.getIndex() will be -1
// useCase.getAnnotations().clear();
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(0);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStoneId = ModelUtil.getProject(mileStone).getModelElementId(mileStone);
ModelElementId otherMileStoneId = ModelUtil.getProject(otherMileStone).getModelElementId(otherMileStone);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(1);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), otherMileStoneId);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(2);
assertFalse(op.isAdd());
assertEquals(2, op.getReferencedModelElements().size());
assertEquals(mileStoneId, op.getReferencedModelElements().get(0));
assertEquals(otherMileStoneId, op.getReferencedModelElements().get(1));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
/**
* Remove some element and leave non-empty annotations.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void removeManyPart() throws UnsupportedOperationException, UnsupportedNotificationException {
UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
Milestone mileStone1 = TaskFactory.eINSTANCE.createMilestone();
Milestone mileStone2 = TaskFactory.eINSTANCE.createMilestone();
Milestone mileStone3 = TaskFactory.eINSTANCE.createMilestone();
getProject().addModelElement(useCase);
getProject().addModelElement(mileStone1);
getProject().addModelElement(mileStone2);
getProject().addModelElement(mileStone3);
useCase.getAnnotations().add(mileStone1);
useCase.getAnnotations().add(mileStone2);
useCase.getAnnotations().add(mileStone3);
Milestone[] stones = { mileStone1, mileStone2 };
clearOperations();
useCase.getAnnotations().removeAll(Arrays.asList(stones));
// if you use clear instead of explicit removal, op.getIndex() will be -1
// useCase.getAnnotations().clear();
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
CompositeOperation compositeOperation = (CompositeOperation) operation;
List<AbstractOperation> subOperations = compositeOperation.getSubOperations();
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
MultiReferenceOperation op = (MultiReferenceOperation) subOperations.get(0);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
ModelElementId mileStone1Id = ModelUtil.getProject(mileStone1).getModelElementId(mileStone1);
ModelElementId mileStone2Id = ModelUtil.getProject(mileStone2).getModelElementId(mileStone2);
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStone1Id);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(1);
assertFalse(op.isAdd());
assertEquals(1, op.getReferencedModelElements().size());
assertEquals(useCaseId, op.getReferencedModelElements().get(0));
assertEquals("annotatedModelElements", op.getFeatureName());
assertEquals(op.getModelElementId(), mileStone2Id);
assertEquals(op.getIndex(), 0);
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
op = (MultiReferenceOperation) subOperations.get(2);
assertFalse(op.isAdd());
assertEquals(2, op.getReferencedModelElements().size());
assertEquals(mileStone1Id, op.getReferencedModelElements().get(0));
assertEquals(mileStone2Id, op.getReferencedModelElements().get(1));
assertEquals("annotations", op.getFeatureName());
assertEquals(op.getModelElementId(), useCaseId);
assertEquals(op.getIndex(), 0);
}
}