| /******************************************************************************* |
| * Copyright (c) 2008-2011 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 implementatin |
| * Edgar Mueller - refactorings to reduce code duplication |
| ******************************************************************************/ |
| package org.eclipse.emf.emfstore.client.conflictdetection.test; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertTrue; |
| |
| import java.util.Arrays; |
| import java.util.List; |
| import java.util.concurrent.Callable; |
| |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.emf.emfstore.client.test.common.dsl.Create; |
| import org.eclipse.emf.emfstore.client.util.ESVoidCallable; |
| import org.eclipse.emf.emfstore.client.util.RunESCommand; |
| import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace; |
| import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand; |
| 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.conflictDetection.ConflictBucket; |
| import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation; |
| import org.eclipse.emf.emfstore.test.model.TestElement; |
| import org.junit.Test; |
| |
| /** |
| * Tests conflict detection behaviour on attributes. |
| * |
| * @author chodnick |
| */ |
| public class ConflictDetectionMultiReferenceTest extends ConflictDetectionTest { |
| |
| private static final String SECTION2 = "section"; //$NON-NLS-1$ |
| private static final String DUMMY3 = "dummy"; //$NON-NLS-1$ |
| private static final String ACTOR2 = "actor"; //$NON-NLS-1$ |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictAddAddSameObjectSameIndex() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| assertEquals(getConflicts(ops1, oclonedProjectSpace).size(), |
| getConflicts(oclonedProjectSpace, ops1) |
| .size()); |
| // same operations going on in both working copies, no conflicts expected |
| assertEquals(1, conflicts.size()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddAddSameObjectSameIndexNonZero() { |
| |
| final TestElement section = Create.testElement(); |
| final TestElement actor = Create.testElement(); |
| final TestElement dummy = Create.testElement(); |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| section.getContainedElements().add(dummy); |
| getProject().addModelElement(actor); |
| clearOperations(); |
| } |
| }.run(false); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final ModelElementId actorId = getProject().getModelElementId(actor); |
| final ModelElementId sectionId = getProject().getModelElementId(section); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(1, conflictBucket.getTheirOperations().size()); |
| // same operations going on in both working copies, no conflicts expected |
| assertEquals(1, conflicts.size()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddAddDifferentObjectDifferentIndex() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| section2.getContainedElements().add(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops = forceGetOperations(); |
| final List<AbstractOperation> clonedOps = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops, clonedOps); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(1, conflictBucket.getTheirOperations().size()); |
| |
| // obviously an index-integrity conflict |
| assertEquals(conflicts.size(), 1); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| section2.getContainedElements().remove(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddParentSetRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(); |
| final ModelElementId otherSectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| actor2.setContainer(otherSection2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddRemoveIndirectlySameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(); |
| final ModelElementId otherSectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| otherSection2.getContainedElements().add(actor2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetAddParentSetRemoveSameObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| assertTrue(ModelUtil.areEqual(getProject(), clonedProject)); |
| assertTrue(clonedProjectSpace.getLocalChangePackage().isEmpty()); |
| |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement clonedActor = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement clonedSection = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement clonedOtherSection = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| setTestElement(actor, section); |
| setTestElement(clonedActor, clonedSection); |
| setTestElement(clonedActor, clonedOtherSection); |
| |
| final List<AbstractOperation> ops = forceGetOperations(); |
| final List<AbstractOperation> clonedProjectSpaceOps = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops, clonedProjectSpaceOps); |
| |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetAddRemoveIndirectlySameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement clonedActor = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement clonedSection = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement clonedOtherSection = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| clonedActor.setContainer(clonedSection); |
| clonedOtherSection.getContainedElements().add(clonedActor); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops = forceGetOperations(); |
| final List<AbstractOperation> clonedOps = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops, clonedOps); |
| |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetAddRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| actor1.setContainer(section1); |
| actor2.setContainer(section2); |
| section2.getContainedElements().remove(actor2); |
| } |
| }.run(false); |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetAddIndirectRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| actor1.setContainer(section1); |
| actor2.setContainer(section2); |
| otherSection2.getContainedElements().add(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddIndirectRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(); |
| final ModelElementId otherSectionId = createTestElement(true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| otherSection2.getContainedElements().add(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // hard conflict between add and remove, serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictRemoveRemoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| |
| createTestElement(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| |
| setTestElement(actor1, section1, true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section1.getContainedElements().remove(actor1); |
| section2.getContainedElements().remove(actor2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // no hard conflict |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(1, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetRemoveRemoveIndirectlySameObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| final ModelElementId actorId = createTestElement(); |
| |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| |
| setTestElement(actor, section, true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| otherSection2.getContainedElements().add(actor2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // no index conflict |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetRemoveParentSetRemoveSameObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId anotherSectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement otherSection = (TestElement) getProject().getModelElement(otherSectionId); |
| final TestElement anotherSection = (TestElement) getProject().getModelElement(anotherSectionId); |
| |
| setTestElement(actor, section, true); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final ModelElementId anotherSection2Id = clonedProject.getModelElementId(anotherSection); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| final TestElement anotherSection2 = (TestElement) clonedProject.getModelElement(anotherSection2Id); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| actor.setContainer(otherSection); |
| actor2.setContainer(anotherSection2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // a hard conflict, though. serialization matters |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(1, conflictBucket.getTheirOperations().size()); |
| |
| assertEquals(conflicts.size(), 1); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddMoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| |
| final TestElement dummy = (TestElement) getProject().getModelElement(dummyId); |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| |
| addToSection(section, true, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor1 = (TestElement) getProject().getModelElement(actorId); |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| |
| final TestElement section1 = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| RunESCommand.run(new ESVoidCallable() { |
| @Override |
| public void run() { |
| section1.getContainedElements().add(actor1); |
| section2.getContainedElements().add(actor2); |
| section2.getContainedElements().move(0, actor2); |
| } |
| }); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // index conflict arises: if the add happens before the move, the move will work |
| // if it does after the move, the move could be ineffective |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetAddMoveSameObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement dummy = (TestElement) getProject().getModelElement(dummyId); |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| |
| addToSection(section, true, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| section2.getContainedElements().add(actor2); |
| section2.getContainedElements().move(0, actor2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| // index conflict arises: if the add happens before the move, the move will work |
| // if it does after the move, the move could be ineffective |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(2, conflictBucket.getTheirOperations().size()); |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictMoveMoveSameObjectDifferentIndex() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy1 = getModelElement(dummyId); |
| final TestElement dummy2 = getModelElement(otherDummyId); |
| |
| addToSection(section, true, dummy1, dummy2, actor); |
| |
| assertEquals(section.getContainedElements().get(2), actor); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement actor2 = (TestElement) clonedProject.getModelElement(actorId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().move(1, actor); |
| section2.getContainedElements().move(0, actor2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| // an index conflict arises: result depends on which move comes last |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| final ConflictBucket conflictBucket = conflicts.get(0); |
| |
| assertEquals(1, conflictBucket.getMyOperations().size()); |
| assertEquals(1, conflictBucket.getTheirOperations().size()); |
| assertEquals(conflicts.size(), 1); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictAddParentSetRemoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| |
| addToSection(section, true, otherDummy, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement otherSection2 = getModelElement(clonedProject, otherSectionId); |
| final TestElement dummy2 = getModelElement(clonedProject, dummyId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().add(1, actor); |
| dummy2.setContainer(otherSection2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictAddParentSetRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId dummyId = createTestElement(); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement section = getModelElement(sectionId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(dummyId); |
| |
| addToSection(section, true, otherDummy, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().add(1, actor); |
| dummy2.setContainer(otherSection2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict (the change happens at the boundary) |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictParentSetAddRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final ModelElementId dummy2Id = clonedProject.getModelElementId(dummy); |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummy2Id); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| section2.getContainedElements().remove(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict (outcome does not depend on serialization) |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictParentSetAddRemoveIndirectlyDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| otherSection2.getContainedElements().add(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict (outcome does not depend on serialization) |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictParentSetAddParentSetRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(ACTOR2); |
| final ModelElementId dummyId = createTestElement(DUMMY3); |
| final ModelElementId sectionId = createTestElement(SECTION2); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(section); |
| dummy2.setContainer(otherSection2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict (outcome does not depend on serialization) |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final ModelElementId dummy2Id = clonedProject.getModelElementId(dummy); |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummy2Id); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().remove(actor); |
| section2.getContainedElements().remove(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveParentSetRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().remove(actor); |
| otherSection2.getContainedElements().add(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveRemoveIndirectlyDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| section.getContainedElements().remove(actor); |
| otherSection2.getContainedElements().add(dummy2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictParentSetRemoveRemoveIndirectlyDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| final ModelElementId anotherSectionId = createTestElement(false); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| final TestElement anotherSection = getModelElement(anotherSectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| actor.setContainer(anotherSection); |
| otherSection2.getContainedElements().add(dummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictParentSetRemoveParentSetRemoveDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId anotherSectionId = createTestElement(false); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| final TestElement anotherSection = getModelElement(anotherSectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| actor.setContainer(anotherSection); |
| dummy2.setContainer(otherSection2); |
| |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveIndirectlyRemoveIndirectlyDifferentObject() { |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| final ModelElementId anotherSectionId = createTestElement(); |
| |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement section = getModelElement(sectionId); |
| final TestElement anotherSection = getModelElement(anotherSectionId); |
| |
| addToSection(section, true, otherDummy, actor, dummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement dummy2 = (TestElement) clonedProject.getModelElement(dummyId); |
| final TestElement otherSection2 = (TestElement) clonedProject.getModelElement(otherSectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| anotherSection.getContainedElements().add(actor); |
| otherSection2.getContainedElements().add(dummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictAddMoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement anotherDummy = getModelElement(anotherDummyId); |
| |
| addToSection(section, true, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().add(0, actor); |
| section2.getContainedElements().move(1, anotherDummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveMoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement anotherDummy = getModelElement(anotherDummyId); |
| |
| addToSection(section, true, actor, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().remove(actor); |
| section2.getContainedElements().move(0, anotherDummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveMoveDifferentObjectSameIndex() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement anotherDummy = getModelElement(anotherDummyId); |
| |
| addToSection(section, true, actor, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().remove(dummy); |
| section2.getContainedElements().move(1, anotherDummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void conflictParentSetRemoveMoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(false); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement otherSection = getModelElement(otherSectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement anotherDummy = getModelElement(anotherDummyId); |
| |
| addToSection(section, true, actor, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| dummy.setContainer(otherSection); |
| section2.getContainedElements().move(1, anotherDummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertTrue(conflicts.isEmpty()); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictRemoveIndirectlyMoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| final ModelElementId otherSectionId = createTestElement(); |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = getModelElement(sectionId); |
| final TestElement otherSection = getModelElement(otherSectionId); |
| final TestElement actor = getModelElement(actorId); |
| final TestElement dummy = getModelElement(dummyId); |
| final TestElement otherDummy = getModelElement(otherDummyId); |
| final TestElement anotherDummy = getModelElement(anotherDummyId); |
| |
| addToSection(section, true, actor, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement section2 = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| otherSection.getContainedElements().add(dummy); |
| section2.getContainedElements().move(1, anotherDummy2); |
| } |
| }.run(false); |
| final List<AbstractOperation> ops = forceGetOperations(); |
| final List<AbstractOperation> clonedOps = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops, clonedOps); |
| // no index-integrity conflict: result independent of serialization |
| assertEquals(conflicts.size(), 0); |
| } |
| |
| /** |
| * Tests if manipulating multi-features is detected as a conflict. |
| */ |
| @Test |
| public void noConflictMoveMoveDifferentObject() { |
| |
| final ModelElementId sectionId = createTestElement(false); |
| |
| final ModelElementId actorId = createTestElement(); |
| final ModelElementId dummyId = createTestElement(); |
| final ModelElementId otherDummyId = createTestElement(); |
| final ModelElementId anotherDummyId = createTestElement(); |
| |
| final TestElement section = (TestElement) getProject().getModelElement(sectionId); |
| final TestElement actor = (TestElement) getProject().getModelElement(actorId); |
| final TestElement dummy = (TestElement) getProject().getModelElement(dummyId); |
| final TestElement otherDummy = (TestElement) getProject().getModelElement(otherDummyId); |
| final TestElement anotherDummy = (TestElement) getProject().getModelElement(anotherDummyId); |
| |
| addToSection(section, true, actor, dummy, otherDummy, anotherDummy); |
| |
| final ProjectSpace clonedProjectSpace = cloneProjectSpace(getProjectSpace()); |
| final Project clonedProject = clonedProjectSpace.getProject(); |
| |
| final TestElement anotherDummy2 = (TestElement) clonedProject.getModelElement(anotherDummyId); |
| final TestElement clonedSection = (TestElement) clonedProject.getModelElement(sectionId); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| section.getContainedElements().move(2, actor); |
| clonedSection.getContainedElements().move(0, anotherDummy2); |
| } |
| }.run(false); |
| |
| final List<AbstractOperation> ops1 = forceGetOperations(); |
| final List<AbstractOperation> oclonedProjectSpace = forceGetOperations(clonedProjectSpace); |
| |
| final List<ConflictBucket> conflicts = getConflicts(ops1, oclonedProjectSpace); |
| // no index-integrity conflict: result independent of serialization |
| assertEquals(0, conflicts.size()); |
| |
| } |
| |
| private ModelElementId createTestElement(final boolean shouldClearOperations) { |
| final TestElement actor = Create.testElement(); |
| return addToProject(actor, shouldClearOperations); |
| } |
| |
| /** |
| * Creates the test element and adds it to the project. |
| * |
| * @param name |
| * the name of the test element |
| * @return the ID of the created test element as assigned by the project |
| */ |
| private ModelElementId createTestElement(final String name) { |
| final TestElement actor = Create.testElement(name); |
| return addToProject(actor, false); |
| } |
| |
| private ModelElementId addToProject(final EObject eObject, final boolean shouldClearOperations) { |
| final ModelElementId id = RunESCommand.runWithResult(new Callable<ModelElementId>() { |
| public ModelElementId call() throws Exception { |
| getProject().addModelElement(eObject); |
| return getProject().getModelElementId(eObject); |
| } |
| }); |
| if (shouldClearOperations) { |
| clearOperations(); |
| } |
| return id; |
| } |
| |
| private ModelElementId createTestElement() { |
| return createTestElement(false); |
| } |
| |
| @SuppressWarnings({ "unchecked" }) |
| private <T> T getModelElement(Project project, ModelElementId id) { |
| return (T) project.getModelElement(id); |
| } |
| |
| @SuppressWarnings("unchecked") |
| private <T> T getModelElement(ModelElementId id) { |
| return (T) getProject().getModelElement(id); |
| } |
| |
| private void addToSection( |
| final TestElement section, |
| final boolean shouldClearOperations, |
| final TestElement... children) { |
| |
| RunESCommand.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| section.getContainedElements().addAll(Arrays.asList(children)); |
| if (shouldClearOperations) { |
| clearOperations(); |
| } |
| return null; |
| } |
| }); |
| } |
| |
| private void setTestElement(final TestElement actor, final TestElement leafSection) { |
| setTestElement(actor, leafSection, false); |
| } |
| |
| private void setTestElement(final TestElement actor, final TestElement leafSection, |
| final boolean shouldClearOperation) { |
| |
| RunESCommand.run(new Callable<Void>() { |
| public Void call() throws Exception { |
| actor.setContainer(leafSection); |
| return null; |
| } |
| }); |
| if (shouldClearOperation) { |
| clearOperations(); |
| } |
| } |
| |
| } |