blob: 01fccaedf7a238daab1049882e450f9dabe5c9dc [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:
* koegel
******************************************************************************/
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.io.IOException;
import java.util.List;
import org.eclipse.emf.emfstore.bowling.BowlingFactory;
import org.eclipse.emf.emfstore.bowling.Fan;
import org.eclipse.emf.emfstore.client.test.common.cases.ESTest;
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.client.util.ESVoidCallable;
import org.eclipse.emf.emfstore.client.util.RunESCommand;
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.AttributeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.UnsetType;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.util.OperationsCanonizer;
import org.eclipse.emf.emfstore.server.exceptions.ESException;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;
/**
* Tests the Attribute Operation.
*
* @author koegel
*/
public class AttributeOperationTest extends ESTest {
private static final String FAN = "Fan"; //$NON-NLS-1$
private static final String OLD_NAME = "oldName"; //$NON-NLS-1$
private static final String OTHER_NAME = "otherName"; //$NON-NLS-1$
private static final String NAME = "name"; //$NON-NLS-1$
private static final String NEW_NAME = "newName"; //$NON-NLS-1$
/**
* Change an attribute and check the generated operation.
*/
@Test
public void changeAttribute() throws UnsupportedOperationException, UnsupportedNotificationException, ESException {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
ProjectUtil.clearOperations(getProjectSpace().toAPI());
Update.testElement(TestElementFeatures.name(), testElement, NEW_NAME);
assertEquals(NEW_NAME, testElement.getName());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertNull(attributeOperation.getOldValue());
assertEquals(NEW_NAME, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
final ModelElementId testElementId = ModelUtil.getProject(testElement).getModelElementId(testElement);
assertEquals(testElementId, attributeOperation.getModelElementId());
}
/**
* Change an attribute twice and check the generated operations after cannonization.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
* @throws ESException
*/
@Test
public void changeAttributeTwice() throws UnsupportedOperationException, UnsupportedNotificationException,
ESException {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
ProjectUtil.clearOperations(getProjectSpace().toAPI());
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
testElement.setName(NEW_NAME);
}
});
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
testElement.setName(OTHER_NAME);
assertEquals(OTHER_NAME, testElement.getName());
}
});
final List<AbstractOperation> operations = forceGetOperations();
RunESCommand.run(new ESVoidCallable() {
@Override
public void run() {
OperationsCanonizer.canonize(operations);
}
});
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertNull(attributeOperation.getOldValue());
assertEquals(OTHER_NAME, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
final ModelElementId testElementId = ModelUtil.getProject(testElement).getModelElementId(testElement);
assertEquals(testElementId, attributeOperation.getModelElementId());
}
/**
* Change an attribute and reverse the operation and check the result.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
* @throws ESException
*/
@Test
public void changeAttributeAndReverse() throws UnsupportedOperationException, UnsupportedNotificationException,
ESException {
final TestElement testElement = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(testElement);
testElement.setName(OLD_NAME);
clearOperations();
testElement.setName(NEW_NAME);
assertEquals(NEW_NAME, testElement.getName());
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals(OLD_NAME, attributeOperation.getOldValue());
assertEquals(NEW_NAME, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
final ModelElementId testElementId = ModelUtil.getProject(testElement).getModelElementId(testElement);
assertEquals(testElementId, attributeOperation.getModelElementId());
new EMFStoreCommand() {
@Override
protected void doRun() {
final AbstractOperation reverse = operation.reverse();
reverse.apply(getProject());
assertEquals(true, reverse instanceof AttributeOperation);
final AttributeOperation reversedAttributeOperation = (AttributeOperation) reverse;
assertEquals(NEW_NAME, reversedAttributeOperation.getOldValue());
assertEquals(OLD_NAME, reversedAttributeOperation.getNewValue());
assertEquals(NAME, reversedAttributeOperation.getFeatureName());
final ModelElementId testElementId = ModelUtil.getProject(testElement).getModelElementId(testElement);
assertEquals(testElementId, reversedAttributeOperation.getModelElementId());
}
}.run(false);
assertEquals(OLD_NAME, testElement.getName());
}
@Test
public void changeAttributeDoubleReversal() throws IOException, ESException {
final TestElement testElement = Create.testElement();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(testElement);
testElement.setName(OLD_NAME);
clearOperations();
testElement.setName(NEW_NAME);
assertEquals(NEW_NAME, testElement.getName());
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
final AttributeOperation cmpOperation = (AttributeOperation) attributeOperation.reverse().reverse();
assertEquals(attributeOperation.getFeatureName(), cmpOperation.getFeatureName());
assertEquals(attributeOperation.getModelElementId(), cmpOperation.getModelElementId());
assertEquals(attributeOperation.getNewValue(), cmpOperation.getNewValue());
assertEquals(attributeOperation.getOldValue(), cmpOperation.getOldValue());
final Project expectedProject = ModelUtil.clone(getProject());
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
final AbstractOperation r = attributeOperation.reverse();
final AbstractOperation rr = r.reverse();
new EMFStoreCommand() {
@Override
protected void doRun() {
r.apply(getProject());
rr.apply(getProject());
}
}.run(false);
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
new EMFStoreCommand() {
@Override
protected void doRun() {
attributeOperation.reverse().apply(getProject());
attributeOperation.reverse().reverse().apply(getProject());
}
}.run(false);
assertTrue(ModelUtil.areEqual(getProject(), expectedProject));
getProjectSpace().save();
final Project loadedProject = ModelUtil.loadEObjectFromResource(
org.eclipse.emf.emfstore.internal.common.model.ModelFactory.eINSTANCE.getModelPackage().getProject(),
getProject().eResource().getURI(), false);
// String eObjectToString = ModelUtil.eObjectToString(loadedProject);
// String eObjectToString2 = ModelUtil.eObjectToString(expectedProject);
assertTrue(ModelUtil.areEqual(loadedProject, expectedProject));
}
@Test
public void unsetAttribute() throws ESException {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
fan.setName(FAN);
clearOperations();
}
}.run(false);
final Project secondProject = ModelUtil.clone(getProject());
// Test unsetting name
assertEquals(true, fan.isSetName());
assertEquals(FAN, fan.getName());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetName();
}
}.run(false);
assertEquals(false, fan.isSetName());
assertEquals(null, fan.getName());
List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals(FAN, attributeOperation.getOldValue());
assertEquals(null, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
assertEquals(true, attributeOperation.getUnset() == UnsetType.IS_UNSET);
attributeOperation.apply(secondProject);
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
// test setting name to default value
clearOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.setName(null);
}
}.run(false);
assertEquals(true, fan.isSetName());
assertEquals(null, fan.getName());
operations = forceGetOperations();
assertEquals(1, operations.size());
operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
attributeOperation = (AttributeOperation) operation;
assertNull(attributeOperation.getOldValue());
assertNull(attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
assertFalse(attributeOperation.getUnset() == UnsetType.IS_UNSET);
}
@Test
public void unsetAttributeReverse() throws ESException {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
fan.setName(FAN);
clearOperations();
}
}.run(false);
assertEquals(FAN, fan.getName());
assertEquals(true, fan.isSetName());
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetName();
}
}.run(false);
assertEquals(false, fan.isSetName());
assertEquals(null, fan.getName());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals(FAN, attributeOperation.getOldValue());
assertEquals(null, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
assertEquals(true, attributeOperation.getUnset() == UnsetType.IS_UNSET);
new EMFStoreCommand() {
@Override
protected void doRun() {
attributeOperation.reverse().apply(getProject());
}
}.run(false);
assertEquals(FAN, fan.getName());
assertEquals(true, fan.isSetName());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void unsetAttributeDoubleReverse() throws ESException {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
fan.setName(FAN);
clearOperations();
}
}.run(false);
assertEquals(FAN, fan.getName());
assertEquals(true, fan.isSetName());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.unsetName();
}
}.run(false);
final Project secondProject = ModelUtil.clone(getProject());
assertEquals(false, fan.isSetName());
assertEquals(null, fan.getName());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals(FAN, attributeOperation.getOldValue());
assertEquals(null, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
assertEquals(true, attributeOperation.getUnset() == UnsetType.IS_UNSET);
new EMFStoreCommand() {
@Override
protected void doRun() {
attributeOperation.reverse().reverse().apply(getProject());
}
}.run(false);
assertEquals(null, fan.getName());
assertEquals(false, fan.isSetName());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
@Test
public void setOfUnsettedAttributeReverse() throws ESException {
final Fan fan = BowlingFactory.eINSTANCE.createFan();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(fan);
clearOperations();
}
}.run(false);
assertEquals(null, fan.getName());
assertEquals(false, fan.isSetName());
final Project secondProject = ModelUtil.clone(getProject());
new EMFStoreCommand() {
@Override
protected void doRun() {
fan.setName(FAN);
}
}.run(false);
assertEquals(true, fan.isSetName());
assertEquals(FAN, fan.getName());
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals(null, attributeOperation.getOldValue());
assertEquals(FAN, attributeOperation.getNewValue());
assertEquals(NAME, attributeOperation.getFeatureName());
new EMFStoreCommand() {
@Override
protected void doRun() {
attributeOperation.reverse().apply(getProject());
}
}.run(false);
assertEquals(null, fan.getName());
assertEquals(false, fan.isSetName());
assertTrue(ModelUtil.areEqual(getProject(), secondProject));
}
}