package spoon.test.parent; import org.junit.Before; import org.junit.Test; import spoon.Launcher; import spoon.compiler.SpoonResourceHelper; import spoon.reflect.code.CtAssert; import spoon.reflect.code.CtFieldAccess; import spoon.reflect.code.CtFor; import spoon.reflect.code.CtIf; import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtLocalVariable; import spoon.reflect.code.CtReturn; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtField; import spoon.reflect.declaration.CtMethod; import spoon.reflect.factory.Factory; import static org.junit.Assert.assertEquals; public class NullParentTest { Factory factory; @Before public void setup() throws Exception { Launcher spoon = new Launcher(); factory = spoon.createFactory(); spoon.createCompiler( factory, SpoonResourceHelper .resources("./src/test/java/spoon/test/parent/Foo.java")) .build(); } private <T extends CtElement> T get(Class<T> elemType) { CtClass<Object> fooClass = factory.Class().get(Foo.class); CtMethod nullParent = fooClass.getMethodsByName("nullParent").get(0); return (T) nullParent.getBody().getElements(elemType::isInstance).get(0); } @Test public void testTargetedAccessNullTarget() { CtFieldAccess<?> access = get(CtFieldAccess.class); assertEquals("foo.bar", access.toString()); access.setTarget(null); assertEquals("bar", access.toString()); } @Test public void testTargetedExpressionNullTarget() { CtInvocation<?> inv = get(CtInvocation.class); assertEquals("foo.foo()", inv.toString()); inv.setTarget(null); assertEquals("foo()", inv.toString()); } @Test public void testAssertNullExpression() { CtAssert<?> asert = get(CtAssert.class); assertEquals("assert true : \"message\"", asert.toString()); asert.setExpression(null); assertEquals("assert true", asert.toString()); } static String noSpaceToString(Object obj) { return obj.toString().replaceAll("\\s+", ""); } @Test public void testForLoopNullChildren() { CtFor forLoop = get(CtFor.class); assertEquals("for(inti=0;i<10;i++){}", noSpaceToString(forLoop)); forLoop.setExpression(null); assertEquals("for(inti=0;;i++){}", noSpaceToString(forLoop)); forLoop.setBody(null); assertEquals("for(inti=0;;i++);", noSpaceToString(forLoop)); } @Test public void testIfNullBranches() { CtIf ctIf = get(CtIf.class); assertEquals("if(true){}else{}", noSpaceToString(ctIf)); ctIf.setThenStatement(null); assertEquals("if(true);else{}", noSpaceToString(ctIf)); ctIf.setElseStatement(null); assertEquals("if(true);", noSpaceToString(ctIf)); } @Test public void testLocalVariableNullDefaultExpression() { CtLocalVariable<?> local = get(CtLocalVariable.class); assertEquals("int i = 0", local.toString()); local.setDefaultExpression(null); assertEquals("int i", local.toString()); } @Test public void testFieldNullDefaultExpression() { CtField<?> field = get(CtField.class); assertEquals("int bar = 0;", field.toString()); field.setDefaultExpression(null); assertEquals("int bar;", field.toString()); } @Test public void testReturnNullExpression() { CtReturn<?> ret = get(CtReturn.class); assertEquals("return 0", ret.toString()); ret.setReturnedExpression(null); assertEquals("return ", ret.toString()); } }