package spoon.test.eval;
import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtCodeElement;
import spoon.reflect.code.CtIf;
import spoon.reflect.code.CtLocalVariable;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtType;
import spoon.reflect.eval.PartialEvaluator;
import spoon.reflect.visitor.CtScanner;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.reflect.eval.InlinePartialEvaluator;
import spoon.support.reflect.eval.VisitorPartialEvaluator;
import static org.junit.Assert.assertEquals;
import static spoon.testing.utils.ModelUtils.build;
public class EvalTest {
@Test
public void testStringConcatenation() throws Exception {
CtClass<?> type = build("spoon.test.eval", "ToEvaluate");
assertEquals("ToEvaluate", type.getSimpleName());
CtBlock<?> b = type.getMethodsByName("testStrings").get(0).getBody();
assertEquals(4, b.getStatements().size());
b = b.partiallyEvaluate();
b = type.getMethodsByName("testInts").get(0).getBody();
assertEquals(1, b.getStatements().size());
b = b.partiallyEvaluate();
assertEquals("// if removed", b.getStatements().get(0).toString());
}
@Test
public void testVisitorPartialEvaluator_binary() throws Exception {
Launcher launcher = new Launcher();
{ // binary operator
CtCodeElement el = launcher.getFactory().Code().createCodeSnippetExpression("0+1").compile();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtElement elnew = eval.evaluate(el);
assertEquals("1", elnew.toString());
}
{ // binary operator
CtCodeElement el = launcher.getFactory().Code().createCodeSnippetExpression("(0+1)*3").compile();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtElement elnew = eval.evaluate(el);
assertEquals("3", elnew.toString());
}
{ // binary operator
CtCodeElement el = launcher.getFactory().Code().createCodeSnippetExpression("(0+1)*3>0").compile();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtElement elnew = eval.evaluate(el);
assertEquals("true", elnew.toString());
}
{ // binary operator
CtCodeElement el = launcher.getFactory().Code().createCodeSnippetExpression("(0+3-1)*3<=0").compile();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtElement elnew = eval.evaluate(el);
assertEquals("false", elnew.toString());
}
}
@Test
public void testVisitorPartialEvaluator_if() throws Exception {
Launcher launcher = new Launcher();
{ // the untaken branch is removed
CtCodeElement el = launcher.getFactory().Code().createCodeSnippetStatement("if (false) {System.out.println(\"foo\");} else {System.out.println(\"bar\");} ").compile();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtElement elnew = eval.evaluate(el);
assertEquals("{" + System.lineSeparator() +
" java.lang.System.out.println(\"bar\");" + System.lineSeparator() +
"}", elnew.toString());
}
}
@Test
public void testVisitorPartialEvaluatorScanner() throws Exception {
Launcher launcher = new Launcher();
launcher.addInputResource("src/test/java/spoon/test/eval/Foo.java");
launcher.buildModel();
VisitorPartialEvaluator eval = new VisitorPartialEvaluator();
CtType<?> foo = launcher.getFactory().Type().get((Class<?>) Foo.class);
foo.accept(new InlinePartialEvaluator(eval));
assertEquals("false", foo.getElements(new TypeFilter<>(CtLocalVariable.class)).get(0).getDefaultExpression().toString());
// the if has been removed
assertEquals(0, foo.getElements(new TypeFilter<>(CtIf.class)).size());
}
}