/**
* <copyright> Copyright (c) 2008-2009 Jonas Helming, Maximilian Koegel. All rights reserved. This program and the
* accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this
* distribution, and is available at http://www.eclipse.org/legal/epl-v10.html </copyright>
*/
package org.eclipse.emf.emfstore.client.test.conflictDetection;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.emfstore.client.model.ProjectSpace;
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.client.test.testmodel.TestElement;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
import org.eclipse.emf.emfstore.common.model.Project;
import org.eclipse.emf.emfstore.server.conflictDetection.ConflictDetector;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiReferenceOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiReferenceSetOperation;
import org.junit.Test;
/**
* Tests conflict detection behaviour on attributes.
*
* @author chodnick
*/
public class ConflictDetectionReferenceTest extends ConflictDetectionTest {
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void conflictSingleReference() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
final Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
final ModelElementId section1Id = getProject().getModelElementId(section1);
final ModelElementId section2Id = project2.getModelElementId(section1);
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
actor2.setLeafSection((LeafSection) project2.getModelElement(section2Id));
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(conflicts.size(), 1);
}
/**
* Tests if overwriting of single references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceSameValue() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
final Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
final ModelElementId section1Id = getProject().getModelElementId(section1);
final ModelElementId section2Id = section1Id;
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
// attention: same structure is being built here, should not conflict
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
actor2.setLeafSection((LeafSection) project2.getModelElement(section2Id));
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceUnrelated() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final UserTask task = RequirementFactory.eINSTANCE.createUserTask();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(task);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
final Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
final ModelElementId section1Id = getProject().getModelElementId(section1);
final ModelElementId task2Id = project2.getModelElementId(task);
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
actor2.setInitiatedUserTask((UserTask) project2.getModelElement(task2Id));
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(conflicts.size(), 0);
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void conflictSingleReferenceOpposite() {
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(solution1);
getProject().addModelElement(solution2);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issueId = getProject().getModelElementId(issue);
final ModelElementId solution1Id = getProject().getModelElementId(solution1);
ModelElementId solution2Id = getProject().getModelElementId(solution2);
final Issue issue1 = (Issue) getProject().getModelElement(issueId);
final Issue issue2 = (Issue) project2.getModelElement(issueId);
final Solution solution22 = (Solution) project2.getModelElement(solution2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
issue1.setSolution((Solution) getProject().getModelElement(solution1Id));
solution22.setIssue(issue2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(1, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceOppositeSameValue() {
final Issue issue = RationaleFactory.eINSTANCE.createIssue();
final Solution solution = RationaleFactory.eINSTANCE.createSolution();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(issue);
getProject().addModelElement(solution);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issueId = getProject().getModelElementId(issue);
ModelElementId solutionId = getProject().getModelElementId(solution);
final Issue issue1 = (Issue) getProject().getModelElement(issueId);
final Issue issue2 = (Issue) project2.getModelElement(issueId);
final Solution solution1 = (Solution) getProject().getModelElement(solutionId);
final Solution solution2 = (Solution) project2.getModelElement(solutionId);
new EMFStoreCommand() {
@Override
protected void doRun() {
issue1.setSolution(solution1);
solution2.setIssue(issue2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceOppositeUnrelated() {
final Issue issue = RationaleFactory.eINSTANCE.createIssue();
final Solution solution = RationaleFactory.eINSTANCE.createSolution();
final LeafSection section = DocumentFactory.eINSTANCE.createLeafSection();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(issue);
getProject().addModelElement(solution);
getProject().addModelElement(section);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issueId = getProject().getModelElementId(issue);
ModelElementId solution1Id = getProject().getModelElementId(solution);
ModelElementId sectionId = getProject().getModelElementId(section);
final Issue issue1 = (Issue) getProject().getModelElement(issueId);
final Issue issue2 = (Issue) project2.getModelElement(issueId);
final Solution solution1 = (Solution) getProject().getModelElement(solution1Id);
final LeafSection section2 = (LeafSection) project2.getModelElement(sectionId);
new EMFStoreCommand() {
@Override
protected void doRun() {
issue1.setSolution(solution1);
issue2.setLeafSection(section2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of single references is detected as conflict.
*/
@Test
public void conflictSingleMultiReference() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
final ModelElementId section1Id = getProject().getModelElementId(section1);
ModelElementId section2Id = getProject().getModelElementId(section2);
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
final LeafSection section22 = (LeafSection) project2.getModelElement(section2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
section22.getModelElements().add(actor2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(1, conflicts.size());
}
/**
* Tests if overwriting of single references is detected as conflict.
*/
@Test
public void noConflictSingleMultiReferenceSameValue() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
final ModelElementId section1Id = getProject().getModelElementId(section1);
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
final LeafSection section12 = (LeafSection) project2.getModelElement(section1Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
section12.getModelElements().add(actor2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleMultiReferenceUnrelated() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
final Project project2 = ps2.getProject();
ModelElementId actorId = getProject().getModelElementId(actor);
final ModelElementId section1Id = getProject().getModelElementId(section1);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
final Actor actor1 = (Actor) getProject().getModelElement(actorId);
final Actor actor2 = (Actor) project2.getModelElement(actorId);
new EMFStoreCommand() {
@Override
protected void doRun() {
actor1.setLeafSection((LeafSection) getProject().getModelElement(section1Id));
actor2.getInitiatedUseCases().add(((UseCase) project2.getModelElement(useCaseId)));
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(conflicts.size(), 0);
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void conflictSingleReferenceBothOpposite() {
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(solution1);
getProject().addModelElement(solution2);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issueId = getProject().getModelElementId(issue);
ModelElementId solution1Id = getProject().getModelElementId(solution1);
ModelElementId solution2Id = getProject().getModelElementId(solution2);
final Issue issue1 = (Issue) getProject().getModelElement(issueId);
final Issue issue2 = (Issue) project2.getModelElement(issueId);
final Solution solution1inProject1 = (Solution) getProject().getModelElement(solution1Id);
final Solution solution2inProject22 = (Solution) project2.getModelElement(solution2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
solution1inProject1.setIssue(issue1);
solution2inProject22.setIssue(issue2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(1, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceBothOppositeSameValue() {
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(solution1);
getProject().addModelElement(solution2);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issueId = getProject().getModelElementId(issue);
ModelElementId solution1Id = getProject().getModelElementId(solution1);
final Issue issue1 = (Issue) getProject().getModelElement(issueId);
final Issue issue2 = (Issue) project2.getModelElement(issueId);
final Solution solution1inProject1 = (Solution) getProject().getModelElement(solution1Id);
final Solution solution1inProject2 = (Solution) project2.getModelElement(solution1Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
solution1inProject1.setIssue(issue1);
solution1inProject2.setIssue(issue2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictSingleReferenceBothOppositeUnrelated() {
final Issue issue1 = RationaleFactory.eINSTANCE.createIssue();
final Issue issue2 = RationaleFactory.eINSTANCE.createIssue();
final Solution solution1 = RationaleFactory.eINSTANCE.createSolution();
final Solution solution2 = RationaleFactory.eINSTANCE.createSolution();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(issue1);
getProject().addModelElement(issue2);
getProject().addModelElement(solution1);
getProject().addModelElement(solution2);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId issue11Id = getProject().getModelElementId(issue1);
ModelElementId issue22Id = project2.getModelElementId(issue2);
ModelElementId solution1Id = getProject().getModelElementId(solution1);
ModelElementId solution2Id = getProject().getModelElementId(solution2);
final Issue issue11 = (Issue) getProject().getModelElement(issue11Id);
final Issue issue22 = (Issue) project2.getModelElement(issue22Id);
final Solution solution1inProject1 = (Solution) getProject().getModelElement(solution1Id);
final Solution solution2inProject2 = (Solution) project2.getModelElement(solution2Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
solution1inProject1.setIssue(issue11);
solution2inProject2.setIssue(issue22);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of single references is detected as conflict.
*/
@Test
public void conflictMultiMultiReferenceBothOpposite() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId actorId = getProject().getModelElementId(actor);
ModelElementId section11Id = getProject().getModelElementId(section1);
ModelElementId section22Id = getProject().getModelElementId(section2);
final Actor actor1 = (Actor) getProject().getModelElement(actorId);
final Actor actor2 = (Actor) project2.getModelElement(actorId);
final LeafSection section11 = (LeafSection) getProject().getModelElement(section11Id);
final LeafSection section22 = (LeafSection) project2.getModelElement(section22Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
section11.getModelElements().add(actor1);
section22.getModelElements().add(actor2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(1, conflicts.size());
}
/**
* Tests if overwriting of single references is detected as conflict.
*/
@Test
public void noConflictMultiMultiReferenceSameChange() {
final LeafSection section1 = DocumentFactory.eINSTANCE.createLeafSection();
final LeafSection section2 = DocumentFactory.eINSTANCE.createLeafSection();
final Actor actor = RequirementFactory.eINSTANCE.createActor();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(section1);
getProject().addModelElement(section2);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
Project project2 = ps2.getProject();
ModelElementId actorId = getProject().getModelElementId(actor);
ModelElementId section1Id = getProject().getModelElementId(section1);
final Actor actor1 = (Actor) getProject().getModelElement(actorId);
final Actor actor2 = (Actor) project2.getModelElement(actorId);
final LeafSection section1inProject1 = (LeafSection) getProject().getModelElement(section1Id);
final LeafSection section1inProject2 = (LeafSection) project2.getModelElement(section1Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
section1inProject1.getModelElements().add(actor1);
section1inProject2.getModelElements().add(actor2);
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(0, conflicts.size());
}
/**
* Tests if overwriting of references is detected as conflict.
*/
@Test
public void noConflictMultiMultiReferenceUnrelated() {
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);
getProject().addModelElement(actor);
getProjectSpace().getOperations().clear();
}
}.run(false);
ProjectSpace ps2 = cloneProjectSpace(getProjectSpace());
final Project project2 = ps2.getProject();
ModelElementId actor1Id = getProject().getModelElementId(actor);
ModelElementId actor2Id = actor1Id;
ModelElementId section1Id = getProject().getModelElementId(section);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
final Actor actor1 = (Actor) getProject().getModelElement(actor1Id);
final Actor actor2 = (Actor) project2.getModelElement(actor2Id);
final LeafSection section1 = (LeafSection) getProject().getModelElement(section1Id);
new EMFStoreCommand() {
@Override
protected void doRun() {
section1.getModelElements().add(actor1);
actor2.getInitiatedUseCases().add(((UseCase) project2.getModelElement(useCaseId)));
}
}.run(false);
List<AbstractOperation> ops1 = getProjectSpace().getLocalOperations().getOperations();
List<AbstractOperation> ops2 = ps2.getLocalOperations().getOperations();
ConflictDetector cd = new ConflictDetector(getConflictDetectionStrategy());
Set<AbstractOperation> conflicts = cd.getConflicting(ops1, ops2);
assertEquals(cd.getConflicting(ops1, ops2).size(), cd.getConflicting(ops2, ops1).size());
assertEquals(conflicts.size(), 0);
}
/**
* Set vs add - no conflict.
*/
@Test
public void noConflictMultiReferenceAddVsSet() {
final TestElement testElement = createTestElement();
final TestElement first = createTestElement();
final TestElement second = createTestElement();
final TestElement inserted = createTestElement();
final TestElement added = createTestElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().addAll(Arrays.asList(first, second));
clearOperations();
testElement.getReferences().set(1, inserted);
}
}.run(false);
AbstractOperation set = myCheckAndGetOperation(MultiReferenceSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().add(added);
}
}.run(false);
AbstractOperation add = myCheckAndGetOperation(MultiReferenceOperation.class);
assertEquals(false, doConflict(set, add));
assertEquals(false, doConflict(add, set));
}
/**
* Set vs remove - no conflict.
*/
@Test
public void noConflictMultiReferenceRemoveVsSet() {
final TestElement testElement = createTestElement();
final TestElement first = createTestElement();
final TestElement second = createTestElement();
final TestElement inserted = createTestElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().addAll(Arrays.asList(first, second));
clearOperations();
testElement.getReferences().remove(first);
}
}.run(false);
AbstractOperation remove = myCheckAndGetOperation(MultiReferenceOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().set(testElement.getReferences().indexOf(second), inserted);
}
}.run(false);
AbstractOperation set = myCheckAndGetOperation(MultiReferenceSetOperation.class);
assertEquals(false, doConflict(set, remove));
assertEquals(false, doConflict(remove, set));
}
/**
* Set vs remove - conflict.
*/
@Test
public void conflictMultiReferenceRemoveVsSet() {
final TestElement testElement = createTestElement();
final TestElement first = createTestElement();
final TestElement second = createTestElement();
final TestElement inserted = createTestElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().addAll(Arrays.asList(first, second));
clearOperations();
testElement.getReferences().remove(second);
}
}.run(false);
AbstractOperation remove = myCheckAndGetOperation(MultiReferenceOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getReferences().add(second);
clearOperations();
testElement.getReferences().set(testElement.getReferences().indexOf(second), inserted);
}
}.run(false);
AbstractOperation set = myCheckAndGetOperation(MultiReferenceSetOperation.class);
assertEquals(true, doConflict(set, remove));
assertEquals(true, doConflict(remove, set));
}
}