/**
* <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.changeTracking.operations;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.io.IOException;
import java.util.List;
import org.eclipse.emf.emfstore.client.model.exceptions.UnsupportedNotificationException;
import org.eclipse.emf.emfstore.client.model.util.EMFStoreCommand;
import org.eclipse.emf.emfstore.client.test.WorkspaceTest;
import org.eclipse.emf.emfstore.client.test.model.requirement.RequirementFactory;
import org.eclipse.emf.emfstore.client.test.model.requirement.UseCase;
import org.eclipse.emf.emfstore.common.model.ModelElementId;
import org.eclipse.emf.emfstore.common.model.Project;
import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.AttributeOperation;
import org.eclipse.emf.emfstore.server.model.versioning.operations.util.OperationsCanonizer;
import org.junit.Test;
/**
* Tests the Attribute Operation.
*
* @author koegel
*/
public class AttributeOperationTest extends WorkspaceTest {
/**
* Change an attribute and check the generated operation.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void changeAttribute() throws UnsupportedOperationException, UnsupportedNotificationException {
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
clearOperations();
useCase.setName("newName");
assertEquals("newName", useCase.getName());
}
}.run(false);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals("new UseCase", attributeOperation.getOldValue());
assertEquals("newName", attributeOperation.getNewValue());
assertEquals("name", attributeOperation.getFeatureName());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(useCaseId, attributeOperation.getModelElementId());
}
/**
* Change an attribute twice and check the generated operations after cannonization.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void changeAttributeTwice() throws UnsupportedOperationException, UnsupportedNotificationException {
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
clearOperations();
useCase.setName("newName");
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
useCase.setName("otherName");
assertEquals("otherName", useCase.getName());
}
}.run(false);
final List<AbstractOperation> operations = getProjectSpace().getOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
OperationsCanonizer.canonize(operations);
}
}.run(false);
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals("new UseCase", attributeOperation.getOldValue());
assertEquals("otherName", attributeOperation.getNewValue());
assertEquals("name", attributeOperation.getFeatureName());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(useCaseId, attributeOperation.getModelElementId());
}
/**
* Change an attribute and reverse the operation and check the result.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
*/
@Test
public void changeAttributeAndReverse() throws UnsupportedOperationException, UnsupportedNotificationException {
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
useCase.setName("oldName");
clearOperations();
useCase.setName("newName");
assertEquals("newName", useCase.getName());
}
}.run(false);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
final AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
AttributeOperation attributeOperation = (AttributeOperation) operation;
assertEquals("oldName", attributeOperation.getOldValue());
assertEquals("newName", attributeOperation.getNewValue());
assertEquals("name", attributeOperation.getFeatureName());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(useCaseId, attributeOperation.getModelElementId());
new EMFStoreCommand() {
@Override
protected void doRun() {
AbstractOperation reverse = operation.reverse();
reverse.apply(getProject());
assertEquals(true, reverse instanceof AttributeOperation);
AttributeOperation reversedAttributeOperation = (AttributeOperation) reverse;
assertEquals("newName", reversedAttributeOperation.getOldValue());
assertEquals("oldName", reversedAttributeOperation.getNewValue());
assertEquals("name", reversedAttributeOperation.getFeatureName());
ModelElementId useCaseId = ModelUtil.getProject(useCase).getModelElementId(useCase);
assertEquals(useCaseId, reversedAttributeOperation.getModelElementId());
}
}.run(false);
assertEquals("oldName", useCase.getName());
}
/**
* Test if attributeOperation.reverse().reverse() is a noop.
*
* @throws UnsupportedOperationException on test fail
* @throws UnsupportedNotificationException on test fail
* @throws IOException
*/
@Test
public void changeAttributeDoubleReversal() throws UnsupportedOperationException, UnsupportedNotificationException,
IOException {
final UseCase useCase = RequirementFactory.eINSTANCE.createUseCase();
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(useCase);
useCase.setName("oldName");
clearOperations();
useCase.setName("newName");
assertEquals("newName", useCase.getName());
}
}.run(false);
List<AbstractOperation> operations = getProjectSpace().getOperations();
assertEquals(1, operations.size());
AbstractOperation operation = operations.get(0);
assertEquals(true, operation instanceof AttributeOperation);
final AttributeOperation attributeOperation = (AttributeOperation) operation;
AttributeOperation cmpOperation = (AttributeOperation) attributeOperation.reverse().reverse();
assertEquals(attributeOperation.getFeatureName(), cmpOperation.getFeatureName());
assertEquals(attributeOperation.getDescription(), cmpOperation.getDescription());
assertEquals(attributeOperation.getModelElementId(), cmpOperation.getModelElementId());
assertEquals(attributeOperation.getName(), cmpOperation.getName());
assertEquals(attributeOperation.getNewValue(), cmpOperation.getNewValue());
assertEquals(attributeOperation.getOldValue(), cmpOperation.getOldValue());
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));
Project loadedProject = ModelUtil.loadEObjectFromResource(
org.eclipse.emf.emfstore.common.model.ModelFactory.eINSTANCE.getModelPackage().getProject(), getProject()
.eResource().getURI(), false);
assertTrue(ModelUtil.areEqual(loadedProject, expectedProject));
}
}