/**
* Copyright (c) 2006 IBM Corporation 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:
* IBM - Initial API and implementation
*
*/
package org.eclipse.emf.test.tools.merger.facade;
import static org.eclipse.emf.test.tools.merger.facade.BaseFacadeTest.Operation.*;
import java.util.Arrays;
import org.eclipse.emf.codegen.merge.java.facade.FacadeFlags;
import org.eclipse.emf.codegen.merge.java.facade.JEnum;
import org.eclipse.emf.codegen.merge.java.facade.JMethod;
import org.eclipse.emf.codegen.merge.java.facade.JType;
import org.eclipse.emf.test.tools.merger.facade.BaseFacadeTest;
public class MethodsTest extends BaseFacadeTest
{
/**
* Moves method1 from class to the enum. Modifies all properties and tests them during move.
*/
public void testMoveAndModify1()
{
moveAndModifyMethod1();
rewriteAndCompare();
}
/**
* Does all modifications of {@link #testMoveAndModify1()},
* switches the order of annotations of method1 in enum, modifies these annotations,
* then clones the method and inserts cloned method back into class 1.
*/
public void testMoveAndModify2()
{
moveAndModifyMethod2();
rewriteAndCompare();
}
/**
* Does all modifications of {@link #testMoveAndModify2()},
* and at the end switches the order of enum and class.
*/
public void testMoveClasses()
{
moveAndModifyMethod2();
JType type = (JType)compilationUnit.getChildren().get(0);
// switch class and enum
assertTrue(facadeHelper.remove(type));
assertFalse(facadeHelper.remove(type));
updateNoChildren(compilationUnit, type, REMOVE, 2);
assertTrue(facadeHelper.addChild(compilationUnit, type));
assertFalse(facadeHelper.addChild(compilationUnit, type));
assertEquals(compilationUnit.getChildren().indexOf(type), 1);
assertTrue(compilationUnit.getChildren().get(0) instanceof JEnum);
updateNoChildren(compilationUnit, type, ADD, 1);
rewriteAndCompare();
}
/**
* Moves method1 from class to the enum. Modifies all properties and tests them during move.
*/
protected void moveAndModifyMethod1()
{
testNoChildren(compilationUnit, 2);
JType type1 = (JType)compilationUnit.getChildren().get(0);
JEnum enum1 = (JEnum)compilationUnit.getChildren().get(1);
testNoChildren(type1, 2);
testNoChildren(enum1, 0);
JMethod method1 = (JMethod)type1.getChildren().get(0);
modifyMethod(method1, "1", 2, 1, 2, FacadeFlags.PUBLIC, true);
// readModifiedMethod(method1, "1_1", 1, 2, FacadeFlags.PUBLIC);
assertTrue(facadeHelper.remove(method1));
assertFalse(facadeHelper.remove(method1));
updateNoChildren(type1, method1, REMOVE, 2);
modifyMethod(method1, "2", 2, 1, 2, FacadeFlags.PUBLIC, true);
// readModifiedMethod(method1, "1_2", 1, 2, FacadeFlags.PUBLIC);
assertTrue(facadeHelper.addChild(enum1, method1));
assertFalse(facadeHelper.addChild(enum1, method1));
updateNoChildren(enum1, method1, ADD, 0);
modifyMethod(method1, "3", 2, 1, 2, FacadeFlags.PUBLIC, true);
// readModifiedMethod(method1, "1_3", 1, 2, FacadeFlags.PUBLIC);
}
/**
* Does all modifications of {@link #testMoveAndModify1()},
* switches the order of annotations of method1 in enum, modifies these annotations,
* then clones the method and inserts cloned method back into class 1.
*/
protected void moveAndModifyMethod2()
{
moveAndModifyMethod1();
// get method that was moved from class to enum
JType type = (JType)compilationUnit.getChildren().get(0);
JMethod method1 = (JMethod)compilationUnit.getChildren().get(1).getChildren().get(0);
// switch annotations
AnnotationsTest annotationsTest = new AnnotationsTest(this);
annotationsTest.switchVersionAndDeprecatedAnnotations(method1);
// clone method
Object context = facadeHelper.getContext(type);
JMethod clonedMethod = (JMethod)facadeHelper.cloneNode(context, method1);
// insert cloned method back in the class
assertTrue(facadeHelper.addChild(type, clonedMethod));
assertFalse(facadeHelper.addChild(type, clonedMethod));
updateNoChildren(type, clonedMethod, ADD, 1);
}
protected void modifyMethod(JMethod method, String modificationId, int noParameters, int noExceptions, int noTypeParameters, int flags, boolean enableSetParameters)
{
method.setComment("/**\n * Javadoc " + modificationId + "\n */");
method.setBody("{\n // body " + modificationId + "\n }");
String[] exceptions = new String[noExceptions];
for (int i = 0; i < noExceptions; i++)
{
exceptions[i] = "Exception" + i + "_" + modificationId;
}
method.setExceptions(exceptions);
method.setName("method_" + modificationId);
method.setFlags(flags);
if (enableSetParameters)
{
String[] parameters = new String[noParameters];
for (int i = 0; i < noParameters; i++)
{
parameters[i] = "Type" + i + "_" + modificationId + " param" + i + "_" + modificationId;
}
method.setParameters(parameters);
}
else
{
String[] parameterNames = method.getParameterNames();
for (int i = 0; i < parameterNames.length; i++)
{
parameterNames[i] = "param" + i + "_" + modificationId;
}
method.setParameterNames(parameterNames);
}
method.setReturnType("ReturnType" + modificationId);
String[] typeParameters = new String[noTypeParameters];
for (int i = 0; i < noTypeParameters; i++)
{
typeParameters[i] = "T" + i + "_" + modificationId;
}
method.setTypeParameters(typeParameters);
}
protected void readModifiedMethod(JMethod method, String modificationId, int noParameters, int noExceptions, int noTypeParameters, int flags, boolean enableSetParameters)
{
assertEquals("/**\n * Javadoc " + modificationId + "\n */", method.getComment());
assertEquals("{\n // body " + modificationId + "\n }", method.getBody());
String[] exceptions = new String[noExceptions];
for (int i = 0; i < noExceptions; i++)
{
exceptions[i] = "Exception" + i + "_" + modificationId;
}
assertTrue(Arrays.equals(exceptions, method.getExceptions()));
assertEquals("method_" + modificationId, method.getName());
assertEquals(flags, method.getFlags());
if (enableSetParameters)
{
String[] parameters = new String[noParameters];
for (int i = 0; i < noParameters; i++)
{
parameters[i] = "Type" + i + "_" + modificationId + " param" + i + "_" + modificationId;
}
method.setParameters(parameters);
}
else
{
String[] parameterNames = method.getParameterNames();
for (int i = 0; i < parameterNames.length; i++)
{
parameterNames[i] = "param" + i + "_" + modificationId;
}
method.setParameterNames(parameterNames);
}
assertEquals("ReturnType" + modificationId, method.getReturnType());
String[] typeParameters = new String[noTypeParameters];
for (int i = 0; i < noTypeParameters; i++)
{
typeParameters[i] = "T" + i + "_" + modificationId;
}
assertEquals(typeParameters, method.getTypeParameters());
}
}