blob: b50b932b7651266c1adfe5951960caeb27acbf6e [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:
* wesendon
******************************************************************************/
package org.eclipse.emf.emfstore.client.recording.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
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.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.MultiAttributeOperation;
import org.eclipse.emf.emfstore.internal.server.model.versioning.operations.OperationsFactory;
import org.eclipse.emf.emfstore.test.model.TestElement;
import org.junit.Test;
/**
* Tests for MultiAttributes.
*
* @author wesendon
*/
public class MultiAttributeTest extends ESTest {
private static final String INSERTED = "inserted"; //$NON-NLS-1$
private static final String INSERTED2 = "inserted2"; //$NON-NLS-1$
private static final String STRINGS = "strings"; //$NON-NLS-1$
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;
/**
* Add value to empty list.
*/
@Test
public void addValueToEmptyTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
assertTrue(testElement.getStrings().size() == 0);
final MultiAttributeOperation operation = OperationsFactory.eINSTANCE.createMultiAttributeOperation();
operation.setAdd(true);
operation.setFeatureName(STRINGS);
operation.getIndexes().add(0);
operation.getReferencedValues().add(INSERTED);
operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));
operation.apply(getProject());
assertTrue(testElement.getStrings().size() == 1);
assertTrue(testElement.getStrings().get(0).equals(INSERTED));
}
}.run(false);
}
/**
* Add value to filled list.
*/
@Test
public void addValueToFilledTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
assertTrue(testElement.getStrings().size() == 1);
final MultiAttributeOperation operation = OperationsFactory.eINSTANCE.createMultiAttributeOperation();
operation.setAdd(true);
operation.setFeatureName(STRINGS);
operation.getIndexes().add(0);
operation.getReferencedValues().add(INSERTED);
operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));
operation.apply(getProject());
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(INSERTED));
assertTrue(testElement.getStrings().get(1).equals(FIRST));
}
}.run(false);
}
/**
* Add multiple values.
*/
@Test
public void addMultipleValueToFilledTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
assertTrue(testElement.getStrings().size() == 1);
final MultiAttributeOperation operation = OperationsFactory.eINSTANCE.createMultiAttributeOperation();
operation.setAdd(true);
operation.setFeatureName(STRINGS);
operation.getIndexes().add(0);
operation.getIndexes().add(2);
operation.getReferencedValues().add(INSERTED);
operation.getReferencedValues().add(INSERTED2);
operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));
operation.apply(getProject());
assertTrue(testElement.getStrings().size() == 3);
assertTrue(testElement.getStrings().get(0).equals(INSERTED));
assertTrue(testElement.getStrings().get(1).equals(FIRST));
assertTrue(testElement.getStrings().get(2).equals(INSERTED2));
}
}.run(false);
}
/**
* Remove last value.
*/
@Test
public void removeValueToEmptyTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
final TestElement testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
assertTrue(testElement.getStrings().size() == 1);
final MultiAttributeOperation operation = OperationsFactory.eINSTANCE.createMultiAttributeOperation();
operation.setAdd(false);
operation.setFeatureName(STRINGS);
operation.getIndexes().add(0);
operation.getReferencedValues().add(FIRST);
operation.setModelElementId(ModelUtil.getProject(testElement).getModelElementId(testElement));
operation.apply(getProject());
assertTrue(testElement.getStrings().size() == 0);
}
}.run(false);
}
/**
* Test recorded operation.
*/
@Test
public void recordedAddOperationsTest() {
testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
new EMFStoreCommand() {
@Override
protected void doRun() {
clearOperations();
testElement.getStrings().add(FIRST);
testElement.getStrings().addAll(Arrays.asList(SECOND, THIRD));
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
AbstractOperation abstractOperation = operations.get(0);
assertTrue(abstractOperation instanceof MultiAttributeOperation);
MultiAttributeOperation ao = (MultiAttributeOperation) abstractOperation;
assertTrue(ao.getIndexes().size() == 1);
assertTrue(ao.getIndexes().get(0) == 0);
assertTrue(ao.getReferencedValues().get(0).equals(FIRST));
assertTrue(ao.isAdd());
abstractOperation = operations.get(1);
assertTrue(abstractOperation instanceof MultiAttributeOperation);
ao = (MultiAttributeOperation) abstractOperation;
assertEquals(2, ao.getIndexes().size());
assertEquals(1, ao.getIndexes().get(0).intValue());
assertEquals(2, ao.getIndexes().get(1).intValue());
assertTrue(ao.getReferencedValues().get(0).equals(SECOND));
assertTrue(ao.getReferencedValues().get(1).equals(THIRD));
assertTrue(ao.isAdd());
}
/**
* Test recorded remove operation.
*/
@Test
public void recordedRemoveOperationsTest() {
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
testElement.getStrings().add(FIRST);
testElement.getStrings().addAll(Arrays.asList(SECOND, THIRD));
clearOperations();
testElement.getStrings().removeAll(Arrays.asList(SECOND, THIRD));
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
assertEquals(1, operations.size());
final AbstractOperation abstractOperation = operations.get(0);
assertTrue(abstractOperation instanceof MultiAttributeOperation);
final MultiAttributeOperation ao = (MultiAttributeOperation) abstractOperation;
assertTrue(ao.getIndexes().get(0) == 1);
assertTrue(ao.getIndexes().get(1) == 2);
assertTrue(ao.getReferencedValues().get(0).equals(SECOND));
assertTrue(ao.getReferencedValues().get(1).equals(THIRD));
assertTrue(!ao.isAdd());
}
/**
* Remove and reverse operation.
*/
@Test
public void removeAndReverseTest() {
testElement = Create.testElement();
ProjectUtil.addElement(getProjectSpace().toAPI(), testElement);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().add(FIRST);
testElement.getStrings().add(SECOND);
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(FIRST));
assertTrue(testElement.getStrings().get(1).equals(SECOND));
clearOperations();
}
}.run(false);
new EMFStoreCommand() {
@Override
protected void doRun() {
testElement.getStrings().remove(SECOND);
assertTrue(testElement.getStrings().size() == 1);
assertTrue(testElement.getStrings().get(0).equals(FIRST));
}
}.run(false);
final List<AbstractOperation> operations = forceGetOperations();
new EMFStoreCommand() {
@Override
protected void doRun() {
final AbstractOperation ao = operations.get(0).reverse();
ao.apply(getProject());
}
}.run(false);
assertTrue(testElement.getStrings().size() == 2);
assertTrue(testElement.getStrings().get(0).equals(FIRST));
assertTrue(testElement.getStrings().get(1).equals(SECOND));
}
}