blob: 6d7776789833e74f1de710564554651fc12a20a9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2014 Chair for Applied Software Engineering,
* Technische Universitaet Muenchen.
* 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:
* chodnick - initial API and implementation
* Edgar Mueller - refactorings
******************************************************************************/
package org.eclipse.emf.emfstore.client.changetracking.test.toplogy;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Arrays;
import java.util.List;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTest;
import org.eclipse.emf.emfstore.client.test.common.dsl.Add;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.client.test.common.dsl.Delete;
import org.eclipse.emf.emfstore.client.test.common.dsl.TestElementFeatures;
import org.eclipse.emf.emfstore.client.test.common.dsl.Update;
import org.eclipse.emf.emfstore.client.util.ESVoidCallable;
import org.eclipse.emf.emfstore.client.util.RunESCommand;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.UnsupportedNotificationException;
import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CompositeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CreateDeleteOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiReferenceOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.ReferenceOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.SingleReferenceOperation;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;
/**
* Tests operations in 1:n topologies.
*
* @author chodnick
* @author emueller
*/
// BEGIN COMPLEX CODE
public class Topology1toNTest extends ESTest {
private static final String ACTOR2 = "actor2"; //$NON-NLS-1$
private static final String ACTOR = "actor"; //$NON-NLS-1$
/**
* Add an uncontained child to an empty containment feature.
*/
@Test
public void containmentAddUncontainedChildToEmpty() {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), section);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId sectionId = getProject().getModelElementId(section);
clearOperations();
Add.toContainedElements(section, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final CompositeOperation operation = checkAndCast(operations.get(0), CompositeOperation.class);
final List<AbstractOperation> subOperations = operation.getSubOperations();
assertEquals(2, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actorId, op0.getModelElementId());
assertEquals(sectionId, op0.getNewValue());
assertNull(op0.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op1.getFeatureName());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(op1.getModelElementId(), sectionId);
assertEquals(op1.getIndex(), 0);
assertTrue(op1.isAdd());
}
/**
* Create orphan.
*/
@Test
public void createContainmentOrphan() {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), section);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId sectionId = getProject().getModelElementId(section);
Add.toContainedElements(section, actor);
clearOperations();
Add.toProject(getLocalProject(), actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final EList<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(sectionId, op0.getModelElementId());
assertEquals(actorId, op0.getReferencedModelElements().get(0));
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(op1.getModelElementId(), actorId);
}
/**
* Reverse orphan creation.
*/
@Test
public void reverseContainmentOrphan() {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), section);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId sectionId = getProject().getModelElementId(section);
Add.toContainedElements(section, actor);
final Project expectedProject = ModelUtil.clone(getProject());
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
clearOperations();
// create orphan
Add.toProject(getLocalProject(), actor);
final List<AbstractOperation> operations2 = forceGetOperations();
assertEquals(1, operations2.size());
final List<AbstractOperation> subOperations = checkAndCast(operations2.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(sectionId, op0.getModelElementId());
assertEquals(actorId, op0.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(actorId, op1.getModelElementId());
// test the reversibility of what has happened
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
op1.reverse().apply(getProject());
op0.reverse().apply(getProject());
}
});
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
}
/**
* Reverse orphan creation.
*/
@Test
public void reverseContainmentOrphanIndexed() {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
final TestElement actor2 = Create.testElement();
actor.setName(ACTOR);
actor2.setName(ACTOR2);
Add.toProject(getLocalProject(), section);
Add.toContainedElements(section, actor);
Add.toContainedElements(section, actor2);
final Project expectedProject = ModelUtil.clone(getProject());
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
clearOperations();
// create orphan
Add.toProject(getLocalProject(), actor);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId sectionId = getProject().getModelElementId(section);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(sectionId, op0.getModelElementId());
assertEquals(actorId, op0.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(actorId, op1.getModelElementId());
// test the reversibility of what has happened
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
op1.reverse().apply(getProject());
op0.reverse().apply(getProject());
}
});
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
}
/**
* Add an uncontained child to a non-empty containment feature.
*
*/
@Test
public void containmentAddUncontainedChildToNonEmpty() {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), section);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId sectionId = getProject().getModelElementId(section);
Add.toContainedElements(section, oldTestElement);
clearOperations();
Add.toContainedElements(section, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actorId, op0.getModelElementId());
assertEquals(sectionId, op0.getNewValue());
assertNull(op0.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op1.getFeatureName());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(sectionId, op1.getModelElementId());
assertEquals(1, op1.getIndex());
assertTrue(op1.isAdd());
}
/**
* Add several uncontained children to an empty containment feature.
*
*/
@Test
public void containmentAddUncontainedChildrenToEmpty() {
final TestElement section = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), section);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId sectionId = getProject().getModelElementId(section);
final TestElement[] actors = { actor1, actor2 };
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(3, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(sectionId, op0.getNewValue());
assertNull(op0.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(sectionId, op1.getNewValue());
assertNull(op1.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op2.getFeatureName());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(sectionId, op2.getModelElementId());
assertEquals(0, op2.getIndex());
assertTrue(op2.isAdd());
}
/**
* Add several uncontained children to a non-empty containment feature.
*/
@Test
public void containmentAddUncontainedChildrenToNonEmpty() {
final TestElement section = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldTestElement);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId sectionId = getProject().getModelElementId(section);
final TestElement[] actors = { actor1, actor2 };
Add.toContainedElements(section, oldTestElement);
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(3, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(sectionId, op0.getNewValue());
assertNull(op0.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(sectionId, op1.getNewValue());
assertNull(op1.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op2.getFeatureName());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(sectionId, op2.getModelElementId());
assertEquals(1, op2.getIndex());
assertTrue(op2.isAdd());
}
/**
* Add several uncontained children to a non-empty containment feature.
*/
@Test
public void containmentAddUncontainedChildrenFakeManyToNonEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), section);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final TestElement[] actors = { actor1 };
Add.toContainedElements(section, oldTestElement);
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(sectionId, op0.getNewValue());
assertNull(op0.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op1.getFeatureName());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actor1Id, op1.getReferencedModelElements().get(0));
assertEquals(sectionId, op1.getModelElementId());
assertEquals(1, op1.getIndex());
assertTrue(op1.isAdd());
}
/**
* Add an contained child to a non-empty containment feature.
*/
@Test
public void containmentAddSameFeatureContainedChildToNonEmpty() {
final TestElement section1 = Create.testElement();
final TestElement section2 = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), section1);
Add.toProject(getLocalProject(), section2);
final ModelElementId section1Id = getProject().getModelElementId(section1);
final ModelElementId section2Id = getProject().getModelElementId(section2);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
Add.toContainedElements(section1, actor1);
Add.toContainedElements(section2, actor2);
clearOperations();
Add.toContainedElements(section1, actor2);
assertFalse(section2.getContainedElements().contains(actor2));
assertTrue(section1.getContainedElements().contains(actor2));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(3, subOperations.size());
// 1st op: maintain change in section2, preserving index of actor 2
// 2nd op: TestElement change on actor2 (preserving old parent)
// 3rd op: Section2 welcomes its new child
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(section2Id, op0.getModelElementId());
assertEquals(actor2Id, op0.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(section2Id, op1.getOldValue());
assertEquals(section1Id, op1.getNewValue());
assertEquals(TestElementFeatures.containedElements().getName(), op2.getFeatureName());
assertEquals(actor2Id, op2.getReferencedModelElements().get(0));
assertEquals(section1Id, op2.getModelElementId());
assertEquals(1, op2.getReferencedModelElements().size());
assertEquals(1, op2.getIndex());
assertTrue(op2.isAdd());
}
/**
* Add several already contained children to an empty containment feature.
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddSameFeatureContainedChildrenToEmpty() {
final TestElement section = Create.testElement();
final TestElement oldSection = Create.testElement();
final TestElement oldSection2 = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
final TestElement actor3 = Create.testElement();
final TestElement actor4 = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), actor3);
Add.toProject(getLocalProject(), actor4);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldSection);
Add.toProject(getLocalProject(), oldSection2);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId actor3Id = getProject().getModelElementId(actor3);
final ModelElementId actor4Id = getProject().getModelElementId(actor4);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId oldSectionId = getProject().getModelElementId(oldSection);
final ModelElementId oldSection2Id = getProject().getModelElementId(oldSection2);
final TestElement[] actors = { actor1, actor2, actor3, actor4 };
Add.toContainedElements(oldSection, Arrays.asList(actors));
Add.toContainedElements(oldSection2, actor4);
assertTrue(oldSection.getContainedElements().contains(actor1));
assertTrue(oldSection.getContainedElements().contains(actor2));
assertTrue(oldSection.getContainedElements().contains(actor3));
assertTrue(oldSection2.getContainedElements().contains(actor4));
assertTrue(section.getContainedElements().isEmpty());
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 4 messages preserving the info on former parents for the actors
// and one additional one, indicating the new parent for all of them
assertEquals(7, subOperations.size());
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op4 = checkAndCast(subOperations.get(4), MultiReferenceOperation.class);
final MultiReferenceOperation op6 = checkAndCast(subOperations.get(6), MultiReferenceOperation.class);
assertEquals(actor1Id, op1.getModelElementId());
assertEquals(actor2Id, op2.getModelElementId());
assertEquals(actor3Id, op3.getModelElementId());
assertEquals(actor4Id, op5.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op3.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op5.getFeatureName());
assertEquals(oldSectionId, op1.getOldValue());
assertEquals(oldSectionId, op2.getOldValue());
assertEquals(oldSectionId, op3.getOldValue());
assertEquals(oldSection2Id, op5.getOldValue());
assertEquals(sectionId, op1.getNewValue());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op3.getNewValue());
assertEquals(sectionId, op5.getNewValue());
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(oldSectionId, op0.getModelElementId());
assertFalse(op0.isAdd());
assertEquals(3, op0.getReferencedModelElements().size());
assertEquals(actor1Id, op0.getReferencedModelElements().get(0));
assertEquals(actor2Id, op0.getReferencedModelElements().get(1));
assertEquals(actor3Id, op0.getReferencedModelElements().get(2));
assertEquals(0, op0.getIndex());
assertEquals(TestElementFeatures.containedElements().getName(), op4.getFeatureName());
assertEquals(oldSection2Id, op4.getModelElementId());
assertEquals(1, op4.getReferencedModelElements().size());
assertEquals(actor4Id, op4.getReferencedModelElements().get(0));
assertEquals(0, op4.getIndex());
assertFalse(op4.isAdd());
assertEquals(TestElementFeatures.containedElements().getName(), op6.getFeatureName());
assertEquals(sectionId, op6.getModelElementId());
assertEquals(4, op6.getReferencedModelElements().size());
assertEquals(actor1Id, op6.getReferencedModelElements().get(0));
assertEquals(actor2Id, op6.getReferencedModelElements().get(1));
assertEquals(actor3Id, op6.getReferencedModelElements().get(2));
assertEquals(actor4Id, op6.getReferencedModelElements().get(3));
assertEquals(0, op6.getIndex());
assertTrue(op6.isAdd());
}
// END COMPLEX CODE
/**
* Add several already contained children to an empty containment feature.
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddSameFeatureContainedChildrenToNonEmpty() {
final TestElement section = Create.testElement();
final TestElement oldSection = Create.testElement();
final TestElement oldSection2 = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
final TestElement actor3 = Create.testElement();
final TestElement actor4 = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), actor3);
Add.toProject(getLocalProject(), actor4);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldSection);
Add.toProject(getLocalProject(), oldSection2);
final TestElement[] actors = { actor1, actor2, actor3, actor4 };
Add.toContainedElements(section, oldTestElement);
Add.toContainedElements(oldSection, Arrays.asList(actors));
Add.toContainedElements(oldSection2, actor4);// relocate to other section
assertTrue(oldSection.getContainedElements().contains(actor1));
assertTrue(oldSection.getContainedElements().contains(actor2));
assertTrue(oldSection.getContainedElements().contains(actor3));
assertTrue(section.getContainedElements().contains(oldTestElement));
assertTrue(oldSection2.getContainedElements().contains(actor4));
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
// now expectation is: we get 4 messages preserving the info on former parents for the actors
// and one additional one, indicating the new parent for all of them
// refactoring: addional operations expected
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(7, subOperations.size());
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op4 = checkAndCast(subOperations.get(4), MultiReferenceOperation.class);
final MultiReferenceOperation op6 = checkAndCast(subOperations.get(6), MultiReferenceOperation.class);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId oldSectionId = getProject().getModelElementId(oldSection);
final ModelElementId oldSection2Id = getProject().getModelElementId(oldSection2);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId actor3Id = getProject().getModelElementId(actor3);
final ModelElementId actor4Id = getProject().getModelElementId(actor4);
assertEquals(actor1Id, op1.getModelElementId());
assertEquals(actor2Id, op2.getModelElementId());
assertEquals(actor3Id, op3.getModelElementId());
assertEquals(actor4Id, op5.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op3.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op5.getFeatureName());
assertEquals(oldSectionId, op1.getOldValue());
assertEquals(oldSectionId, op2.getOldValue());
assertEquals(oldSectionId, op3.getOldValue());
assertEquals(oldSection2Id, op5.getOldValue());
assertEquals(sectionId, op1.getNewValue());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op3.getNewValue());
assertEquals(sectionId, op5.getNewValue());
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(oldSectionId, op0.getModelElementId());
assertEquals(actor1Id, op0.getReferencedModelElements().get(0));
assertEquals(actor2Id, op0.getReferencedModelElements().get(1));
assertEquals(actor3Id, op0.getReferencedModelElements().get(2));
assertEquals(0, op0.getIndex());
assertEquals(3, op0.getReferencedModelElements().size());
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.containedElements().getName(), op4.getFeatureName());
assertEquals(oldSection2Id, op4.getModelElementId());
assertEquals(1, op4.getReferencedModelElements().size());
assertEquals(actor4Id, op4.getReferencedModelElements().get(0));
assertEquals(0, op4.getIndex());
assertFalse(op4.isAdd());
assertEquals(TestElementFeatures.containedElements().getName(), op6.getFeatureName());
assertEquals(sectionId, op6.getModelElementId());
assertEquals(4, op6.getReferencedModelElements().size());
assertEquals(actor1Id, op6.getReferencedModelElements().get(0));
assertEquals(actor2Id, op6.getReferencedModelElements().get(1));
assertEquals(actor3Id, op6.getReferencedModelElements().get(2));
assertEquals(actor4Id, op6.getReferencedModelElements().get(3));
assertEquals(1, op6.getIndex());
assertTrue(op6.isAdd());
}
// END COMPLEX CODE
/**
* Add an contained child to a non-empty containment feature.
*/
@Test
public void containmentAddDifferentFeatureContainedNChildToNonEmpty() {
final TestElement section = Create.testElement();
final TestElement workPackage = Create.testElement();
final TestElement bugReport = Create.testElement();
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), workPackage);
Add.toProject(getLocalProject(), bugReport);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId workPackageId = getProject().getModelElementId(workPackage);
final ModelElementId bugReportId = getProject().getModelElementId(bugReport);
Update.testElement(TestElementFeatures.container(), bugReport, section);
assertTrue(section.getContainedElements().contains(bugReport));
clearOperations();
Add.toContainedElements2(workPackage, bugReport);
final List<AbstractOperation> operations = forceGetOperations();
assertFalse(section.getContainedElements().contains(bugReport));
assertTrue(workPackage.getContainedElements2().contains(bugReport));
assertEquals(1, operations.size());
final EList<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(4, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final MultiReferenceOperation op3 = checkAndCast(subOperations.get(3), MultiReferenceOperation.class);
assertEquals(sectionId, op0.getModelElementId());
assertEquals(TestElementFeatures.containedElements().getName(), op0.getFeatureName());
assertEquals(op0.getReferencedModelElements().get(0), bugReportId);
assertEquals(op1.getOldValue(), sectionId);
assertNull(op1.getNewValue());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op2.getFeatureName());
assertEquals(workPackageId, op2.getNewValue());
assertNull(op2.getOldValue());
assertEquals(TestElementFeatures.containedElements2().getName(), op3.getFeatureName());
assertEquals(1, op3.getReferencedModelElements().size());
assertEquals(bugReportId, op3.getReferencedModelElements().get(0));
assertEquals(workPackageId, op3.getModelElementId());
assertEquals(0, op3.getIndex());
assertTrue(op3.isAdd());
}
/**
* Add an contained child to a non-empty containment feature.
*/
@Test
public void containmentAddDifferentFeatureContained1ChildToNonEmpty() {
final TestElement issue = Create.testElement();
final TestElement section = Create.testElement();
final TestElement solution = Create.testElement();
Add.toProject(getLocalProject(), issue);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), solution);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId issueId = getProject().getModelElementId(issue);
final ModelElementId solutionId = getProject().getModelElementId(solution);
Update.testElement(TestElementFeatures.containedElement(), issue, solution);
clearOperations();
Add.toContainedElements(section, solution);
assertTrue(section.getContainedElements().contains(solution));
assertNull(issue.getContainer());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(4, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final MultiReferenceOperation op3 = checkAndCast(subOperations.get(3), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.containedElement().getName(), op0.getFeatureName());
assertEquals(issueId, op0.getModelElementId());
assertEquals(solutionId, op0.getOldValue());
assertNull(op0.getNewValue());
assertEquals(TestElementFeatures.srefContainer().getName(), op1.getFeatureName());
assertEquals(issueId, op1.getOldValue());
assertEquals(solutionId, op1.getModelElementId());
assertNull(op1.getNewValue());
assertEquals(solutionId, op2.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(op2.getNewValue(), sectionId);
assertNull(op2.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op3.getFeatureName());
assertEquals(sectionId, op3.getModelElementId());
assertEquals(solutionId, op3.getReferencedModelElements().get(0));
assertEquals(1, op3.getReferencedModelElements().size());
assertEquals(0, op3.getIndex());
assertTrue(op3.isAdd());
}
/**
* Add several already contained children to an empty containment feature.
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddDifferentFeatureContainedNChildrenToEmpty() {
final TestElement section = Create.testElement();
final TestElement oldWorkPackage = Create.testElement();
final TestElement oldWorkPackage2 = Create.testElement();
final TestElement bugReport1 = Create.testElement();
final TestElement bugReport2 = Create.testElement();
final TestElement bugReport3 = Create.testElement();
final TestElement bugReport4 = Create.testElement();
Add.toProject(getLocalProject(), bugReport1);
Add.toProject(getLocalProject(), bugReport2);
Add.toProject(getLocalProject(), bugReport3);
Add.toProject(getLocalProject(), bugReport4);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldWorkPackage);
Add.toProject(getLocalProject(), oldWorkPackage2);
final ModelElementId bugReport1Id = getProject().getModelElementId(bugReport1);
final ModelElementId bugReport2Id = getProject().getModelElementId(bugReport2);
final ModelElementId bugReport3Id = getProject().getModelElementId(bugReport3);
final ModelElementId bugReport4Id = getProject().getModelElementId(bugReport4);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId oldWorkPackageId = getProject().getModelElementId(oldWorkPackage);
final ModelElementId oldWorkPackageId2 = getProject().getModelElementId(oldWorkPackage2);
final TestElement[] actors = { bugReport1, bugReport2, bugReport3, bugReport4 };
Add.toContainedElements2(oldWorkPackage, Arrays.asList(actors));
Add.toContainedElements2(oldWorkPackage2, bugReport4); // relocate to other section
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport1));
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport2));
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport3));
assertTrue(oldWorkPackage2.getContainedElements2().contains(bugReport4));
assertTrue(section.getContainedElements().isEmpty());
clearOperations();
Add.toContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
final EList<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 4 messages preserving the info on former parents for the actors
// and one additional one, indicating the new parent for all of them
assertEquals(11, subOperations.size());
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final SingleReferenceOperation op6 = checkAndCast(subOperations.get(6), SingleReferenceOperation.class);
final SingleReferenceOperation op8 = checkAndCast(subOperations.get(8), SingleReferenceOperation.class);
final SingleReferenceOperation op9 = checkAndCast(subOperations.get(9), SingleReferenceOperation.class);
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op7 = checkAndCast(subOperations.get(7), MultiReferenceOperation.class);
final MultiReferenceOperation op10 = checkAndCast(subOperations.get(10), MultiReferenceOperation.class);
assertEquals(bugReport1Id, op1.getModelElementId());
assertEquals(bugReport2Id, op3.getModelElementId());
assertEquals(bugReport3Id, op5.getModelElementId());
assertEquals(bugReport4Id, op8.getModelElementId());
assertEquals(TestElementFeatures.container2().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op3.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op5.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op8.getFeatureName());
assertEquals(oldWorkPackageId, op1.getOldValue());
assertEquals(oldWorkPackageId, op3.getOldValue());
assertEquals(oldWorkPackageId, op5.getOldValue());
assertEquals(oldWorkPackageId2, op8.getOldValue());
assertNull(op1.getNewValue());
assertNull(op3.getNewValue());
assertNull(op5.getNewValue());
assertNull(op8.getNewValue());
assertEquals(bugReport1Id, op2.getModelElementId());
assertEquals(bugReport2Id, op4.getModelElementId());
assertEquals(bugReport3Id, op6.getModelElementId());
assertEquals(bugReport4Id, op9.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op4.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op6.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op9.getFeatureName());
assertNull(op2.getOldValue());
assertNull(op4.getOldValue());
assertNull(op6.getOldValue());
assertNull(op9.getOldValue());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op4.getNewValue());
assertEquals(sectionId, op6.getNewValue());
assertEquals(sectionId, op9.getNewValue());
assertEquals(TestElementFeatures.containedElements2().getName(), op0.getFeatureName());
assertEquals(oldWorkPackageId, op0.getModelElementId());
assertEquals(bugReport1Id, op0.getReferencedModelElements().get(0));
assertEquals(bugReport2Id, op0.getReferencedModelElements().get(1));
assertEquals(bugReport3Id, op0.getReferencedModelElements().get(2));
assertEquals(3, op0.getReferencedModelElements().size());
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.containedElements2().getName(), op7.getFeatureName());
assertEquals(oldWorkPackageId2, op7.getModelElementId());
assertEquals(bugReport4Id, op7.getReferencedModelElements().get(0));
assertFalse(op7.isAdd());
assertEquals(1, op7.getReferencedModelElements().size());
assertEquals(TestElementFeatures.containedElements().getName(), op10.getFeatureName());
assertEquals(sectionId, op10.getModelElementId());
assertEquals(bugReport1Id, op10.getReferencedModelElements().get(0));
assertEquals(bugReport2Id, op10.getReferencedModelElements().get(1));
assertEquals(bugReport3Id, op10.getReferencedModelElements().get(2));
assertEquals(bugReport4Id, op10.getReferencedModelElements().get(3));
assertEquals(4, op10.getReferencedModelElements().size());
assertEquals(0, op10.getIndex());
assertTrue(op10.isAdd());
}
// END COMPLEX CODE
/**
* Add several already contained children to a non-empty containment feature.
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddDifferentFeatureContainedNChildrenToNonEmpty() {
final TestElement section = Create.testElement();
section.getContainedElements().add(Create.testElement());
final TestElement oldWorkPackage = Create.testElement();
final TestElement oldWorkPackage2 = Create.testElement();
final TestElement bugReport1 = Create.testElement();
final TestElement bugReport2 = Create.testElement();
final TestElement bugReport3 = Create.testElement();
final TestElement bugReport4 = Create.testElement();
Add.toProject(getLocalProject(), bugReport1);
Add.toProject(getLocalProject(), bugReport2);
Add.toProject(getLocalProject(), bugReport3);
Add.toProject(getLocalProject(), bugReport4);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldWorkPackage);
Add.toProject(getLocalProject(), oldWorkPackage2);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId oldWorkPackageId = getProject().getModelElementId(oldWorkPackage);
final ModelElementId oldWorkPackage2Id = getProject().getModelElementId(oldWorkPackage2);
final ModelElementId bugReport1Id = getProject().getModelElementId(bugReport1);
final ModelElementId bugReport2Id = getProject().getModelElementId(bugReport2);
final ModelElementId bugReport3Id = getProject().getModelElementId(bugReport3);
final ModelElementId bugReport4Id = getProject().getModelElementId(bugReport4);
final TestElement[] bugreports = { bugReport1, bugReport2, bugReport3, bugReport4 };
Add.toContainedElements2(oldWorkPackage, Arrays.asList(bugreports));
Add.toContainedElements2(oldWorkPackage2, bugReport4);
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport1));
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport2));
assertTrue(oldWorkPackage.getContainedElements2().contains(bugReport3));
assertTrue(oldWorkPackage2.getContainedElements2().contains(bugReport4));
assertFalse(section.getContainedElements().isEmpty()); // one item is there initially
clearOperations();
Add.toContainedElements(section, Arrays.asList(bugreports));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 4 messages preserving the info on former parents for the actors
// and one additional one, indicating the new parent for all of them
assertEquals(11, subOperations.size());
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final SingleReferenceOperation op6 = checkAndCast(subOperations.get(6), SingleReferenceOperation.class);
final SingleReferenceOperation op8 = checkAndCast(subOperations.get(8), SingleReferenceOperation.class);
final SingleReferenceOperation op9 = checkAndCast(subOperations.get(9), SingleReferenceOperation.class);
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op7 = checkAndCast(subOperations.get(7), MultiReferenceOperation.class);
final MultiReferenceOperation op10 = checkAndCast(subOperations.get(10), MultiReferenceOperation.class);
assertEquals(bugReport1Id, op1.getModelElementId());
assertEquals(bugReport2Id, op3.getModelElementId());
assertEquals(bugReport3Id, op5.getModelElementId());
assertEquals(bugReport4Id, op8.getModelElementId());
assertEquals(TestElementFeatures.container2().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op3.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op5.getFeatureName());
assertEquals(TestElementFeatures.container2().getName(), op8.getFeatureName());
assertEquals(oldWorkPackageId, op1.getOldValue());
assertEquals(oldWorkPackageId, op3.getOldValue());
assertEquals(oldWorkPackageId, op5.getOldValue());
assertEquals(oldWorkPackage2Id, op8.getOldValue());
assertNull(op1.getNewValue());
assertNull(op3.getNewValue());
assertNull(op5.getNewValue());
assertNull(op8.getNewValue());
assertEquals(bugReport1Id, op2.getModelElementId());
assertEquals(bugReport2Id, op4.getModelElementId());
assertEquals(bugReport3Id, op6.getModelElementId());
assertEquals(bugReport4Id, op9.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op4.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op6.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op9.getFeatureName());
assertNull(op2.getOldValue());
assertNull(op4.getOldValue());
assertNull(op6.getOldValue());
assertNull(op9.getOldValue());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op4.getNewValue());
assertEquals(sectionId, op6.getNewValue());
assertEquals(sectionId, op9.getNewValue());
assertEquals(TestElementFeatures.containedElements2().getName(), op0.getFeatureName());
assertEquals(oldWorkPackageId, op0.getModelElementId());
assertEquals(bugReport1Id, op0.getReferencedModelElements().get(0));
assertEquals(bugReport2Id, op0.getReferencedModelElements().get(1));
assertEquals(bugReport3Id, op0.getReferencedModelElements().get(2));
assertEquals(3, op0.getReferencedModelElements().size());
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.containedElements2().getName(), op7.getFeatureName());
assertEquals(oldWorkPackage2Id, op7.getModelElementId());
assertEquals(bugReport4Id, op7.getReferencedModelElements().get(0));
assertEquals(1, op7.getReferencedModelElements().size());
assertFalse(op7.isAdd());
assertEquals(TestElementFeatures.containedElements().getName(), op10.getFeatureName());
assertEquals(sectionId, op10.getModelElementId());
assertEquals(bugReport1Id, op10.getReferencedModelElements().get(0));
assertEquals(bugReport2Id, op10.getReferencedModelElements().get(1));
assertEquals(bugReport3Id, op10.getReferencedModelElements().get(2));
assertEquals(bugReport4Id, op10.getReferencedModelElements().get(3));
assertEquals(4, op10.getReferencedModelElements().size());
assertEquals(1, op10.getIndex());
assertTrue(op10.isAdd());
}
// END COMPLEX CODE
/**
* Add several already contained children to an empty containment feature.
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddDifferentFeatureContained1ChildrenToEmpty() {
final TestElement section = Create.testElement();
final TestElement solution1 = Create.testElement();
final TestElement solution2 = Create.testElement();
final TestElement issue1 = Create.testElement();
final TestElement issue2 = Create.testElement();
Add.toProject(getLocalProject(), issue1);
Add.toProject(getLocalProject(), issue2);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), solution1);
Add.toProject(getLocalProject(), solution2);
final ModelElementId issue1Id = getProject().getModelElementId(issue1);
final ModelElementId issue2Id = getProject().getModelElementId(issue2);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId solution1Id = getProject().getModelElementId(solution1);
final ModelElementId solution2Id = getProject().getModelElementId(solution2);
Update.testElement(TestElementFeatures.containedElement(), issue1, solution1);
Update.testElement(TestElementFeatures.containedElement(), issue2, solution2);
clearOperations();
Add.toContainedElements(section, Arrays.asList(new TestElement[] { solution1, solution2 }));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 2 messages preserving the info on former parents for the solutions
// and one additional one, indicating the new parent for both of them
assertEquals(7, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final MultiReferenceOperation op6 = checkAndCast(subOperations.get(6), MultiReferenceOperation.class);
assertEquals(solution1Id, op1.getModelElementId());
assertEquals(solution2Id, op4.getModelElementId());
assertEquals(TestElementFeatures.srefContainer().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.srefContainer().getName(), op4.getFeatureName());
assertEquals(issue1Id, op1.getOldValue());
assertEquals(issue2Id, op4.getOldValue());
assertNull(op1.getNewValue());
assertNull(op4.getNewValue());
assertEquals(issue1Id, op0.getModelElementId());
assertEquals(issue2Id, op3.getModelElementId());
assertEquals(TestElementFeatures.containedElement().getName(), op0.getFeatureName());
assertEquals(TestElementFeatures.containedElement().getName(), op3.getFeatureName());
assertEquals(solution1Id, op0.getOldValue());
assertEquals(solution2Id, op3.getOldValue());
assertNull(op0.getNewValue());
assertNull(op3.getNewValue());
assertEquals(solution1Id, op2.getModelElementId());
assertEquals(solution2Id, op5.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op5.getFeatureName());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op5.getNewValue());
assertNull(op2.getOldValue());
assertNull(op5.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op6.getFeatureName());
assertEquals(sectionId, op6.getModelElementId());
assertEquals(solution1Id, op6.getReferencedModelElements().get(0));
assertEquals(solution2Id, op6.getReferencedModelElements().get(1));
assertEquals(2, op6.getReferencedModelElements().size());
assertEquals(0, op6.getIndex());
assertTrue(op6.isAdd());
}
// END COMPLEX CODE
/**
* add several already contained children to a non-empty containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
// BEGIN COMPLEX CODE
@Test
public void containmentAddDifferentFeatureContained1ChildrenToNonEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement issue1 = Create.testElement();
final TestElement issue2 = Create.testElement();
final TestElement solution1 = Create.testElement();
final TestElement solution2 = Create.testElement();
section.getContainedElements().add(Create.testElement()); // prefill section
Add.toProject(getLocalProject(), issue1);
Add.toProject(getLocalProject(), issue2);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), solution1);
Add.toProject(getLocalProject(), solution2);
Update.testElement(TestElementFeatures.containedElement(), issue1, solution1);
Update.testElement(TestElementFeatures.containedElement(), issue2, solution2);
clearOperations();
Add.toContainedElements(section, Arrays.asList(new TestElement[] { solution1, solution2 }));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
// now expectation is: we get 2 messages preserving the info on former parents for the solutions
// and one additional one, indicating the new parent for both of them
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(7, subOperations.size());
final ModelElementId sectionId = ModelUtil.getProject(section).getModelElementId(section);
final ModelElementId solution1Id = ModelUtil.getProject(solution1).getModelElementId(solution1);
final ModelElementId solution2Id = ModelUtil.getProject(solution2).getModelElementId(solution2);
final ModelElementId issue1Id = ModelUtil.getProject(issue1).getModelElementId(issue1);
final ModelElementId issue2Id = ModelUtil.getProject(issue2).getModelElementId(issue2);
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final MultiReferenceOperation op6 = checkAndCast(subOperations.get(6), MultiReferenceOperation.class);
assertEquals(solution1Id, op1.getModelElementId());
assertEquals(solution2Id, op4.getModelElementId());
assertEquals(TestElementFeatures.srefContainer().getName(), op1.getFeatureName());
assertEquals(TestElementFeatures.srefContainer().getName(), op4.getFeatureName());
assertEquals(issue1Id, op1.getOldValue());
assertEquals(issue2Id, op4.getOldValue());
assertNull(op1.getNewValue());
assertNull(op4.getNewValue());
assertEquals(issue1Id, op0.getModelElementId());
assertEquals(issue2Id, op3.getModelElementId());
assertEquals(TestElementFeatures.containedElement().getName(), op0.getFeatureName());
assertEquals(TestElementFeatures.containedElement().getName(), op3.getFeatureName());
assertEquals(solution1Id, op0.getOldValue());
assertEquals(solution2Id, op3.getOldValue());
assertNull(op0.getNewValue());
assertNull(op3.getNewValue());
assertEquals(solution1Id, op2.getModelElementId());
assertEquals(solution2Id, op5.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(TestElementFeatures.container().getName(), op5.getFeatureName());
assertEquals(sectionId, op2.getNewValue());
assertEquals(sectionId, op5.getNewValue());
assertNull(op2.getOldValue());
assertNull(op5.getOldValue());
assertEquals(sectionId, op6.getModelElementId());
assertEquals(TestElementFeatures.containedElements().getName(), op6.getFeatureName());
assertEquals(solution1Id, op6.getReferencedModelElements().get(0));
assertEquals(solution2Id, op6.getReferencedModelElements().get(1));
assertEquals(2, op6.getReferencedModelElements().size());
assertEquals(1, op6.getIndex());
assertTrue(op6.isAdd());
}
// END COMPLEX CODE
// BEGIN COMPLEX CODE
/**
* Add several already contained children to an empty containment feature.
*/
@Test
public void containmentAddMixedChildrenToEmpty() {
final TestElement section = Create.testElement();
final TestElement oldSection1 = Create.testElement();
final TestElement oldSection2 = Create.testElement();
final TestElement issue1 = Create.testElement();
final TestElement solution1 = Create.testElement();
final TestElement issue2 = Create.testElement();
final TestElement solution2 = Create.testElement();
final TestElement newTestElement = Create.testElement();
final TestElement sectionTestElement1 = Create.testElement();
final TestElement sectionTestElement2 = Create.testElement();
final TestElement sectionTestElement3 = Create.testElement();
final TestElement workPackage = Create.testElement();
final TestElement bugReport = Create.testElement();
Add.toProject(getLocalProject(), issue1);
Add.toProject(getLocalProject(), issue2);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldSection1);
Add.toProject(getLocalProject(), oldSection2);
Add.toProject(getLocalProject(), newTestElement);
Add.toProject(getLocalProject(), sectionTestElement1);
Add.toProject(getLocalProject(), sectionTestElement2);
Add.toProject(getLocalProject(), sectionTestElement3);
Add.toProject(getLocalProject(), solution1);
Add.toProject(getLocalProject(), solution2);
Add.toProject(getLocalProject(), workPackage);
Add.toProject(getLocalProject(), bugReport);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId solution1Id = getProject().getModelElementId(solution1);
final ModelElementId solution2Id = getProject().getModelElementId(solution2);
final ModelElementId issue1Id = getProject().getModelElementId(issue1);
final ModelElementId issue2Id = getProject().getModelElementId(issue2);
final ModelElementId newTestElementId = getProject().getModelElementId(newTestElement);
final ModelElementId oldSection1Id = getProject().getModelElementId(oldSection1);
final ModelElementId oldSection2Id = getProject().getModelElementId(oldSection2);
final ModelElementId sectionTestElement1Id = getProject().getModelElementId(sectionTestElement1);
final ModelElementId sectionTestElement2Id = getProject().getModelElementId(sectionTestElement2);
final ModelElementId sectionTestElement3Id = getProject().getModelElementId(sectionTestElement3);
final ModelElementId workPackageId = getProject().getModelElementId(workPackage);
final ModelElementId bugReportId = getProject().getModelElementId(bugReport);
final TestElement[] addedElements = { solution1, solution2, newTestElement, sectionTestElement1,
sectionTestElement2,
sectionTestElement3, bugReport };
Update.testElement(TestElementFeatures.containedElement(), issue1, solution1);
Update.testElement(TestElementFeatures.containedElement(), issue2, solution2);
Add.toContainedElements2(workPackage, bugReport);
Add.toContainedElements(oldSection1, sectionTestElement1);
Add.toContainedElements(oldSection1, sectionTestElement2);
Add.toContainedElements(oldSection2, sectionTestElement3);
assertTrue(oldSection1.getContainedElements().contains(sectionTestElement1));
assertTrue(oldSection1.getContainedElements().contains(sectionTestElement2));
assertTrue(oldSection2.getContainedElements().contains(sectionTestElement3));
assertTrue(workPackage.getContainedElements2().contains(bugReport));
clearOperations();
Add.toContainedElements(section, Arrays.asList(addedElements));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 6 messages preserving the info on former parents for the solutions
// and one additional one, indicating the new parent for both of them
assertEquals(16, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final SingleReferenceOperation op6 = checkAndCast(subOperations.get(6), SingleReferenceOperation.class);
final MultiReferenceOperation op7 = checkAndCast(subOperations.get(7), MultiReferenceOperation.class);
final SingleReferenceOperation op8 = checkAndCast(subOperations.get(8), SingleReferenceOperation.class);
final SingleReferenceOperation op9 = checkAndCast(subOperations.get(9), SingleReferenceOperation.class);
final MultiReferenceOperation op10 = checkAndCast(subOperations.get(10), MultiReferenceOperation.class);
final SingleReferenceOperation op11 = checkAndCast(subOperations.get(11), SingleReferenceOperation.class);
final MultiReferenceOperation op12 = checkAndCast(subOperations.get(12), MultiReferenceOperation.class);
final SingleReferenceOperation op13 = checkAndCast(subOperations.get(13), SingleReferenceOperation.class);
final SingleReferenceOperation op14 = checkAndCast(subOperations.get(14), SingleReferenceOperation.class);
final MultiReferenceOperation op15 = checkAndCast(subOperations.get(15), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.containedElement().getName(), op0.getFeatureName());
assertEquals(issue1Id, op0.getModelElementId());
assertEquals(solution1Id, op0.getOldValue());
assertNull(op0.getNewValue());
assertEquals(TestElementFeatures.srefContainer().getName(), op1.getFeatureName());
assertEquals(solution1Id, op1.getModelElementId());
assertEquals(issue1Id, op1.getOldValue());
assertNull(op1.getNewValue());
assertEquals(TestElementFeatures.container().getName(), op2.getFeatureName());
assertEquals(solution1Id, op2.getModelElementId());
assertEquals(sectionId, op2.getNewValue());
assertNull(op2.getOldValue());
assertEquals(TestElementFeatures.containedElement().getName(), op3.getFeatureName());
assertEquals(issue2Id, op3.getModelElementId());
assertNull(op3.getNewValue());
assertEquals(solution2Id, op3.getOldValue());
assertEquals(TestElementFeatures.srefContainer().getName(), op4.getFeatureName());
assertEquals(solution2Id, op4.getModelElementId());
assertEquals(issue2Id, op4.getOldValue());
assertNull(op4.getNewValue());
assertEquals(solution2Id, op5.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op5.getFeatureName());
assertEquals(sectionId, op5.getNewValue());
assertNull(op5.getOldValue());
assertEquals(newTestElementId, op6.getModelElementId());
assertEquals(TestElementFeatures.container().getName(), op6.getFeatureName());
assertEquals(sectionId, op6.getNewValue());
assertNull(op6.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op7.getFeatureName());
assertEquals(oldSection1Id, op7.getModelElementId());
assertEquals(sectionTestElement1Id, op7.getReferencedModelElements().get(0));
assertEquals(sectionTestElement2Id, op7.getReferencedModelElements().get(1));
assertEquals(2, op7.getReferencedModelElements().size());
assertFalse(op7.isAdd());
assertEquals(TestElementFeatures.container().getName(), op8.getFeatureName());
assertEquals(sectionTestElement1Id, op8.getModelElementId());
assertEquals(sectionId, op8.getNewValue());
assertEquals(oldSection1Id, op8.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op9.getFeatureName());
assertEquals(sectionTestElement2Id, op9.getModelElementId());
assertEquals(sectionId, op9.getNewValue());
assertEquals(oldSection1Id, op9.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op10.getFeatureName());
assertEquals(oldSection2Id, op10.getModelElementId());
assertEquals(sectionTestElement3Id, op10.getReferencedModelElements().get(0));
assertEquals(1, op10.getReferencedModelElements().size());
assertFalse(op10.isAdd());
assertEquals(TestElementFeatures.container().getName(), op11.getFeatureName());
assertEquals(sectionTestElement3Id, op11.getModelElementId());
assertEquals(sectionId, op11.getNewValue());
assertEquals(oldSection2Id, op11.getOldValue());
assertEquals(TestElementFeatures.containedElements2().getName(), op12.getFeatureName());
assertEquals(workPackageId, op12.getModelElementId());
assertEquals(bugReportId, op12.getReferencedModelElements().get(0));
assertEquals(1, op12.getReferencedModelElements().size());
assertFalse(op12.isAdd());
assertEquals(TestElementFeatures.container2().getName(), op13.getFeatureName());
assertEquals(bugReportId, op13.getModelElementId());
assertEquals(workPackageId, op13.getOldValue());
assertNull(op13.getNewValue());
assertEquals(TestElementFeatures.container().getName(), op14.getFeatureName());
assertEquals(bugReportId, op14.getModelElementId());
assertEquals(sectionId, op14.getNewValue());
assertNull(op14.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op15.getFeatureName());
assertEquals(7, op15.getReferencedModelElements().size());
assertEquals(0, op15.getIndex());
assertEquals(sectionId, op15.getModelElementId());
assertEquals(solution1Id, op15.getReferencedModelElements().get(0));
assertEquals(solution2Id, op15.getReferencedModelElements().get(1));
assertEquals(newTestElementId, op15.getReferencedModelElements().get(2));
assertEquals(sectionTestElement1Id, op15.getReferencedModelElements().get(3));
assertEquals(sectionTestElement2Id, op15.getReferencedModelElements().get(4));
assertEquals(sectionTestElement3Id, op15.getReferencedModelElements().get(5));
assertEquals(bugReportId, op15.getReferencedModelElements().get(6));
assertTrue(op15.isAdd());
}
/**
* Add several already contained children to an empty containment feature.
*/
@Test
public void containmentAddMixedChildrenToNonEmpty() {
final TestElement section = Create.testElement();
section.getContainedElements().add(Create.testElement()); // prefill section
final TestElement oldSection1 = Create.testElement();
final TestElement oldSection2 = Create.testElement();
final TestElement issue1 = Create.testElement();
final TestElement solution1 = Create.testElement();
final TestElement issue2 = Create.testElement();
final TestElement solution2 = Create.testElement();
final TestElement newTestElement = Create.testElement();
final TestElement sectionTestElement1 = Create.testElement();
final TestElement sectionTestElement2 = Create.testElement();
final TestElement sectionTestElement3 = Create.testElement();
final TestElement workPackage = Create.testElement();
final TestElement bugReport = Create.testElement();
Add.toProject(getLocalProject(), issue1);
Add.toProject(getLocalProject(), issue2);
Add.toProject(getLocalProject(), section);
Add.toProject(getLocalProject(), oldSection1);
Add.toProject(getLocalProject(), oldSection2);
Add.toProject(getLocalProject(), newTestElement);
Add.toProject(getLocalProject(), sectionTestElement1);
Add.toProject(getLocalProject(), sectionTestElement2);
Add.toProject(getLocalProject(), sectionTestElement3);
Add.toProject(getLocalProject(), solution1);
Add.toProject(getLocalProject(), solution2);
Add.toProject(getLocalProject(), workPackage);
Add.toProject(getLocalProject(), bugReport);
final ModelElementId issue1Id = getProject().getModelElementId(issue1);
final ModelElementId issue2Id = getProject().getModelElementId(issue2);
final ModelElementId oldSection1Id = getProject().getModelElementId(oldSection1);
final ModelElementId oldSection2Id = getProject().getModelElementId(oldSection2);
final ModelElementId sectionTestElement1Id = getProject().getModelElementId(sectionTestElement1);
final ModelElementId sectionTestElement2Id = getProject().getModelElementId(sectionTestElement2);
final ModelElementId sectionTestElement3Id = getProject().getModelElementId(sectionTestElement3);
final ModelElementId sectionId = getProject().getModelElementId(section);
final ModelElementId newTestElementId = getProject().getModelElementId(newTestElement);
final ModelElementId solution1Id = getProject().getModelElementId(solution1);
final ModelElementId solution2Id = getProject().getModelElementId(solution2);
final ModelElementId bugReportId = getProject().getModelElementId(bugReport);
final ModelElementId workPackageId = getProject().getModelElementId(workPackage);
final TestElement[] addedElements = { solution1, solution2, newTestElement, sectionTestElement1,
sectionTestElement2,
sectionTestElement3, bugReport };
Update.testElement(TestElementFeatures.containedElement(), issue1, solution1);
Update.testElement(TestElementFeatures.containedElement(), issue2, solution2);
Add.toContainedElements2(workPackage, bugReport);
Add.toContainedElements(oldSection1, sectionTestElement1);
Add.toContainedElements(oldSection1, sectionTestElement2);
Add.toContainedElements(oldSection2, sectionTestElement3);
assertTrue(oldSection1.getContainedElements().contains(sectionTestElement1));
assertTrue(oldSection1.getContainedElements().contains(sectionTestElement2));
assertTrue(oldSection2.getContainedElements().contains(sectionTestElement3));
assertTrue(workPackage.getContainedElements2().contains(bugReport));
clearOperations();
Add.toContainedElements(section, Arrays.asList(addedElements));
final List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
// now expectation is: we get 6 messages preserving the info on former parents for the solutions
// and one additional one, indicating the new parent for both of them
assertEquals(16, subOperations.size());
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final SingleReferenceOperation op2 = checkAndCast(subOperations.get(2), SingleReferenceOperation.class);
final SingleReferenceOperation op3 = checkAndCast(subOperations.get(3), SingleReferenceOperation.class);
final SingleReferenceOperation op4 = checkAndCast(subOperations.get(4), SingleReferenceOperation.class);
final SingleReferenceOperation op5 = checkAndCast(subOperations.get(5), SingleReferenceOperation.class);
final SingleReferenceOperation op6 = checkAndCast(subOperations.get(6), SingleReferenceOperation.class);
final MultiReferenceOperation op7 = checkAndCast(subOperations.get(7), MultiReferenceOperation.class);
final SingleReferenceOperation op8 = checkAndCast(subOperations.get(8), SingleReferenceOperation.class);
final SingleReferenceOperation op9 = checkAndCast(subOperations.get(9), SingleReferenceOperation.class);
final MultiReferenceOperation op10 = checkAndCast(subOperations.get(10), MultiReferenceOperation.class);
final SingleReferenceOperation op11 = checkAndCast(subOperations.get(11), SingleReferenceOperation.class);
final MultiReferenceOperation op12 = checkAndCast(subOperations.get(12), MultiReferenceOperation.class);
final SingleReferenceOperation op13 = checkAndCast(subOperations.get(13), SingleReferenceOperation.class);
final SingleReferenceOperation op14 = checkAndCast(subOperations.get(14), SingleReferenceOperation.class);
final MultiReferenceOperation op15 = checkAndCast(subOperations.get(15), MultiReferenceOperation.class);
assertEquals(issue1Id, op0.getModelElementId());
assertEquals(TestElementFeatures.containedElement().getName(), op0.getFeatureName());
assertEquals(solution1Id, op0.getOldValue());
assertNull(op0.getNewValue());
assertEquals(solution1Id, op1.getModelElementId());
assertEquals(TestElementFeatures.srefContainer().getName(), op1.getFeatureName());
assertEquals(issue1Id, op1.getOldValue());
assertNull(op1.getNewValue());
assertEquals(op2.getModelElementId(), solution1Id);
assertEquals(op2.getFeatureName(), TestElementFeatures.container().getName());
assertEquals(op2.getNewValue(), sectionId);
assertNull(op2.getOldValue());
assertEquals(op3.getModelElementId(), issue2Id);
assertEquals(TestElementFeatures.containedElement().getName(), op3.getFeatureName());
assertNull(op3.getNewValue());
assertEquals(op3.getOldValue(), solution2Id);
assertEquals(op4.getModelElementId(), solution2Id);
assertEquals(op4.getFeatureName(), TestElementFeatures.srefContainer().getName());
assertNull(op4.getNewValue());
assertEquals(op4.getOldValue(), issue2Id);
assertEquals(op5.getModelElementId(), solution2Id);
assertEquals(op5.getFeatureName(), TestElementFeatures.container().getName());
assertEquals(op5.getNewValue(), sectionId);
assertNull(op5.getOldValue());
assertEquals(op6.getModelElementId(), newTestElementId);
assertEquals(op6.getFeatureName(), TestElementFeatures.container().getName());
assertEquals(op6.getNewValue(), sectionId);
assertNull(op6.getOldValue());
assertEquals(op7.getModelElementId(), oldSection1Id);
assertEquals(op7.getFeatureName(), TestElementFeatures.containedElements().getName());
assertFalse(op7.isAdd());
assertEquals(op7.getReferencedModelElements().size(), 2);
assertEquals(op7.getReferencedModelElements().get(0), sectionTestElement1Id);
assertEquals(op7.getReferencedModelElements().get(1), sectionTestElement2Id);
assertEquals(TestElementFeatures.container().getName(), op8.getFeatureName());
assertEquals(sectionTestElement1Id, op8.getModelElementId());
assertEquals(sectionId, op8.getNewValue());
assertEquals(oldSection1Id, op8.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op9.getFeatureName());
assertEquals(sectionTestElement2Id, op9.getModelElementId());
assertEquals(sectionId, op9.getNewValue());
assertEquals(oldSection1Id, op9.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op10.getFeatureName());
assertEquals(oldSection2Id, op10.getModelElementId());
assertEquals(sectionTestElement3Id, op10.getReferencedModelElements().get(0));
assertEquals(1, op10.getReferencedModelElements().size());
assertFalse(op10.isAdd());
assertEquals(TestElementFeatures.container().getName(), op11.getFeatureName());
assertEquals(sectionTestElement3Id, op11.getModelElementId());
assertEquals(sectionId, op11.getNewValue());
assertEquals(oldSection2Id, op11.getOldValue());
assertEquals(TestElementFeatures.containedElements2().getName(), op12.getFeatureName());
assertEquals(workPackageId, op12.getModelElementId());
assertEquals(bugReportId, op12.getReferencedModelElements().get(0));
assertEquals(1, op12.getReferencedModelElements().size());
assertFalse(op12.isAdd());
assertEquals(TestElementFeatures.container2().getName(), op13.getFeatureName());
assertEquals(bugReportId, op13.getModelElementId());
assertEquals(workPackageId, op13.getOldValue());
assertNull(op13.getNewValue());
assertEquals(TestElementFeatures.container().getName(), op14.getFeatureName());
assertEquals(bugReportId, op14.getModelElementId());
assertEquals(sectionId, op14.getNewValue());
assertNull(op14.getOldValue());
assertEquals(TestElementFeatures.containedElements().getName(), op15.getFeatureName());
assertEquals(sectionId, op15.getModelElementId());
assertTrue(op15.isAdd());
assertEquals(1, op15.getIndex());
assertEquals(7, op15.getReferencedModelElements().size());
assertEquals(solution1Id, op15.getReferencedModelElements().get(0));
assertEquals(solution2Id, op15.getReferencedModelElements().get(1));
assertEquals(newTestElementId, op15.getReferencedModelElements().get(2));
assertEquals(sectionTestElement1Id, op15.getReferencedModelElements().get(3));
assertEquals(sectionTestElement2Id, op15.getReferencedModelElements().get(4));
assertEquals(sectionTestElement3Id, op15.getReferencedModelElements().get(5));
assertEquals(bugReportId, op15.getReferencedModelElements().get(6));
}
/**
* remove last child from a containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void containmentRemoveChildAndEmpty()
throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), section);
Add.toContainedElements(section, actor);
clearOperations();
final ModelElementId actorId = ModelUtil.getProject(actor).getModelElementId(actor);
Delete.fromContainedElements(section, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<ReferenceOperation> subOperations = checkAndCast(operations.get(0), CreateDeleteOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final ModelElementId sectionId = getProject().getModelElementId(section);
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(actorId, op0.getModelElementId());
assertEquals(sectionId, op0.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertNull(op0.getNewValue());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.containedElements().getName(), op1.getFeatureName());
assertEquals(sectionId, op1.getModelElementId());
assertEquals(0, op1.getIndex());
assertFalse(op1.isAdd());
}
/**
* remove all children from a containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void containmentRemoveChildrenAndEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
final TestElement[] actors = { actor1, actor2 };
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), section);
Add.toContainedElements(section, Arrays.asList(actors));
clearOperations();
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
Delete.fromContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(3, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
checkAndCast(operations.get(1), CreateDeleteOperation.class);
checkAndCast(operations.get(2), CreateDeleteOperation.class);
assertEquals(3, subOperations.size());
final ModelElementId sectionId = getProject().getModelElementId(section);
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(sectionId, op0.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertNull(op0.getNewValue());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(sectionId, op1.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertNull(op1.getNewValue());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(TestElementFeatures.containedElements().getName(), op2.getFeatureName());
assertEquals(sectionId, op2.getModelElementId());
assertEquals(0, op2.getIndex());
assertFalse(op2.isAdd());
}
/**
* remove non-last child from a containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void containmentRemoveChildPart() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement actor = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), section);
Add.toContainedElements(section, oldTestElement);
Add.toContainedElements(section, actor);
clearOperations();
final ModelElementId actorId = getProject().getModelElementId(actor);
Delete.fromContainedElements(section, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<ReferenceOperation> subOperations = checkAndCast(operations.get(0), CreateDeleteOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final ModelElementId sectionId = getProject().getModelElementId(section);
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(actorId, op0.getModelElementId());
assertEquals(sectionId, op0.getOldValue());
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertNull(op0.getNewValue());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(sectionId, op1.getModelElementId());
assertEquals(TestElementFeatures.containedElements().getName(), op1.getFeatureName());
assertEquals(1, op1.getIndex());
assertFalse(op1.isAdd());
}
/**
* add a child to an empty non-containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void nonContainmentAddChildToEmpty() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), useCase);
clearOperations();
Add.toNonContainedNToM(useCase, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof CompositeOperation);
final List<AbstractOperation> subOperations = ((CompositeOperation) operation).getSubOperations();
assertEquals(2, subOperations.size());
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
final MultiReferenceOperation op0 = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
final ModelElementId actorId = ModelUtil.getProject(actor).getModelElementId(actor);
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(actorId, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
final MultiReferenceOperation op1 = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op1.isAdd());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op1.getFeatureName());
assertEquals(op1.getModelElementId(), useCaseId);
assertEquals(op1.getIndex(), 0);
}
/**
* add some children to an empty non-containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void nonContainmentAddChildrenToEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), useCase);
final TestElement[] actors = { actor1, actor2 };
clearOperations();
Add.toNonContainedNToM(useCase, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof CompositeOperation);
final List<AbstractOperation> subOperations = ((CompositeOperation) operation).getSubOperations();
assertEquals(3, subOperations.size());
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
final MultiReferenceOperation op0 = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
final ModelElementId actor1Id = ModelUtil.getProject(actor1).getModelElementId(actor1);
final ModelElementId actor2Id = ModelUtil.getProject(actor2).getModelElementId(actor2);
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
final MultiReferenceOperation op1 = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op1.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(useCaseId, op1.getReferencedModelElements().get(0));
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
final MultiReferenceOperation op2 = (MultiReferenceOperation) subOperations.get(2);
assertTrue(op2.isAdd());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op2.getFeatureName());
assertEquals(op2.getModelElementId(), useCaseId);
assertEquals(op2.getIndex(), 0);
}
/**
* add a child to a non-empty non-containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void nonContainmentAddChildToNonEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement oldTestElement = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), useCase);
Add.toNonContainedNToM(useCase, oldTestElement);
clearOperations();
Add.toNonContainedNToM(useCase, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof CompositeOperation);
final List<AbstractOperation> subOperations = ((CompositeOperation) operation).getSubOperations();
assertEquals(2, subOperations.size());
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
final MultiReferenceOperation op0 = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
final ModelElementId actorId = ModelUtil.getProject(actor).getModelElementId(actor);
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(actorId, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
final MultiReferenceOperation op1 = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op1.isAdd());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op1.getFeatureName());
assertEquals(op1.getModelElementId(), useCaseId);
assertEquals(op1.getIndex(), 1);
}
/**
* add some children to a non-empty non-containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void nonContainmentAddChildrenToNonEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement oldTestElement = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), useCase);
final TestElement[] actors = { actor1, actor2 };
Add.toNonContainedNToM(useCase, oldTestElement);
clearOperations();
Add.toNonContainedNToM(useCase, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
final List<AbstractOperation> subOperations = ((CompositeOperation) operation).getSubOperations();
assertEquals(3, subOperations.size());
assertTrue(subOperations.get(0) instanceof MultiReferenceOperation);
final MultiReferenceOperation op0 = (MultiReferenceOperation) subOperations.get(0);
assertTrue(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
final ModelElementId actor1Id = ModelUtil.getProject(actor1).getModelElementId(actor1);
final ModelElementId actor2Id = ModelUtil.getProject(actor2).getModelElementId(actor2);
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertTrue(subOperations.get(1) instanceof MultiReferenceOperation);
final MultiReferenceOperation op1 = (MultiReferenceOperation) subOperations.get(1);
assertTrue(op1.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(useCaseId, op1.getReferencedModelElements().get(0));
assertTrue(subOperations.get(2) instanceof MultiReferenceOperation);
final MultiReferenceOperation op2 = (MultiReferenceOperation) subOperations.get(2);
assertTrue(op2.isAdd());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op2.getFeatureName());
assertEquals(op2.getModelElementId(), useCaseId);
assertEquals(op2.getIndex(), 1);
}
/**
* remove last child from non-containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void nonContainmentRemoveChildAndEmpty() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement actor = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), useCase);
Add.toNonContainedNToM(useCase, actor);
clearOperations();
Delete.fromNonContainedNToM(useCase, actor);
List<AbstractOperation> operations = forceGetOperations();
// expecting a composite operation here
assertEquals(1, operations.size());
if (operations.get(0) instanceof CompositeOperation) {
operations = ((CompositeOperation) operations.get(0)).getSubOperations();
} else {
fail("composite operation expected"); //$NON-NLS-1$
}
assertEquals(2, operations.size());
assertTrue(operations.get(0) instanceof MultiReferenceOperation);
final MultiReferenceOperation op0 = (MultiReferenceOperation) operations.get(0);
assertFalse(op0.isAdd());
assertEquals(1, op0.getReferencedModelElements().size());
final ModelElementId actorId = ModelUtil.getProject(actor).getModelElementId(actor);
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
assertEquals(op0.getModelElementId(), actorId);
assertEquals(op0.getIndex(), 0);
assertTrue(operations.get(1) instanceof MultiReferenceOperation);
final MultiReferenceOperation op1 = (MultiReferenceOperation) operations.get(1);
assertFalse(op1.isAdd());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op1.getFeatureName());
assertEquals(op1.getModelElementId(), useCaseId);
assertEquals(op1.getIndex(), 0);
}
/**
* Remove non-last child from non-containment feature.
*/
@Test
public void nonContainmentRemoveChildPart() {
final TestElement useCase = Create.testElement();
final TestElement actor = Create.testElement();
final TestElement oldTestElement = Create.testElement();
Add.toProject(getLocalProject(), actor);
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), useCase);
final ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
Add.toNonContainedNToM(useCase, oldTestElement);
Add.toNonContainedNToM(useCase, actor);
clearOperations();
Delete.fromNonContainedNToM(useCase, actor);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
assertEquals(1, op0.getReferencedModelElements().size());
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertEquals(actorId, op0.getModelElementId());
assertEquals(0, op0.getIndex());
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op1.getFeatureName());
assertEquals(1, op1.getIndex());
assertEquals(1, op1.getReferencedModelElements().size());
assertEquals(actorId, op1.getReferencedModelElements().get(0));
assertEquals(useCaseId, op1.getModelElementId());
assertFalse(op1.isAdd());
}
/**
* Remove all children from non-containment feature.
*/
@Test
public void nonContainmentRemoveChildrenAndEmpty() {
final TestElement useCase = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), useCase);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
final TestElement[] actors = { actor1, actor2 };
Add.toNonContainedNToM(useCase, Arrays.asList(actors));
clearOperations();
Delete.fromNonContainedNToM(useCase, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(3, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(useCaseId, op1.getReferencedModelElements().get(0));
assertFalse(op1.isAdd());
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op2.getFeatureName());
assertEquals(0, op2.getIndex());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(useCaseId, op2.getModelElementId());
assertFalse(op2.isAdd());
}
/**
* Remove some children from non-containment feature.
*/
@Test
public void nonContainmentRemoveChildrenPart() {
final TestElement useCase = Create.testElement();
final TestElement oldTestElement = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), useCase);
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
final TestElement[] actors = { actor1, actor2 };
Add.toNonContainedNToM(useCase, oldTestElement);
Add.toNonContainedNToM(useCase, Arrays.asList(actors));
clearOperations();
Delete.fromNonContainedNToM(useCase, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
assertEquals(3, subOperations.size());
final MultiReferenceOperation op0 = checkAndCast(subOperations.get(0), MultiReferenceOperation.class);
final MultiReferenceOperation op1 = checkAndCast(subOperations.get(1), MultiReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(useCaseId, op0.getReferencedModelElements().get(0));
assertFalse(op0.isAdd());
assertEquals(TestElementFeatures.nonContainedMToN().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(useCaseId, op1.getReferencedModelElements().get(0));
assertFalse(op1.isAdd());
assertEquals(TestElementFeatures.nonContainedNToM().getName(), op2.getFeatureName());
assertEquals(1, op2.getIndex());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(useCaseId, op2.getModelElementId());
assertFalse(op2.isAdd());
}
/**
* remove some children from a containment feature.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void containmentRemoveChildrenPart() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement section = Create.testElement();
final TestElement oldTestElement = Create.testElement();
final TestElement actor1 = Create.testElement();
final TestElement actor2 = Create.testElement();
final TestElement[] actors = { actor1, actor2 };
Add.toProject(getLocalProject(), oldTestElement);
Add.toProject(getLocalProject(), actor1);
Add.toProject(getLocalProject(), actor2);
Add.toProject(getLocalProject(), section);
Add.toContainedElements(section, oldTestElement);
Add.toContainedElements(section, Arrays.asList(actors));
clearOperations();
final ModelElementId actor1Id = getProject().getModelElementId(actor1);
final ModelElementId actor2Id = getProject().getModelElementId(actor2);
Delete.fromContainedElements(section, Arrays.asList(actors));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(3, operations.size());
final List<AbstractOperation> subOperations = checkAndCast(operations.get(0), CompositeOperation.class)
.getSubOperations();
checkAndCast(operations.get(1), CreateDeleteOperation.class);
checkAndCast(operations.get(2), CreateDeleteOperation.class);
assertEquals(3, subOperations.size());
final ModelElementId sectionId = ModelUtil.getProject(section).getModelElementId(section);
final SingleReferenceOperation op0 = checkAndCast(subOperations.get(0), SingleReferenceOperation.class);
final SingleReferenceOperation op1 = checkAndCast(subOperations.get(1), SingleReferenceOperation.class);
final MultiReferenceOperation op2 = checkAndCast(subOperations.get(2), MultiReferenceOperation.class);
assertEquals(TestElementFeatures.container().getName(), op0.getFeatureName());
assertEquals(actor1Id, op0.getModelElementId());
assertEquals(sectionId, op0.getOldValue());
assertNull(op0.getNewValue());
assertEquals(TestElementFeatures.container().getName(), op1.getFeatureName());
assertEquals(actor2Id, op1.getModelElementId());
assertEquals(sectionId, op1.getOldValue());
assertNull(op1.getNewValue());
assertEquals(TestElementFeatures.containedElements().getName(), op2.getFeatureName());
assertEquals(actor1Id, op2.getReferencedModelElements().get(0));
assertEquals(actor2Id, op2.getReferencedModelElements().get(1));
assertEquals(sectionId, op2.getModelElementId());
assertEquals(2, op2.getReferencedModelElements().size());
assertEquals(1, op2.getIndex());
assertFalse(op2.isAdd());
}
}
// END COMPLEX CODE