blob: 2c847d454d0ce679ab67486d5afefb3788cbf12f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2015 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:
* Maximilian Koegel - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.client.recording.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.emfstore.bowling.BowlingFactory;
import org.eclipse.emf.emfstore.bowling.Fan;
import org.eclipse.emf.emfstore.bowling.Merchandise;
import org.eclipse.emf.emfstore.bowling.Player;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTest;
import org.eclipse.emf.emfstore.client.test.common.dsl.Add;
import org.eclipse.emf.emfstore.client.test.common.dsl.Create;
import org.eclipse.emf.emfstore.client.test.common.dsl.TestElementFeatures;
import org.eclipse.emf.emfstore.client.test.common.dsl.Update;
import org.eclipse.emf.emfstore.client.test.common.util.ProjectUtil;
import org.eclipse.emf.emfstore.internal.client.model.exceptions.UnsupportedNotificationException;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
import org.eclipse.emf.emfstore.internal.common.model.Project;
import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CompositeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CreateDeleteOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiReferenceOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.ReferenceOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.SingleReferenceOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.UnsetType;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.impl.MultiReferenceOperationImpl;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.eclipse.emf.emfstore.test.model.TestmodelPackage;
import org.junit.Test;
/**
* Tests the SingleReferenceOperation.
*
* @author koegel
*/
public class SingleReferenceOperationTest extends ESTest {
private static final String FAVOURITE_MERCHANDISE = "favouriteMerchandise"; //$NON-NLS-1$
private static final String FAVOURITE_PLAYER = "favouritePlayer"; //$NON-NLS-1$
private static final String PROPOSAL2 = "proposal"; //$NON-NLS-1$
private Project expectedProject;
/**
* Change a single reference and check the generated operation.
*
*/
@Test
public void changeSingleReference() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement actor = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), useCase);
ProjectUtil.addElement(getProjectSpace().toAPI(), actor);
new EMFStoreCommand() {
@Override
protected void doRun() {
clearOperations();
useCase.setNonContained_NTo1(actor);
assertEquals(actor, useCase.getNonContained_NTo1());
final EList<TestElement> initiatedTestElements = actor.getNonContained_1ToN();
assertEquals(1, initiatedTestElements.size());
assertEquals(useCase, initiatedTestElements.get(0));
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CompositeOperation);
final EList<AbstractOperation> subOperations = ((CompositeOperation) operation).getSubOperations();
assertEquals(2, subOperations.size());
operation = subOperations.get(0);
assertTrue(operation instanceof MultiReferenceOperationImpl);
final MultiReferenceOperation multiReferenceOperation = (MultiReferenceOperation) operation;
assertEquals(TestElementFeatures.nonContained1ToN().getName(), multiReferenceOperation.getFeatureName());
assertEquals(TestElementFeatures.nonContainedNTo1().getName(),
multiReferenceOperation.getOppositeFeatureName());
final ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
final ModelElementId actorId = ModelUtil.getProject(actor).getModelElementId(actor);
assertEquals(useCaseId, multiReferenceOperation.getReferencedModelElements().get(0));
assertEquals(actorId, multiReferenceOperation.getModelElementId());
assertTrue(multiReferenceOperation.isBidirectional());
assertTrue(multiReferenceOperation.isAdd());
assertEquals(1, multiReferenceOperation.getOtherInvolvedModelElements().size());
operation = subOperations.get(1);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleReferenceOperation = (SingleReferenceOperation) operation;
assertEquals(null, singleReferenceOperation.getOldValue());
assertEquals(actorId, singleReferenceOperation.getNewValue());
assertEquals(TestElementFeatures.nonContainedNTo1().getName(), singleReferenceOperation.getFeatureName());
assertEquals(useCaseId, singleReferenceOperation.getModelElementId());
assertEquals(TestElementFeatures.nonContained1ToN().getName(),
singleReferenceOperation.getOppositeFeatureName());
assertTrue(singleReferenceOperation.isBidirectional());
final Set<ModelElementId> otherInvolvedModelElements = singleReferenceOperation.getOtherInvolvedModelElements();
assertEquals(1, otherInvolvedModelElements.size());
assertEquals(actorId, otherInvolvedModelElements.iterator().next());
}
/**
* Change an single reference twice and check the generated operation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
// commented out, single reference operations are not canonized at present
// @Test
// public void changeSingleReferenceTwice() throws UnsupportedOperationException, UnsupportedNotificationException {
// TestElement useCase = Create.testElement;
// getProject().addModelElement(useCase);
// Actor oldActor = RequirementFactory.eINSTANCE.createActor();
// getProject().addModelElement(oldActor);
// Actor newActor = RequirementFactory.eINSTANCE.createActor();
// getProject().addModelElement(newActor);
//
// clearOperations();
//
// useCase.setInitiatingActor(oldActor);
// assertEquals(oldActor, useCase.getInitiatingActor());
// EList<TestElement> initiatedTestElements = oldActor.getInitiatedTestElements();
// assertEquals(1, initiatedTestElements.size());
// assertEquals(useCase, initiatedTestElements.get(0));
//
// useCase.setInitiatingActor(newActor);
// assertEquals(newActor, useCase.getInitiatingActor());
// initiatedTestElements = newActor.getInitiatedTestElements();
// assertEquals(1, initiatedTestElements.size());
// assertEquals(useCase, initiatedTestElements.get(0));
//
// List<AbstractOperation> operations = getProjectSpace().getOperations();
//
// assertEquals(1, operations.size());
// AbstractOperation operation = operations.get(0);
// assertTrue(operation instanceof SingleReferenceOperation);
// SingleReferenceOperation singleReferenceOperation = (SingleReferenceOperation) operation;
//
// assertEquals(null, singleReferenceOperation.getOldValue());
// assertEquals(newActor.getModelElementId(), singleReferenceOperation.getNewValue());
// assertEquals(nonContained_NTo1, singleReferenceOperation.getFeatureName());
// assertEquals(useCase.getModelElementId(), singleReferenceOperation.getModelElementId());
// assertEquals("initiatedTestElements", singleReferenceOperation.getOppositeFeatureName());
// assertTrue(singleReferenceOperation.isBidirectional());
// Set<ModelElementId> otherInvolvedModelElements = singleReferenceOperation.getOtherInvolvedModelElements();
// assertEquals(1, otherInvolvedModelElements.size());
// assertEquals(newActor.getModelElementId(), otherInvolvedModelElements.iterator().next());
// }
/**
* Change an single reference and reverse it.
*/
@Test
public void reverseSingleReference() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement useCase = Create.testElement();
final TestElement oldActor = Create.testElement();
final TestElement newActor = Create.testElement();
Add.toProject(getLocalProject(), useCase, oldActor, newActor);
Update.testElement(TestElementFeatures.nonContainedNTo1(), useCase, oldActor);
assertEquals(oldActor, useCase.getNonContained_NTo1());
assertEquals(1, oldActor.getNonContained_1ToN().size());
assertEquals(useCase, oldActor.getNonContained_1ToN().get(0));
clearOperations();
Update.testElement(TestElementFeatures.nonContainedNTo1(), useCase, newActor);
assertEquals(newActor, useCase.getNonContained_NTo1());
assertEquals(1, newActor.getNonContained_1ToN().size());
assertEquals(useCase, newActor.getNonContained_1ToN().get(0));
final List<AbstractOperation> ops = forceGetOperations();
assertEquals(1, ops.size());
final List<AbstractOperation> operations = checkAndCast(ops.get(0),
CompositeOperation.class).getSubOperations();
assertEquals(3, operations.size());
// note: skipping multireferenceop at index 0 in test, as it is not interesting in this context
final SingleReferenceOperation singleReferenceOperation = checkAndCast(operations.get(2),
SingleReferenceOperation.class);
final ModelElementId useCaseId = getProject().getModelElementId(useCase);
final ModelElementId oldActorId = getProject().getModelElementId(oldActor);
final ModelElementId newActorId = getProject().getModelElementId(newActor);
assertEquals(oldActorId, singleReferenceOperation.getOldValue());
assertEquals(newActorId, singleReferenceOperation.getNewValue());
assertEquals(TestElementFeatures.nonContainedNTo1().getName(), singleReferenceOperation.getFeatureName());
assertEquals(useCaseId, singleReferenceOperation.getModelElementId());
assertEquals(TestElementFeatures.nonContained1ToN().getName(),
singleReferenceOperation.getOppositeFeatureName());
assertTrue(singleReferenceOperation.isBidirectional());
Set<ModelElementId> otherInvolvedModelElements = singleReferenceOperation.getOtherInvolvedModelElements();
assertEquals(2, otherInvolvedModelElements.size());
assertTrue(otherInvolvedModelElements.contains(oldActorId));
assertTrue(otherInvolvedModelElements.contains(newActorId));
final AbstractOperation reverse = singleReferenceOperation.reverse();
assertTrue(reverse instanceof SingleReferenceOperation);
final SingleReferenceOperation reversedSingleReferenceOperation = (SingleReferenceOperation) reverse;
new EMFStoreCommand() {
@Override
protected void doRun() {
reversedSingleReferenceOperation.apply(getProject());
}
}.run(false);
assertEquals(oldActor, useCase.getNonContained_NTo1());
assertEquals(newActorId, reversedSingleReferenceOperation.getOldValue());
assertEquals(oldActorId, reversedSingleReferenceOperation.getNewValue());
assertEquals(TestElementFeatures.nonContainedNTo1().getName(),
reversedSingleReferenceOperation.getFeatureName());
assertEquals(useCaseId, reversedSingleReferenceOperation.getModelElementId());
assertEquals(TestElementFeatures.nonContained1ToN().getName(),
reversedSingleReferenceOperation.getOppositeFeatureName());
assertTrue(reversedSingleReferenceOperation.isBidirectional());
otherInvolvedModelElements = reversedSingleReferenceOperation.getOtherInvolvedModelElements();
assertEquals(2, otherInvolvedModelElements.size());
assertTrue(otherInvolvedModelElements.contains(oldActorId));
assertTrue(otherInvolvedModelElements.contains(newActorId));
}
/**
* Tests reversibility of 1:n single reference feature.
*/
@Test
public void containmentSingleReferenceReversibilityTest() {
final TestElement useCase = Create.testElement();
final TestElement actor = Create.testElement();
final TestElement section = Create.testElement();
final TestElement oldSection = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
getProject().addModelElement(actor);
getProject().addModelElement(section);
getProject().addModelElement(oldSection);
useCase.setContainer(oldSection);
actor.setContainer(oldSection);
expectedProject = ModelUtil.clone(getProject());
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
clearOperations();
useCase.setContainer(section);
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
// composite operation containing a multiref operation and a singleref operation expected
assertEquals(operations.size(), 1);
new EMFStoreCommand() {
@Override
protected void doRun() {
final AbstractOperation reverse = operations.get(0).reverse();
reverse.apply(getProject());
}
}.run(false);
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
}
/**
* Move a containee to another container.
*
*/
@Test
public void moveContainmentReference() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement oldIssue = Create.testElement();
final TestElement newIssue = Create.testElement();
final TestElement proposal = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(oldIssue);
getProject().addModelElement(newIssue);
getProject().addModelElement(proposal);
proposal.setContainer(oldIssue);
clearOperations();
assertEquals(0, newIssue.getContainedElements().size());
assertEquals(1, oldIssue.getContainedElements().size());
assertEquals(proposal, oldIssue.getContainedElements().get(0));
assertEquals(oldIssue, proposal.getContainer());
proposal.setContainer(newIssue);
assertEquals(0, oldIssue.getContainedElements().size());
assertEquals(1, newIssue.getContainedElements().size());
assertEquals(proposal, newIssue.getContainedElements().get(0));
assertEquals(newIssue, proposal.getContainer());
}
}.run(false);
final List<AbstractOperation> forceGetOperations = forceGetOperations();
assertEquals(1, forceGetOperations.size());
final List<AbstractOperation> operations = checkAndCast(forceGetOperations.get(0),
CompositeOperation.class).getSubOperations();
assertEquals(3, operations.size());
MultiReferenceOperation multiReferenceOperation = checkAndCast(operations.get(0),
MultiReferenceOperation.class);
final ModelElementId oldIssueId = ModelUtil.getProject(oldIssue).getModelElementId(oldIssue);
final ModelElementId proposalId = ModelUtil.getProject(proposal).getModelElementId(proposal);
final ModelElementId newIssueId = ModelUtil.getProject(newIssue).getModelElementId(newIssue);
assertFalse(multiReferenceOperation.isAdd());
assertEquals(multiReferenceOperation.getModelElementId(), oldIssueId);
assertEquals(proposalId, multiReferenceOperation.getReferencedModelElements().get(0));
assertEquals(1, multiReferenceOperation.getReferencedModelElements().size());
assertEquals(0, multiReferenceOperation.getIndex());
multiReferenceOperation = checkAndCast(operations.get(1), MultiReferenceOperation.class);
assertTrue(multiReferenceOperation.isAdd());
assertEquals(newIssueId, multiReferenceOperation.getModelElementId());
assertEquals(proposalId, multiReferenceOperation.getReferencedModelElements().get(0));
assertEquals(1, multiReferenceOperation.getReferencedModelElements().size());
assertEquals(0, multiReferenceOperation.getIndex());
final SingleReferenceOperation singleReferenceOperation = checkAndCast(operations.get(2),
SingleReferenceOperation.class);
assertEquals(oldIssueId, singleReferenceOperation.getOldValue());
assertEquals(newIssueId, singleReferenceOperation.getNewValue());
assertEquals(TestmodelPackage.eINSTANCE.getTestElement_Container().getName(),
singleReferenceOperation.getFeatureName());
assertEquals(proposalId, singleReferenceOperation.getModelElementId());
assertEquals(TestmodelPackage.eINSTANCE.getTestElement_ContainedElements().getName(),
singleReferenceOperation.getOppositeFeatureName());
assertTrue(singleReferenceOperation.isBidirectional());
final Set<ModelElementId> otherInvolvedModelElements = singleReferenceOperation.getOtherInvolvedModelElements();
assertEquals(2, otherInvolvedModelElements.size());
assertTrue(otherInvolvedModelElements.contains(newIssueId));
assertTrue(otherInvolvedModelElements.contains(oldIssueId));
}
/**
* Test containment removing.
*/
@Test
public void removeContainment() throws UnsupportedOperationException {
final TestElement issue = Create.testElement();
final TestElement proposal = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
proposal.setName(PROPOSAL2);
getProject().addModelElement(issue);
getProject().addModelElement(proposal);
proposal.setContainer(issue);
clearOperations();
}
}.run(false);
assertEquals(1, issue.getContainedElements().size());
assertEquals(proposal, issue.getContainedElements().get(0));
assertEquals(issue, proposal.getContainer());
assertTrue(getProject().contains(issue));
assertTrue(getProject().contains(proposal));
assertEquals(getProject(), ModelUtil.getProject(issue));
assertEquals(getProject(), ModelUtil.getProject(proposal));
assertEquals(issue, proposal.eContainer());
final ModelElementId proposalId = getProject().getModelElementId(proposal);
Update.testElement(TestElementFeatures.container(), proposal, null);
assertTrue(getProject().contains(issue));
assertFalse(getProject().contains(proposal));
assertEquals(getProject(), ModelUtil.getProject(issue));
assertEquals(0, issue.getContainedElements().size());
assertNull(proposal.getSrefContainer());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final ModelElementId issueId = ModelUtil.getProject(issue).getModelElementId(issue);
final List<ReferenceOperation> subOperations = checkAndCast(operations.get(0), CreateDeleteOperation.class)
.getSubOperations();
assertEquals(2, subOperations.size());
final AbstractOperation op0 = subOperations.get(0);
assertTrue(op0 instanceof MultiReferenceOperation);
final MultiReferenceOperation multiReferenceOperation = (MultiReferenceOperation) op0;
assertEquals(multiReferenceOperation.getModelElementId(), issueId);
assertFalse(multiReferenceOperation.isAdd());
assertEquals(multiReferenceOperation.getReferencedModelElements().get(0), proposalId);
assertEquals(multiReferenceOperation.getReferencedModelElements().size(), 1);
assertEquals(multiReferenceOperation.getIndex(), 0);
final SingleReferenceOperation singleReferenceOperation = checkAndCast(subOperations.get(1),
SingleReferenceOperation.class);
assertEquals(issueId, singleReferenceOperation.getOldValue());
assertNull(singleReferenceOperation.getNewValue());
assertEquals(TestmodelPackage.eINSTANCE.getTestElement_Container().getName(),
singleReferenceOperation.getFeatureName());
assertEquals(proposalId, singleReferenceOperation.getModelElementId());
assertEquals(TestmodelPackage.eINSTANCE.getTestElement_ContainedElements().getName(),
singleReferenceOperation.getOppositeFeatureName());
assertTrue(singleReferenceOperation.isBidirectional());
final Set<ModelElementId> otherInvolvedModelElements = singleReferenceOperation.getOtherInvolvedModelElements();
assertEquals(1, otherInvolvedModelElements.size());
assertTrue(otherInvolvedModelElements.contains(issueId));
}
@Test
public void unsetSingleReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Player favPlayer = BowlingFactory.eINSTANCE.createPlayer();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(favPlayer);
fan.setFavouritePlayer(favPlayer);
}
}.run(false);
assertEquals(favPlayer, fan.getFavouritePlayer());
assertTrue(fan.isSetFavouritePlayer());
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouritePlayer();
}
}.run(false);
assertFalse(favPlayer.equals(fan.getFavouritePlayer()));
assertEquals(null, fan.getFavouritePlayer());
assertTrue(getProject().getAllModelElements().contains(favPlayer));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleRefOp = (SingleReferenceOperation) operation;
final ModelElementId playerId = ModelUtil.getProject(favPlayer).getModelElementId(favPlayer);
assertEquals(playerId, singleRefOp.getOldValue());
assertEquals(null, singleRefOp.getNewValue());
assertTrue(singleRefOp.getUnset() == UnsetType.IS_UNSET);
assertEquals(FAVOURITE_PLAYER, singleRefOp.getFeatureName());
// apply operation to copy of initial project
singleRefOp.apply(secondProject);
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void reverseUnsetSingleReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Player favPlayer = BowlingFactory.eINSTANCE.createPlayer();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(favPlayer);
fan.setFavouritePlayer(favPlayer);
}
}.run(false);
assertEquals(favPlayer, fan.getFavouritePlayer());
assertTrue(fan.isSetFavouritePlayer());
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouritePlayer();
}
}.run(false);
assertFalse(favPlayer.equals(fan.getFavouritePlayer()));
assertEquals(null, fan.getFavouritePlayer());
assertTrue(getProject().getAllModelElements().contains(favPlayer));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleRefOp = (SingleReferenceOperation) operation;
final ModelElementId playerId = ModelUtil.getProject(favPlayer).getModelElementId(favPlayer);
assertEquals(playerId, singleRefOp.getOldValue());
assertEquals(null, singleRefOp.getNewValue());
assertTrue(singleRefOp.getUnset() == UnsetType.IS_UNSET);
assertEquals(FAVOURITE_PLAYER, singleRefOp.getFeatureName());
new EMFStoreCommand() {
@Override
protected void doRun() {
singleRefOp.reverse().apply(getProject());
}
}.run(false);
assertEquals(favPlayer, fan.getFavouritePlayer());
assertTrue(fan.isSetFavouritePlayer());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void doubleReverseUnsetSingleReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Player favPlayer = BowlingFactory.eINSTANCE.createPlayer();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(favPlayer);
fan.setFavouritePlayer(favPlayer);
}
}.run(false);
assertEquals(favPlayer, fan.getFavouritePlayer());
assertTrue(fan.isSetFavouritePlayer());
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouritePlayer();
}
}.run(false);
assertFalse(favPlayer.equals(fan.getFavouritePlayer()));
assertEquals(null, fan.getFavouritePlayer());
assertTrue(getProject().getAllModelElements().contains(favPlayer));
final Project secondProject = ModelUtil.clone(getProject());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleRefOp = (SingleReferenceOperation) operation;
final ModelElementId playerId = ModelUtil.getProject(favPlayer).getModelElementId(favPlayer);
assertEquals(playerId, singleRefOp.getOldValue());
assertEquals(null, singleRefOp.getNewValue());
assertTrue(singleRefOp.getUnset() == UnsetType.IS_UNSET);
assertEquals(FAVOURITE_PLAYER, singleRefOp.getFeatureName());
new EMFStoreCommand() {
@Override
protected void doRun() {
singleRefOp.reverse().reverse().apply(getProject());
}
}.run(false);
assertFalse(favPlayer.equals(fan.getFavouritePlayer()));
assertEquals(null, fan.getFavouritePlayer());
assertTrue(getProject().getAllModelElements().contains(favPlayer));
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void reverseSetOfUnsettedSingleReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Player favPlayer = BowlingFactory.eINSTANCE.createPlayer();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(favPlayer);
}
}.run(false);
assertEquals(false, fan.isSetFavouritePlayer());
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.setFavouritePlayer(favPlayer);
}
}.run(false);
assertTrue(favPlayer.equals(fan.getFavouritePlayer()));
assertEquals(favPlayer, fan.getFavouritePlayer());
assertTrue(getProject().getAllModelElements().contains(favPlayer));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleRefOp = (SingleReferenceOperation) operation;
final ModelElementId playerId = ModelUtil.getProject(favPlayer).getModelElementId(favPlayer);
assertEquals(null, singleRefOp.getOldValue());
assertEquals(playerId, singleRefOp.getNewValue());
assertEquals(FAVOURITE_PLAYER, singleRefOp.getFeatureName());
new EMFStoreCommand() {
@Override
protected void doRun() {
singleRefOp.reverse().apply(getProject());
}
}.run(false);
assertEquals(null, fan.getFavouritePlayer());
assertEquals(false, fan.isSetFavouritePlayer());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void unsetSingleContainmentReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Merchandise merch = BowlingFactory.eINSTANCE.createMerchandise();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(merch);
fan.setFavouriteMerchandise(merch);
}
}.run(false);
assertEquals(merch, fan.getFavouriteMerchandise());
assertTrue(fan.isSetFavouriteMerchandise());
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouriteMerchandise();
}
}.run(false);
assertFalse(merch.equals(fan.getFavouriteMerchandise()));
assertEquals(null, fan.getFavouriteMerchandise());
assertFalse(getProject().getAllModelElements().contains(merch));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CreateDeleteOperation);
final CreateDeleteOperation creaDelOp = (CreateDeleteOperation) operation;
// apply operation to copy of initial project
creaDelOp.apply(secondProject);
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void doubleReverseUnsetSingleContainmentReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Merchandise merch = BowlingFactory.eINSTANCE.createMerchandise();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(merch);
fan.setFavouriteMerchandise(merch);
}
}.run(false);
assertEquals(merch, fan.getFavouriteMerchandise());
assertTrue(fan.isSetFavouriteMerchandise());
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouriteMerchandise();
}
}.run(false);
assertFalse(merch.equals(fan.getFavouriteMerchandise()));
assertEquals(null, fan.getFavouriteMerchandise());
assertFalse(getProject().getAllModelElements().contains(merch));
final Project secondProject = ModelUtil.clone(getProject());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CreateDeleteOperation);
final CreateDeleteOperation creaDelOp = (CreateDeleteOperation) operation;
new EMFStoreCommand() {
@Override
protected void doRun() {
creaDelOp.reverse().reverse().apply(getProject());
}
}.run(false);
assertFalse(merch.equals(fan.getFavouriteMerchandise()));
assertEquals(null, fan.getFavouriteMerchandise());
assertFalse(getProject().getAllModelElements().contains(merch));
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void reverseUnsetSingleContainmentReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Merchandise merch = BowlingFactory.eINSTANCE.createMerchandise();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(merch);
fan.setFavouriteMerchandise(merch);
}
}.run(false);
assertEquals(merch, fan.getFavouriteMerchandise());
assertTrue(fan.isSetFavouriteMerchandise());
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetFavouriteMerchandise();
}
}.run(false);
assertFalse(merch.equals(fan.getFavouriteMerchandise()));
assertEquals(null, fan.getFavouriteMerchandise());
assertFalse(getProject().getAllModelElements().contains(merch));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof CreateDeleteOperation);
final CreateDeleteOperation creaDelOp = (CreateDeleteOperation) operation;
new EMFStoreCommand() {
@Override
protected void doRun() {
creaDelOp.reverse().apply(getProject());
}
}.run(false);
assertEquals(merch.getName(), fan.getFavouriteMerchandise().getName());
assertEquals(merch.getPrice(), fan.getFavouriteMerchandise().getPrice());
assertEquals(merch.getSerialNumber(), fan.getFavouriteMerchandise().getSerialNumber());
assertTrue(fan.isSetFavouriteMerchandise());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void reverseSetOfUnsettedSingleContainmentReference() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
final Merchandise merch = BowlingFactory.eINSTANCE.createMerchandise();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
getProject().addModelElement(merch);
assertEquals(null, fan.getFavouriteMerchandise());
assertEquals(false, fan.isSetFavouriteMerchandise());
}
}.run(false);
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.setFavouriteMerchandise(merch);
assertEquals(merch, fan.getFavouriteMerchandise());
assertTrue(fan.isSetFavouriteMerchandise());
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertTrue(operation instanceof SingleReferenceOperation);
final SingleReferenceOperation singleRefOp = (SingleReferenceOperation) operation;
final ModelElementId merchId = ModelUtil.getProject(merch).getModelElementId(merch);
assertEquals(null, singleRefOp.getOldValue());
assertEquals(merchId, singleRefOp.getNewValue());
assertEquals(FAVOURITE_MERCHANDISE, singleRefOp.getFeatureName());
new EMFStoreCommand() {
@Override
protected void doRun() {
singleRefOp.reverse().apply(getProject());
}
}.run(false);
assertNull(fan.getFavouriteMerchandise());
assertFalse(fan.isSetFavouriteMerchandise());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void setUnsetSingleReferenceToNull() {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
assertEquals(null, fan.getFavouritePlayer());
assertTrue(!fan.isSetFavouritePlayer());
}
}.run(false);
clearOperations();
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.setFavouritePlayer(null);
assertEquals(null, fan.getFavouritePlayer());
assertTrue(fan.isSetFavouritePlayer());
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final SingleReferenceOperation singleRefOp = checkAndCast(operations.get(0), SingleReferenceOperation.class);
new EMFStoreCommand() {
@Override
protected void doRun() {
singleRefOp.apply(secondProject);
}
}.run(false);
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
}