/** | |
* <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 org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand; | |
import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommandWithParameter; | |
import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommandWithResult; | |
import org.eclipse.emf.emfstore.client.test.testmodel.TestElement; | |
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation; | |
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiAttributeMoveOperation; | |
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiAttributeOperation; | |
import org.eclipse.emf.emfstore.server.model.versioning.operations.MultiAttributeSetOperation; | |
import org.junit.Test; | |
/** | |
* Conflicttests for MultiAttribute, -Set and -Move operations. | |
* | |
* @author wesendon | |
*/ | |
public class ConflictDetectionMultiAttributeTest extends ConflictDetectionTest { | |
/** | |
* Remove vs add. | |
*/ | |
@Test | |
public void multiAttRemoveVsAdd() { | |
TestElement testElement = new EMFStoreCommandWithResult<TestElement>() { | |
@Override | |
protected TestElement doRun() { | |
TestElement testElement = createFilledTestElement(3); | |
clearOperations(); | |
testElement.getStrings().remove(0); | |
return testElement; | |
} | |
}.run(false); | |
AbstractOperation removeOp = new EMFStoreCommandWithResult<AbstractOperation>() { | |
@Override | |
protected AbstractOperation doRun() { | |
AbstractOperation removeOp = checkAndGetOperation(MultiAttributeOperation.class); | |
return removeOp; | |
} | |
}.run(false); | |
new EMFStoreCommandWithParameter<TestElement>() { | |
@Override | |
public void doRun(TestElement testElement) { | |
testElement.getStrings().add(1, "inserted"); | |
} | |
}.run(testElement, false); | |
AbstractOperation addOp = new EMFStoreCommandWithResult<AbstractOperation>() { | |
@Override | |
protected AbstractOperation doRun() { | |
AbstractOperation addOp = checkAndGetOperation(MultiAttributeOperation.class); | |
return addOp; | |
} | |
}.run(false); | |
assertEquals(true, doConflict(removeOp, addOp)); | |
assertEquals(true, doConflict(addOp, removeOp)); | |
} | |
/** | |
* Add vs add. | |
*/ | |
@Test | |
public void multiAttAddVsAdd() { | |
final TestElement testElement = createFilledTestElement(3); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().add(0, "inserted1"); | |
} | |
}.run(false); | |
AbstractOperation add1 = myCheckAndGetOperation(MultiAttributeOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().add(1, "inserted2"); | |
} | |
}.run(false); | |
AbstractOperation add2 = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(true, doConflict(add1, add2)); | |
assertEquals(true, doConflict(add2, add1)); | |
} | |
/** | |
* remove vs remove. | |
*/ | |
@Test | |
public void multiAttRemoveVsRemove() { | |
final TestElement testElement = createFilledTestElement(3); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().remove(2); | |
} | |
}.run(false); | |
AbstractOperation remove1 = myCheckAndGetOperation(MultiAttributeOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().remove(1); | |
} | |
}.run(false); | |
AbstractOperation remove2 = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(true, doConflict(remove1, remove2)); | |
assertEquals(true, doConflict(remove2, remove1)); | |
} | |
/** | |
* Move vs add. | |
*/ | |
@Test | |
public void multiAttMoveVsAdd() { | |
final TestElement testElement = createFilledTestElement(3); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().add(0, "inserted"); | |
} | |
}.run(false); | |
AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(1, 2); | |
} | |
}.run(false); | |
AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
assertEquals(true, doConflict(add, move)); | |
assertEquals(true, doConflict(move, add)); | |
} | |
/** | |
* Move vs remove. | |
*/ | |
@Test | |
public void multiAttMoveVsRemove() { | |
final TestElement testElement = createFilledTestElement(3); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(2, 0); | |
} | |
}.run(false); | |
AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().remove(0); | |
} | |
}.run(false); | |
AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(true, doConflict(add, move)); | |
assertEquals(true, doConflict(move, add)); | |
} | |
/** | |
* Move vs move - conflict. | |
*/ | |
// Move vs move is a soft conflict | |
// @Test | |
// public void multiAttMoveVsMoveConflict() { | |
// new EMFStoreCommand() { | |
// @Override | |
// protected void doRun() { | |
// TestElement testElement = getFilledTestElement(3); | |
// clearOperations(); | |
// | |
// testElement.getStrings().move(1, 2); | |
// AbstractOperation move1 = checkAndGetOperation(MultiAttributeMoveOperation.class); | |
// | |
// testElement.getStrings().move(1, 0); | |
// AbstractOperation move2 = checkAndGetOperation(MultiAttributeMoveOperation.class); | |
// | |
// assertEquals(true, doConflict(move2, move1)); | |
// assertEquals(true, doConflict(move1, move2)); | |
// } | |
// }.run(false); | |
// } | |
/** | |
* Move vs move - no conflict. | |
*/ | |
@Test | |
public void multiAttMoveVsMoveNoConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(0, 1); | |
} | |
}.run(false); | |
AbstractOperation move1 = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(2, 3); | |
} | |
}.run(false); | |
AbstractOperation move2 = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
assertEquals(false, doConflict(move2, move1)); | |
assertEquals(false, doConflict(move1, move2)); | |
} | |
/** | |
* Set vs add - no conflict. | |
*/ | |
@Test | |
public void multiAttSetVsAddNoConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(0, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().add(1, "added"); | |
} | |
}.run(false); | |
AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(false, doConflict(set, add)); | |
assertEquals(false, doConflict(add, set)); | |
} | |
/** | |
* Set vs add - conflict. | |
*/ | |
@Test | |
public void multiAttSetVsAddConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(1, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().add(0, "added"); | |
} | |
}.run(false); | |
AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(true, doConflict(set, add)); | |
assertEquals(true, doConflict(add, set)); | |
} | |
/** | |
* Set vs remove - no conflict. | |
*/ | |
@Test | |
public void multiAttSetVsRemoveNoConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(0, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().remove(1); | |
} | |
}.run(false); | |
AbstractOperation remove = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(false, doConflict(set, remove)); | |
assertEquals(false, doConflict(remove, set)); | |
} | |
/** | |
* Set vs remove - conflict. | |
*/ | |
@Test | |
public void multiAttSetVsRemoveConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(1, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().remove(0); | |
} | |
}.run(false); | |
AbstractOperation remove = myCheckAndGetOperation(MultiAttributeOperation.class); | |
assertEquals(true, doConflict(set, remove)); | |
assertEquals(true, doConflict(remove, set)); | |
} | |
/** | |
* Move vs Set - conflict. | |
*/ | |
@Test | |
public void multiAttSetVsMoveConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(1, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(0, 2); | |
} | |
}.run(false); | |
AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
assertEquals(true, doConflict(set, move)); | |
assertEquals(true, doConflict(move, set)); | |
} | |
/** | |
* Move vs Set - no conflict. | |
*/ | |
@Test | |
public void multiAttSetVsMoveNoConflict() { | |
final TestElement testElement = createFilledTestElement(4); | |
myClearOperations(); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().set(1, "set"); | |
} | |
}.run(false); | |
AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class); | |
new EMFStoreCommand() { | |
@Override | |
protected void doRun() { | |
testElement.getStrings().move(2, 3); | |
} | |
}.run(false); | |
AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class); | |
assertEquals(false, doConflict(set, move)); | |
assertEquals(false, doConflict(move, set)); | |
} | |
} |