blob: 2a98b10c82e32e60dd87d57808b7b2b24ce10e96 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011-2014 EclipseSource Muenchen GmbH and others.
*
* 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:
* Philip Langer - initial API and implementation
******************************************************************************/
package org.eclipse.emf.emfstore.modelmutator.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.emfstore.internal.modelmutator.mutation.MoveObjectMutation;
import org.eclipse.emf.emfstore.modelmutator.ESMoveObjectMutation;
import org.eclipse.emf.emfstore.modelmutator.ESMutationException;
import org.eclipse.emf.emfstore.modelmutator.ESMutationFactory;
import org.junit.Before;
import org.junit.Test;
/**
* Unit tests for {@link MoveObjectMutation}.
*
* @author Philip Langer
*/
public class MoveObjectMutationTest extends AbstractMutationTest {
@Before
public void addEAttributeToFirstEClassInEPackageWithTwoClasses() {
EAttribute eAttributeToAdd = E_FACTORY.createEAttribute();
EClass firstEClass = getFirstEClass();
firstEClass.getEStructuralFeatures().add(eAttributeToAdd);
}
private EClass getFirstEClass() {
return (EClass) ePackageWithTwoClasses.getEClassifiers().get(0);
}
private EAttribute getEAttributeInFirstClass() {
return getFirstEAttribute(getFirstEClass());
}
private EClass getSecondEClass() {
return (EClass) ePackageWithTwoClasses.getEClassifiers().get(1);
}
private EAttribute getEAttributeInSecondClass() {
return getFirstEAttribute(getSecondEClass());
}
private EAttribute getFirstEAttribute(EClass eClass) {
if (eClass.getEAttributes().isEmpty()) {
return null;
}
return eClass.getEAttributes().get(0);
}
@Test
public void moveObjectForGivenSourceFeatureAndSourceContainerAndTargetFeatureAndTargetContainer()
throws ESMutationException {
EAttribute attributeToMove = getEAttributeInFirstClass();
ESMutationFactory.move(utilForEPackageWithTwoClasses).setSourceObject(getFirstEClass())
.setSourceFeature(E_PACKAGE.getEClass_EStructuralFeatures()).setTargetObject(getSecondEClass())
.setTargetFeature(E_PACKAGE.getEClass_EStructuralFeatures()).setEObjectToMove(attributeToMove).apply();
assertEquals(getSecondEClass(), attributeToMove.eContainer());
}
@Test
public void moveObject() {
int tries = 0;
boolean success = false;
while (!success) {
try {
applyUnconfigeredMove();
success = true;
} catch (Exception e) {
if (tries++ > 3)
fail();
}
}
}
private void applyUnconfigeredMove() throws ESMutationException {
ESMutationFactory.move(utilForEPackageWithTwoClasses).apply();
assertEAttributeInFirstClassHasBeenMoved();
}
@Test
public void moveObjectForGivenFeature() throws ESMutationException {
ESMutationFactory.move(utilForEPackageWithTwoClasses)
.setTargetFeature(E_PACKAGE.getEClass_EStructuralFeatures()).apply();
assertEAttributeInFirstClassHasBeenMoved();
}
private void assertEAttributeInFirstClassHasBeenMoved() {
final EObject eAttributeInFirstClass = getEAttributeInFirstClass();
final EObject eAttributeInSecondClass = getEAttributeInSecondClass();
assertNull(eAttributeInFirstClass);
assertTrue("Attribute has not been moved", eAttributeInSecondClass != null);
}
@Test
public void setupForSourceGivenFeature() throws ESMutationException {
EAttribute eAttribute = getEAttributeInFirstClass();
ESMoveObjectMutation mutation = ESMutationFactory.move(utilForEPackageWithTwoClasses)
.setSourceFeature(E_PACKAGE.getEClass_EStructuralFeatures());
mutation.apply();
assertEquals(getFirstEClass(), mutation.getSourceObject());
assertEquals(eAttribute, mutation.getEObjectToMove());
assertEquals(E_PACKAGE.getEClass_EStructuralFeatures(), mutation.getTargetFeature());
assertTrue(mutation.getTargetObject() == getSecondEClass());
}
@Test
public void setupForGivenTargetContainer() throws ESMutationException {
EAttribute eAttribute = getEAttributeInFirstClass();
ESMoveObjectMutation mutation = ESMutationFactory.move(utilForEPackageWithTwoClasses)
.setTargetObject(getSecondEClass());
mutation.apply();
assertEquals(getFirstEClass(), mutation.getSourceObject());
assertEquals(eAttribute, mutation.getEObjectToMove());
assertEquals(E_PACKAGE.getEClass_EStructuralFeatures(), mutation.getTargetFeature());
assertEquals(getSecondEClass(), eAttribute.eContainer());
}
@Test(expected = ESMutationException.class)
public void throwsExceptionIfNoValidObjectToMoveIsAvailable() throws ESMutationException {
ESMutationFactory.move(utilForEPackageWithTwoClasses).setTargetFeature(E_PACKAGE.getEEnum_ELiterals()).apply();
fail("Should have thrown a Mutation Exception, because there is no valid setup.");
}
@Test(expected = ESMutationException.class)
public void throwsExceptionIfNoValidTargetContainerIsAvailable() throws ESMutationException {
ESMutationFactory.move(utilForEPackageWithTwoClasses).setTargetFeature(E_PACKAGE.getEPackage_EClassifiers())
.apply();
fail("Should have thrown a Mutation Exception, because there is no valid setup.");
}
}