blob: 3198b06c8fd532ea7a6f1ec8527c5a7340de4c4f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008-2014 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:
* Otto von Wesendonk - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.client.recording.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
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.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.util.ModelUtil;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.AbstractOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.CreateDeleteOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.MultiAttributeMoveOperation;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.eclipse.emf.emfstore.test.model.TestmodelFactory;
import org.junit.Test;
/**
* Tests for the {@link MultiAttributeMoveOperation}.
*
* @author wesendon
*/
public class MultiAttributeMoveOperationTest extends ESTest {
private static final String THIRD = "third"; //$NON-NLS-1$
private static final String SECOND = "second"; //$NON-NLS-1$
private static final String FIRST = "first"; //$NON-NLS-1$
private TestElement testElement;
/**
* Simple move element.
*/
@Test
public void moveTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
testElement.getStrings().add(FIRST);
testElement.getStrings().add(SECOND);
testElement.getStrings().add(THIRD);
clearOperations();
testElement.getStrings().move(0, 2);
assertTrue(testElement.getStrings().get(0).equals(THIRD));
assertTrue(testElement.getStrings().get(1).equals(FIRST));
assertTrue(testElement.getStrings().get(2).equals(SECOND));
}
}.run(false);
}
/**
* Test creation of element with cross references.
*
*/
@Test
public void createMultipleChildrenTestAtOnce() throws UnsupportedOperationException,
UnsupportedNotificationException {
final TestElement testElement1 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElement11 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElement12 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElement13 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElementc11 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElementc12 = TestmodelFactory.eINSTANCE.createTestElement();
final TestElement testElementc13 = TestmodelFactory.eINSTANCE.createTestElement();
final List<TestElement> list = new ArrayList<TestElement>();
list.add(testElement11);
list.add(testElement12);
list.add(testElement13);
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(testElement1);
getProject().addModelElement(testElementc11);
getProject().addModelElement(testElementc12);
getProject().addModelElement(testElementc13);
clearOperations();
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement11.getReferences().add(testElementc11);
testElement12.getReferences().add(testElementc11);
testElement13.getReferences().add(testElementc11);
testElement1.getContainedElements().addAll(list);
}
}.run(false);
assertEquals(true, getProject().contains(testElement1));
assertEquals(true, getProject().contains(testElement11));
assertEquals(true, getProject().contains(testElement12));
assertEquals(true, getProject().contains(testElement13));
assertNotNull(getProject().getModelElementId(testElement1));
assertNotNull(getProject().getModelElementId(testElement11));
assertNotNull(getProject().getModelElementId(testElement12));
assertNotNull(getProject().getModelElementId(testElement13));
assertEquals(4, forceGetOperations().size());
}
/**
* Test creation of element with cross references.
*
*/
// BEGIN COMPLEX CODE
@Test
public void createWithChildrenTest() throws UnsupportedOperationException, UnsupportedNotificationException {
final TestElement testElement1 = Create.testElement();
final TestElement testElement11 = Create.testElement();
final TestElement testElement12 = Create.testElement();
final TestElement testElement111 = Create.testElement();
final TestElement testElement121 = Create.testElement();
final TestElement testElement122 = Create.testElement();
testElement1.getContainedElements().add(testElement11);
testElement1.getContainedElements().add(testElement12);
testElement11.getContainedElements().add(testElement111);
testElement12.getContainedElements().add(testElement121);
testElement12.getContainedElements().add(testElement122);
new EMFStoreCommand() {
@Override
protected void doRun() {
getProject().addModelElement(testElement1);
}
}.run(false);
assertTrue(getProject().contains(testElement1));
assertTrue(getProject().contains(testElement11));
assertTrue(getProject().contains(testElement12));
assertTrue(getProject().contains(testElement111));
assertTrue(getProject().contains(testElement121));
assertTrue(getProject().contains(testElement122));
assertNotNull(getProject().getModelElementId(testElement1));
assertNotNull(getProject().getModelElementId(testElement11));
assertNotNull(getProject().getModelElementId(testElement12));
assertNotNull(getProject().getModelElementId(testElement111));
assertNotNull(getProject().getModelElementId(testElement121));
assertNotNull(getProject().getModelElementId(testElement122));
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
assertTrue(operations.get(0) instanceof CreateDeleteOperation);
CreateDeleteOperation operation = (CreateDeleteOperation) operations.get(0);
assertEquals(getProject().getModelElementId(testElement1), operation.getModelElementId());
assertEquals(0, operation.getSubOperations().size());
assertEquals(getProject().getModelElementId(testElement1),
operation.getEObjectToIdMap().get(operation.getModelElement()));
assertEquals(getProject().getModelElementId(testElement11),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement12),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(1)));
assertEquals(getProject().getModelElementId(testElement111),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(0).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement121),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement122),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(1)));
final CreateDeleteOperation copy = ModelUtil.clone(operation);
operation = (CreateDeleteOperation) operation.reverse().reverse();
assertEquals(getProject().getModelElementId(testElement1), operation.getModelElementId());
assertEquals(0, operation.getSubOperations().size());
assertEquals(getProject().getModelElementId(testElement1),
operation.getEObjectToIdMap().get(operation.getModelElement()));
assertEquals(getProject().getModelElementId(testElement11),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement12),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(1)));
assertEquals(getProject().getModelElementId(testElement111),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(0).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement121),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement122),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(1)));
operation = copy;
assertEquals(getProject().getModelElementId(testElement1), operation.getModelElementId());
assertEquals(0, operation.getSubOperations().size());
assertEquals(getProject().getModelElementId(testElement1),
operation.getEObjectToIdMap().get(operation.getModelElement()));
assertEquals(getProject().getModelElementId(testElement11),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement12),
operation.getEObjectToIdMap().get(operation.getModelElement().eContents().get(1)));
assertEquals(getProject().getModelElementId(testElement111),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(0).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement121),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(0)));
assertEquals(getProject().getModelElementId(testElement122),
operation.getEObjectToIdMap()
.get(operation.getModelElement().eContents().get(1).eContents().get(1)));
}
// END COMPLEX CODE
/**
* Move and validate operation.
*/
@Test
public void moveAndOperationTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
testElement.getStrings().add(SECOND);
clearOperations();
testElement.getStrings().move(0, 1);
assertTrue(testElement.getStrings().get(0).equals(SECOND));
assertTrue(testElement.getStrings().get(1).equals(FIRST));
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation tmp = operations.get(0);
assertTrue(tmp instanceof MultiAttributeMoveOperation);
final MultiAttributeMoveOperation operation = (MultiAttributeMoveOperation) tmp;
assertTrue(operation.getNewIndex() == 0);
assertTrue(operation.getOldIndex() == 1);
assertTrue(operation.getReferencedValue().equals(SECOND));
}
/**
* Move and reverse.
*/
@Test
public void moveAndReverseTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
testElement.getStrings().add(SECOND);
clearOperations();
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(FIRST));
assertTrue(testElement.getStrings().get(1).equals(SECOND));
testElement.getStrings().move(0, 1);
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(SECOND));
assertTrue(testElement.getStrings().get(1).equals(FIRST));
}
}.run(false);
final AbstractOperation reversedOperation = forceGetOperations().get(0).reverse();
new EMFStoreCommand() {
@Override
protected void doRun() {
reversedOperation.apply(getProject());
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(FIRST));
assertTrue(testElement.getStrings().get(1).equals(SECOND));
}
}.run(false);
}
}