blob: 93fa98318fa01fdd77fa9713e7c307e371e56691 [file] [log] [blame]
/*******************************************************************************
* 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:
* wesendon
******************************************************************************/
package org.eclipse.emf.emfstore.client.conflictdetection.test;
import static org.junit.Assert.assertEquals;
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.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommandWithParameter;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommandWithResult;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiAttributeMoveOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiAttributeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiAttributeSetOperation;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;
/**
* Conflicttests for MultiAttribute, -Set and -Move operations.
*
* @author wesendon
*/
public class ConflictDetectionMultiAttributeTest extends ConflictDetectionTest {
private static final String VALUE = "value"; //$NON-NLS-1$
private static final String ADDED = "added"; //$NON-NLS-1$
private static final String SET = "set"; //$NON-NLS-1$
private static final String INSERTED2 = "inserted2"; //$NON-NLS-1$
private static final String INSERTED1 = "inserted1"; //$NON-NLS-1$
private static final String INSERTED = "inserted"; //$NON-NLS-1$
/**
* Remove vs add.
*/
@Test
public void multiAttRemoveVsAdd() {
final TestElement testElement = new EMFStoreCommandWithResult<TestElement>() {
@Override
protected TestElement doRun() {
final TestElement testElement = createFilledTestElement(3);
clearOperations();
testElement.getStrings().remove(0);
return testElement;
}
}.run(false);
final AbstractOperation removeOp = new EMFStoreCommandWithResult<AbstractOperation>() {
@Override
protected AbstractOperation doRun() {
final 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);
final AbstractOperation addOp = new EMFStoreCommandWithResult<AbstractOperation>() {
@Override
protected AbstractOperation doRun() {
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().add(0, INSERTED1);
}
}.run(false);
final AbstractOperation add1 = myCheckAndGetOperation(MultiAttributeOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().add(1, INSERTED2);
}
}.run(false);
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(2);
}
}.run(false);
final AbstractOperation remove1 = myCheckAndGetOperation(MultiAttributeOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(1);
}
}.run(false);
final 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);
clearOperations();
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
testElement.getStrings().add(0, INSERTED);
}
});
final AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(1, 2);
}
}.run(false);
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(2, 0);
}
}.run(false);
final AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(0);
}
}.run(false);
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(0, 1);
}
}.run(false);
final AbstractOperation move1 = myCheckAndGetOperation(MultiAttributeMoveOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(2, 3);
}
}.run(false);
final AbstractOperation move2 = myCheckAndGetOperation(MultiAttributeMoveOperation.class);
assertEquals(true, doConflict(move2, move1));
assertEquals(true, doConflict(move1, move2));
}
/**
* Set vs add - no conflict.
*/
@Test
public void multiAttSetVsAddNoConflict() {
final TestElement testElement = createFilledTestElement(4);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(0, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().add(1, ADDED);
}
}.run(false);
final AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class);
assertEquals(true, doConflict(set, add));
assertEquals(true, doConflict(add, set));
}
/**
* Set vs add - conflict.
*/
@Test
public void multiAttSetVsAddConflict() {
final TestElement testElement = createFilledTestElement(4);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(1, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().add(0, ADDED);
}
}.run(false);
final AbstractOperation add = myCheckAndGetOperation(MultiAttributeOperation.class);
assertEquals(true, doConflict(set, add));
assertEquals(true, doConflict(add, set));
}
public TestElement createFilledTestElement(final int count) {
final TestElement testElement = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().getModelElements().add(testElement);
for (int i = 0; i < count; i++) {
testElement.getStrings().add(VALUE + i);
}
}
}.run(false);
return testElement;
}
/**
* Set vs remove - no conflict.
*/
@Test
public void multiAttSetVsRemoveNoConflict() {
final TestElement testElement = createFilledTestElement(4);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(0, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(1);
}
}.run(false);
final AbstractOperation remove = myCheckAndGetOperation(MultiAttributeOperation.class);
assertEquals(true, doConflict(set, remove));
assertEquals(true, doConflict(remove, set));
}
/**
* Set vs remove - conflict.
*/
@Test
public void multiAttSetVsRemoveConflict() {
final TestElement testElement = createFilledTestElement(4);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(1, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(0);
}
}.run(false);
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(1, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(0, 2);
}
}.run(false);
final 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);
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().set(1, SET);
}
}.run(false);
final AbstractOperation set = myCheckAndGetOperation(MultiAttributeSetOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().move(2, 3);
}
}.run(false);
final AbstractOperation move = myCheckAndGetOperation(MultiAttributeMoveOperation.class);
assertEquals(true, doConflict(set, move));
assertEquals(true, doConflict(move, set));
}
}