/*******************************************************************************
* 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:
******************************************************************************/
package org.eclipse.emf.emfstore.client.conflictdetection.test.merging;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.internal.client.model.changeTracking.merging.conflict.conflicts.ReferenceConflict;
import org.eclipse.emf.emfstore.internal.client.model.changeTracking.merging.conflict.conflicts.SingleReferenceConflict;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.SingleReferenceOperation;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;
public class SingleReferenceMergeTest extends MergeTest {
private static final String GET_NEW_VALUE = "getNewValue"; //$NON-NLS-1$
private static final String THEIR_LINK = "theirLink"; //$NON-NLS-1$
private static final String MY_LINK = "myLink"; //$NON-NLS-1$
private static final String TARGET = "target"; //$NON-NLS-1$
@Test
public void setSameTarget() {
final TestElement target = Create.testElement(TARGET);
final TestElement myLink = Create.testElement(MY_LINK);
final TestElement theirLink = Create.testElement(THEIR_LINK);
final MergeCase mc = newMergeCase(target, myLink, theirLink);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(target).setReference(myLink);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(target).setReference(mc.getTheirItem(theirLink));
}
}.run(false);
mc.hasConflict(SingleReferenceConflict.class)
// My
.myIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(myLink)).andNoOtherMyOps()
// Theirs
.theirsIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(theirLink)).andNoOtherTheirOps();
}
@Test
public void setSameDifferentTarget() {
final TestElement target = Create.testElement();
final TestElement secondTarget = Create.testElement();
final TestElement link = Create.testElement();
final MergeCase mc = newMergeCase(target, secondTarget, link);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(target).setReference(link);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(secondTarget).setReference(mc.getTheirItem(link));
}
}.run(false);
mc.hasConflict(null);
}
@Test
public void setSameTargetWithNoise() {
final TestElement target = Create.testElement();
final TestElement decoy = Create.testElement();
final TestElement myLink = Create.testElement();
final TestElement theirLink = Create.testElement();
final MergeCase mc = newMergeCase(target, decoy, myLink, theirLink);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(decoy).setReference(myLink);
mc.getMyItem(target).setReference(myLink);
mc.getMyItem(decoy).setOtherReference(myLink);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(target).setOtherReference(mc.getTheirItem(theirLink));
mc.getTheirItem(target).setReference(mc.getTheirItem(theirLink));
}
}.run(false);
mc.hasConflict(SingleReferenceConflict.class)
// My
.myIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(myLink)).andNoOtherMyOps()
// Theirs
.theirsIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(theirLink)).andNoOtherTheirOps();
}
/**
* CONTAINMENT TESTs
*/
@Test
public void setSameTargetContainment() {
final TestElement target = Create.testElement(TARGET);
final TestElement myLink = Create.testElement(MY_LINK);
final TestElement theirLink = Create.testElement(THEIR_LINK);
final MergeCase mc = newMergeCase(target, myLink, theirLink);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(target).setContainedElement(myLink);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(target).setContainedElement(mc.getTheirItem(theirLink));
}
}.run(false);
mc.hasConflict(ReferenceConflict.class)
// My
.myIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(myLink)).andNoOtherMyOps()
// Theirs
.theirsIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(theirLink)).andNoOtherTheirOps();
}
@Test
public void setToDifferentParents() {
final TestElement parent = Create.testElement();
final TestElement secondParent = Create.testElement();
final TestElement child = Create.testElement();
final MergeCase mc = newMergeCase(parent, secondParent, child);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(parent).setContainedElement(child);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(secondParent).setContainedElement(mc.getTheirItem(child));
}
}.run(false);
mc.hasConflict(ReferenceConflict.class)
//
.myIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(child)).andNoOtherMyOps()
// Theirs
.theirsIs(SingleReferenceOperation.class).andReturns(GET_NEW_VALUE, getId(child)).andNoOtherTheirOps();
}
@Test
public void setToParentAndGrandparent() {
final TestElement grandParent = Create.testElement();
final TestElement parent = Create.testElement();
final TestElement child = Create.testElement();
final MergeCase mc = newMergeCase(grandParent, parent, child);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getMyItem(parent).setContainedElement(child);
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
mc.getTheirItem(grandParent).setContainedElement(mc.getTheirItem(parent));
}
}.run(false);
mc.hasConflict(null);
}
}