package spoon.test.refactoring; import org.junit.Test; import spoon.Launcher; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtBinaryOperator; import spoon.reflect.code.CtInvocation; import spoon.reflect.declaration.CtClass; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.Query; import spoon.reflect.visitor.filter.AbstractFilter; import spoon.reflect.visitor.filter.AbstractReferenceFilter; import spoon.reflect.visitor.filter.TypeFilter; import spoon.test.refactoring.testclasses.AClass; import java.util.List; import static org.junit.Assert.*; public class RefactoringTest { @Test public void testRefactoringClassChangeAllCtTypeReferenceAssociatedWithClassConcerned() throws Exception { final Launcher launcher = new Launcher(); launcher.setArgs(new String[] { "-i", "src/test/java/spoon/test/refactoring/testclasses", "-o", "target/spooned/refactoring" }); launcher.run(); final CtClass<?> aClass = launcher.getFactory().Class().get(AClass.class); assertNotNull(aClass); launcher.setArgs(new String[] { "-i", "src/test/java/spoon/test/refactoring/testclasses", "-o", "target/spooned/refactoring", "-p", ThisTransformationProcessor.class.getName() }); launcher.run(); final CtClass<?> classNotAccessible = launcher.getFactory().Class().get(AClass.class); assertNull(launcher.getFactory().Class().get("spoon.test.refactoring.testclasses.AClass")); assertNotNull(classNotAccessible); final CtClass<?> aClassX = launcher.getFactory().Class().get("spoon.test.refactoring.testclasses.AClassX"); assertNotNull(aClassX); final List<CtTypeReference<?>> references = Query.getElements(aClassX.getFactory(), new AbstractReferenceFilter<CtTypeReference<?>>(CtTypeReference.class) { @Override public boolean matches(CtTypeReference<?> reference) { return aClassX.getQualifiedName().equals(reference.getQualifiedName()); } }); assertNotEquals(0, references.size()); for (CtTypeReference<?> reference : references) { assertEquals("AClassX", reference.getSimpleName()); } } @Test public void testThisInConstructor() throws Exception { final Launcher launcher = new Launcher(); launcher.setArgs(new String[] { "-i", "src/test/java/spoon/test/refactoring/testclasses", "-o", "target/spooned/refactoring" }); launcher.run(); final CtClass<?> aClass = (CtClass<?>) launcher.getFactory().Type().get(AClass.class); final CtInvocation<?> thisInvocation = aClass.getElements(new AbstractFilter<CtInvocation<?>>(CtInvocation.class) { @Override public boolean matches(CtInvocation<?> element) { return element.getExecutable().isConstructor(); } }).get(0); assertEquals("this(\"\")", thisInvocation.toString()); } @Test public void testThisInConstructorAfterATransformation() throws Exception { final Launcher launcher = new Launcher(); launcher.setArgs(new String[] { "-i", "src/test/java/spoon/test/refactoring/testclasses", "-o", "target/spooned/refactoring", "-p", ThisTransformationProcessor.class.getName() }); launcher.run(); final CtClass<?> aClassX = (CtClass<?>) launcher.getFactory().Type().get("spoon.test.refactoring.testclasses.AClassX"); final CtInvocation<?> thisInvocation = aClassX.getElements(new AbstractFilter<CtInvocation<?>>(CtInvocation.class) { @Override public boolean matches(CtInvocation<?> element) { return element.getExecutable().isConstructor(); } }).get(0); assertEquals("this(\"\")", thisInvocation.toString()); } @Test public void testTransformedInstanceofAfterATransformation() throws Exception { final Launcher launcher = new Launcher(); launcher.setArgs(new String[] { "-i", "src/test/java/spoon/test/refactoring/testclasses", "-o", "target/spooned/refactoring", "-p", ThisTransformationProcessor.class.getName() }); launcher.run(); final CtClass<?> aClassX = (CtClass<?>) launcher.getFactory().Type().get("spoon.test.refactoring.testclasses.AClassX"); final CtBinaryOperator<?> instanceofInvocation = aClassX.getElements(new TypeFilter<CtBinaryOperator<?>>(CtBinaryOperator.class)).get(0); assertEquals(BinaryOperatorKind.INSTANCEOF, instanceofInvocation.getKind()); assertEquals("o", instanceofInvocation.getLeftHandOperand().toString()); assertEquals("spoon.test.refactoring.testclasses.AClassX", instanceofInvocation.getRightHandOperand().toString()); } }