| /******************************************************************************* |
| * Copyright 2011 Chair for Applied Software Engineering, |
| * Technische Universitaet Muenchen. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| ******************************************************************************/ |
| package org.eclipse.emf.emfstore.client.test.conflictDetection; |
| |
| import static org.junit.Assert.assertEquals; |
| import static org.junit.Assert.assertSame; |
| import static org.junit.Assert.fail; |
| |
| import java.util.List; |
| |
| import org.eclipse.emf.emfstore.client.model.CompositeOperationHandle; |
| import org.eclipse.emf.emfstore.client.model.exceptions.InvalidHandleException; |
| import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand; |
| import org.eclipse.emf.emfstore.client.test.model.document.DocumentFactory; |
| import org.eclipse.emf.emfstore.client.test.model.document.LeafSection; |
| import org.eclipse.emf.emfstore.client.test.model.rationale.Issue; |
| import org.eclipse.emf.emfstore.client.test.model.rationale.RationaleFactory; |
| import org.eclipse.emf.emfstore.client.test.model.rationale.Solution; |
| import org.eclipse.emf.emfstore.client.test.model.requirement.Actor; |
| import org.eclipse.emf.emfstore.client.test.model.requirement.RequirementFactory; |
| import org.eclipse.emf.emfstore.client.test.model.requirement.UseCase; |
| import org.eclipse.emf.emfstore.client.test.model.requirement.UserTask; |
| import org.eclipse.emf.emfstore.server.conflictDetection.ConflictDetector; |
| import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation; |
| import org.junit.Test; |
| |
| /** |
| * Tests conflict detection behaviour on attributes. |
| * |
| * @author chodnick |
| */ |
| public class ConflictDetectionRequiredRelationTest extends ConflictDetectionTest { |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByAdd() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, addActor).size()); |
| assertSame(cd.getRequired(ops, addActor).get(0), createActor); |
| |
| assertEquals(1, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByRemove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| section.getModelElements().remove(actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section], [remove actor from section] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation removeActor = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, removeActor).size()); |
| assertSame(cd.getRequired(ops, removeActor).get(0), createActor); |
| |
| assertEquals(0, cd.getRequiring(ops, removeActor).size()); |
| |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(2, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), removeActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByMove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor dummy = RequirementFactory.eINSTANCE.createActor(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| section.getModelElements().add(dummy); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| section.getModelElements().move(0, actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section], [move actor in section] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation moveActor = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(2, cd.getRequired(ops, moveActor).size()); |
| assertSame(cd.getRequired(ops, moveActor).get(0), createActor); |
| assertSame(cd.getRequired(ops, moveActor).get(1), addActor); |
| |
| assertEquals(0, cd.getRequiring(ops, moveActor).size()); |
| |
| assertEquals(1, cd.getRequiring(ops, addActor).size()); |
| assertSame(cd.getRequiring(ops, addActor).get(0), moveActor); |
| |
| assertEquals(2, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), moveActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByAttributeChange() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| actor.setName("this is a new name"); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section], [rename actor] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation nameActor = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, nameActor).size()); |
| assertSame(cd.getRequired(ops, nameActor).get(0), createActor); |
| |
| assertEquals(0, cd.getRequiring(ops, nameActor).size()); |
| |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(2, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), nameActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByReferenceChange() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final UserTask task = RequirementFactory.eINSTANCE.createUserTask(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(task); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| actor.setInitiatedUserTask(task); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section], [task actor] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation taskActor = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, taskActor).size()); |
| assertSame(cd.getRequired(ops, taskActor).get(0), createActor); |
| |
| assertEquals(0, cd.getRequiring(ops, taskActor).size()); |
| |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(2, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), taskActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByMultiChange() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(useCase); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| actor.getInitiatedUseCases().add(useCase); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [Create actor], [add actor to section], [add usecase to actor] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation caseActor = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, caseActor).size()); |
| assertSame(cd.getRequired(ops, caseActor).get(0), createActor); |
| |
| assertEquals(0, cd.getRequiring(ops, caseActor).size()); |
| |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(2, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), caseActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByIndirectChange() { |
| |
| final Issue issue = RationaleFactory.eINSTANCE.createIssue(); |
| final Solution solution1 = RationaleFactory.eINSTANCE.createSolution(); |
| final Solution solution2 = RationaleFactory.eINSTANCE.createSolution(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(issue); |
| getProject().addModelElement(solution2); |
| // issue.setSolution(solution2); |
| |
| clearOperations(); |
| getProject().addModelElement(solution1); |
| issue.setSolution(solution1); |
| issue.setSolution(solution2); |
| |
| } |
| }.run(false); |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [create solution1], [set solution 1], [set solution 2] |
| AbstractOperation createSolution1 = ops.get(0); |
| AbstractOperation setSolution1 = ops.get(1); |
| AbstractOperation setSolution2 = ops.get(2); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, setSolution2).size()); |
| assertEquals(3, cd.getRequiring(ops, createSolution1).size()); |
| assertSame(cd.getRequiring(ops, createSolution1).get(0), setSolution1); |
| assertSame(cd.getRequiring(ops, createSolution1).get(1), setSolution2); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByDelete() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| clearOperations(); |
| section.getModelElements().add(actor); |
| actor.setName("name"); |
| getProject().deleteModelElement(actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [create actor], [addActor], [nameActor], [delete actor] |
| AbstractOperation createActor = ops.get(0); |
| AbstractOperation addActor = ops.get(1); |
| AbstractOperation nameActor = ops.get(2); |
| AbstractOperation deleteActor = ops.get(3); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, deleteActor).size()); |
| assertSame(cd.getRequired(ops, deleteActor).get(0), createActor); |
| |
| assertEquals(1, cd.getRequired(ops, nameActor).size()); |
| assertSame(cd.getRequired(ops, nameActor).get(0), createActor); |
| |
| assertEquals(1, cd.getRequired(ops, addActor).size()); |
| assertSame(cd.getRequired(ops, addActor).get(0), createActor); |
| |
| assertEquals(3, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), nameActor); |
| assertSame(cd.getRequiring(ops, createActor).get(2), deleteActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireCreateByChangeInDeletree() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| clearOperations(); |
| getProject().addModelElement(section); |
| section.getModelElements().add(actor); |
| actor.setName("name"); |
| getProject().deleteModelElement(section); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [create section], [create actor], [add actor], [name actor], [delete section] |
| AbstractOperation createSection = ops.get(0); |
| AbstractOperation createActor = ops.get(1); |
| AbstractOperation addActor = ops.get(2); |
| AbstractOperation nameActor = ops.get(3); |
| AbstractOperation deleteSection = ops.get(4); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, createSection).size()); |
| assertEquals(0, cd.getRequired(ops, createActor).size()); |
| |
| assertEquals(2, cd.getRequired(ops, addActor).size()); |
| assertSame(cd.getRequired(ops, addActor).get(0), createSection); |
| assertSame(cd.getRequired(ops, addActor).get(1), createActor); |
| |
| assertEquals(1, cd.getRequired(ops, nameActor).size()); |
| assertSame(cd.getRequired(ops, nameActor).get(0), createActor); |
| |
| assertEquals(1, cd.getRequired(ops, deleteSection).size()); |
| assertSame(cd.getRequired(ops, deleteSection).get(0), createSection); |
| |
| assertEquals(2, cd.getRequiring(ops, createSection).size()); |
| assertSame(cd.getRequiring(ops, createSection).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createSection).get(1), deleteSection); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireSingleRefByMove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor dummy = RequirementFactory.eINSTANCE.createActor(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(actor); |
| section.getModelElements().add(dummy); |
| |
| clearOperations(); |
| |
| actor.setLeafSection(section); |
| section.getModelElements().move(0, actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [move actor in section] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation moveActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, moveActor).size()); |
| assertSame(cd.getRequired(ops, moveActor).get(0), addActor); |
| |
| assertEquals(0, cd.getRequiring(ops, moveActor).size()); |
| |
| assertEquals(1, cd.getRequiring(ops, addActor).size()); |
| assertSame(cd.getRequiring(ops, addActor).get(0), moveActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireSingleRefByRemove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(actor); |
| |
| clearOperations(); |
| |
| actor.setLeafSection(section); |
| section.getModelElements().remove(actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [remove actor from section] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation removeActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| // the remove does not required an add, as per specification |
| assertEquals(0, cd.getRequired(ops, removeActor).size()); |
| assertEquals(0, cd.getRequiring(ops, removeActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireSingleRefByIndirectRemove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| |
| clearOperations(); |
| |
| actor.setLeafSection(section); |
| section2.getModelElements().add(actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [composite remove/add actor to section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation relocateActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, relocateActor).size()); |
| assertEquals(0, cd.getRequiring(ops, relocateActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireMultiRefByIndirectRemove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| |
| clearOperations(); |
| |
| section.getModelElements().add(actor); |
| section2.getModelElements().add(actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [composite remove/add actor to section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation relocateActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, relocateActor).size()); |
| assertEquals(0, cd.getRequiring(ops, relocateActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireMultiRefByRemove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(actor); |
| |
| clearOperations(); |
| |
| section.getModelElements().add(actor); |
| section.getModelElements().remove(actor); |
| |
| } |
| }.run(false); |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [remove actor] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation removeActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| // the remove does not need the add as per spec |
| assertEquals(0, cd.getRequired(ops, removeActor).size()); |
| assertEquals(0, cd.getRequiring(ops, removeActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireMultiRefByMove() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| final Actor dummy = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(actor); |
| section.getModelElements().add(dummy); |
| |
| clearOperations(); |
| |
| section.getModelElements().add(actor); |
| section.getModelElements().move(0, actor); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [move actor] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation moveActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, moveActor).size()); |
| assertSame(cd.getRequired(ops, moveActor).get(0), addActor); |
| |
| assertEquals(0, cd.getRequiring(ops, moveActor).size()); |
| |
| assertEquals(1, cd.getRequiring(ops, addActor).size()); |
| assertSame(cd.getRequiring(ops, addActor).get(0), moveActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| * |
| * @throws InvalidHandleException if something goes wrong |
| */ |
| @Test |
| public void requireCompositeMultiRefByCompositeMove() throws InvalidHandleException { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| final Actor dummy = RequirementFactory.eINSTANCE.createActor(); |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(actor); |
| section.getModelElements().add(dummy); |
| clearOperations(); |
| |
| CompositeOperationHandle handle1 = getProjectSpace().beginCompositeOperation(); |
| section.getModelElements().add(actor); |
| try { |
| handle1.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| CompositeOperationHandle handle2 = getProjectSpace().beginCompositeOperation(); |
| section.getModelElements().move(0, actor); |
| try { |
| handle2.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [composite add actor to section], [composite move actor in section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation moveActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(1, cd.getRequired(ops, moveActor).size()); |
| assertSame(cd.getRequired(ops, moveActor).get(0), addActor); |
| |
| assertEquals(0, cd.getRequiring(ops, moveActor).size()); |
| |
| assertEquals(1, cd.getRequiring(ops, addActor).size()); |
| assertSame(cd.getRequiring(ops, addActor).get(0), moveActor); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| * |
| * @throws InvalidHandleException if something goes wrong |
| */ |
| @Test |
| public void requireCompositeMultiRefByCompositeIndirectRemove() throws InvalidHandleException { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| clearOperations(); |
| |
| CompositeOperationHandle handle1 = getProjectSpace().beginCompositeOperation(); |
| section.getModelElements().add(actor); |
| try { |
| handle1.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| CompositeOperationHandle handle2 = getProjectSpace().beginCompositeOperation(); |
| section2.getModelElements().add(actor); |
| try { |
| handle2.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [composite add actor to section], [composite composite remove/add actor to section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation relocateActor = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, relocateActor).size()); |
| assertEquals(0, cd.getRequiring(ops, relocateActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| * |
| * @throws InvalidHandleException |
| * @throws InvalidHandleException if something goes wrong |
| */ |
| @Test |
| public void requireUnrelatedCompositeOps() throws InvalidHandleException { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| final Actor actor2 = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| getProject().addModelElement(actor2); |
| clearOperations(); |
| |
| CompositeOperationHandle handle1 = getProjectSpace().beginCompositeOperation(); |
| section.getModelElements().add(actor); |
| try { |
| handle1.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| CompositeOperationHandle handle2 = getProjectSpace().beginCompositeOperation(); |
| section2.getModelElements().add(actor2); |
| try { |
| handle2.end("", "", null); |
| } catch (InvalidHandleException e) { |
| fail(); |
| } |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [composite add actor to section], [composite add actor2 to section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation addActor2 = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor2).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor2).size()); |
| |
| } |
| |
| // BEGIN COMPLEX CODE |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireUnrelatedOps() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| final Actor actor2 = RequirementFactory.eINSTANCE.createActor(); |
| |
| new EMFStoreCommand() { |
| |
| @Override |
| protected void doRun() { |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| getProject().addModelElement(actor2); |
| |
| clearOperations(); |
| |
| section.getModelElements().add(actor); |
| section2.getModelElements().add(actor2); |
| |
| } |
| }.run(false); |
| |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops are [add actor to section], [add actor2 to section2] |
| AbstractOperation addActor = ops.get(0); |
| AbstractOperation addActor2 = ops.get(1); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(0, cd.getRequired(ops, addActor2).size()); |
| assertEquals(0, cd.getRequiring(ops, addActor2).size()); |
| |
| } |
| |
| /** |
| * Tests requires & requiring relation. |
| */ |
| @Test |
| public void requireComplexTest() { |
| |
| final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection(); |
| final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection(); |
| final Actor actor = RequirementFactory.eINSTANCE.createActor(); |
| final Actor actor2 = RequirementFactory.eINSTANCE.createActor(); |
| final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase(); |
| final UserTask task = RequirementFactory.eINSTANCE.createUserTask(); |
| |
| new EMFStoreCommand() { |
| @Override |
| protected void doRun() { |
| clearOperations(); |
| |
| getProject().addModelElement(section); |
| getProject().addModelElement(section2); |
| getProject().addModelElement(actor); |
| getProject().addModelElement(actor2); |
| getProject().addModelElement(useCase); |
| getProject().addModelElement(task); |
| |
| section.getModelElements().add(actor); |
| actor.setName("actor"); |
| section.setName("section"); |
| section2.setLeafSection(section); |
| section2.getModelElements().add(actor2); |
| section2.getModelElements().add(actor); |
| task.setInitiatingActor(actor); |
| useCase.getParticipatingActors().add(actor); |
| useCase.getParticipatingActors().add(actor2); |
| useCase.getParticipatingActors().move(1, actor); |
| getProject().deleteModelElement(section); |
| } |
| }.run(false); |
| List<AbstractOperation> ops = getProjectSpace().getOperations(); |
| |
| // ops lineup |
| AbstractOperation createSection = ops.get(0); |
| AbstractOperation createSection2 = ops.get(1); |
| AbstractOperation createActor = ops.get(2); |
| AbstractOperation createActor2 = ops.get(3); |
| AbstractOperation createUseCase = ops.get(4); |
| AbstractOperation createTask = ops.get(5); |
| AbstractOperation addActor = ops.get(6); |
| AbstractOperation nameActor = ops.get(7); |
| AbstractOperation nameSection = ops.get(8); |
| AbstractOperation addSection2 = ops.get(9); |
| AbstractOperation addActor2 = ops.get(10); |
| AbstractOperation relocateActor = ops.get(11); |
| AbstractOperation taskActor = ops.get(12); |
| AbstractOperation caseActor = ops.get(13); |
| AbstractOperation caseActor2 = ops.get(14); |
| AbstractOperation moveActor = ops.get(15); |
| AbstractOperation deleteSection = ops.get(16); |
| |
| ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy()); |
| |
| assertEquals(0, cd.getRequired(ops, createSection).size()); |
| assertEquals(5, cd.getRequiring(ops, createSection).size()); |
| assertSame(cd.getRequiring(ops, createSection).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createSection).get(1), nameSection); |
| assertSame(cd.getRequiring(ops, createSection).get(2), addSection2); |
| assertSame(cd.getRequiring(ops, createSection).get(3), relocateActor); |
| assertSame(cd.getRequiring(ops, createSection).get(4), deleteSection); |
| |
| assertEquals(0, cd.getRequired(ops, createSection2).size()); |
| assertEquals(3, cd.getRequiring(ops, createSection2).size()); |
| assertSame(cd.getRequiring(ops, createSection2).get(0), addSection2); |
| assertSame(cd.getRequiring(ops, createSection2).get(1), addActor2); |
| assertSame(cd.getRequiring(ops, createSection2).get(2), relocateActor); |
| |
| assertEquals(0, cd.getRequired(ops, createActor).size()); |
| assertEquals(6, cd.getRequiring(ops, createActor).size()); |
| assertSame(cd.getRequiring(ops, createActor).get(0), addActor); |
| assertSame(cd.getRequiring(ops, createActor).get(1), nameActor); |
| assertSame(cd.getRequiring(ops, createActor).get(2), relocateActor); |
| assertSame(cd.getRequiring(ops, createActor).get(3), taskActor); |
| assertSame(cd.getRequiring(ops, createActor).get(4), caseActor); |
| assertSame(cd.getRequiring(ops, createActor).get(5), moveActor); |
| |
| assertEquals(0, cd.getRequired(ops, createActor2).size()); |
| assertEquals(2, cd.getRequiring(ops, createActor2).size()); |
| assertSame(cd.getRequiring(ops, createActor2).get(0), addActor2); |
| assertSame(cd.getRequiring(ops, createActor2).get(1), caseActor2); |
| |
| assertEquals(0, cd.getRequired(ops, createUseCase).size()); |
| assertEquals(3, cd.getRequiring(ops, createUseCase).size()); |
| assertSame(cd.getRequiring(ops, createUseCase).get(0), caseActor); |
| assertSame(cd.getRequiring(ops, createUseCase).get(1), caseActor2); |
| assertSame(cd.getRequiring(ops, createUseCase).get(2), moveActor); |
| |
| assertEquals(0, cd.getRequired(ops, createTask).size()); |
| assertEquals(1, cd.getRequiring(ops, createTask).size()); |
| assertSame(cd.getRequiring(ops, createTask).get(0), taskActor); |
| |
| assertEquals(2, cd.getRequired(ops, addActor).size()); |
| assertSame(cd.getRequired(ops, addActor).get(0), createSection); |
| assertSame(cd.getRequired(ops, addActor).get(1), createActor); |
| assertEquals(0, cd.getRequiring(ops, addActor).size()); |
| |
| assertEquals(1, cd.getRequired(ops, nameActor).size()); |
| assertSame(cd.getRequired(ops, nameActor).get(0), createActor); |
| assertEquals(0, cd.getRequiring(ops, nameActor).size()); |
| |
| assertEquals(1, cd.getRequired(ops, nameSection).size()); |
| assertSame(cd.getRequired(ops, nameSection).get(0), createSection); |
| assertEquals(0, cd.getRequiring(ops, nameSection).size()); |
| |
| assertEquals(2, cd.getRequired(ops, addSection2).size()); |
| assertSame(cd.getRequired(ops, addSection2).get(0), createSection); |
| assertSame(cd.getRequired(ops, addSection2).get(1), createSection2); |
| assertEquals(0, cd.getRequiring(ops, addSection2).size()); |
| |
| assertEquals(2, cd.getRequired(ops, addActor2).size()); |
| assertSame(cd.getRequired(ops, addActor2).get(0), createSection2); |
| assertSame(cd.getRequired(ops, addActor2).get(1), createActor2); |
| assertEquals(0, cd.getRequiring(ops, addActor2).size()); |
| |
| assertEquals(3, cd.getRequired(ops, relocateActor).size()); |
| // note, section create is required, because the relocation goes from |
| // section to section2, and the remove from section requires the |
| // create, as per specification |
| assertSame(cd.getRequired(ops, relocateActor).get(0), createSection); |
| assertSame(cd.getRequired(ops, relocateActor).get(1), createSection2); |
| assertSame(cd.getRequired(ops, relocateActor).get(2), createActor); |
| assertEquals(0, cd.getRequiring(ops, relocateActor).size()); |
| |
| assertEquals(2, cd.getRequired(ops, taskActor).size()); |
| assertSame(cd.getRequired(ops, taskActor).get(0), createActor); |
| assertSame(cd.getRequired(ops, taskActor).get(1), createTask); |
| assertEquals(0, cd.getRequiring(ops, taskActor).size()); |
| |
| assertEquals(2, cd.getRequired(ops, caseActor).size()); |
| assertSame(cd.getRequired(ops, caseActor).get(0), createActor); |
| assertSame(cd.getRequired(ops, caseActor).get(1), createUseCase); |
| assertEquals(1, cd.getRequiring(ops, caseActor).size()); |
| assertSame(cd.getRequiring(ops, caseActor).get(0), moveActor); |
| |
| assertEquals(2, cd.getRequired(ops, caseActor2).size()); |
| assertSame(cd.getRequired(ops, caseActor2).get(0), createActor2); |
| assertSame(cd.getRequired(ops, caseActor2).get(1), createUseCase); |
| assertEquals(0, cd.getRequiring(ops, caseActor2).size()); |
| |
| assertEquals(3, cd.getRequired(ops, moveActor).size()); |
| assertSame(cd.getRequired(ops, moveActor).get(0), createActor); |
| assertSame(cd.getRequired(ops, moveActor).get(1), createUseCase); |
| assertSame(cd.getRequired(ops, moveActor).get(2), caseActor); |
| assertEquals(0, cd.getRequiring(ops, moveActor).size()); |
| |
| assertEquals(1, cd.getRequired(ops, deleteSection).size()); |
| assertSame(cd.getRequired(ops, deleteSection).get(0), createSection); |
| assertEquals(0, cd.getRequiring(ops, deleteSection).size()); |
| } |
| // END COMPLEX CODE |
| |
| } |