package spoon.test.condition;
import org.junit.Test;
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtConditional;
import spoon.reflect.code.CtIf;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtType;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.test.condition.testclasses.Foo;
import spoon.testing.utils.ModelUtils;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class ConditionalTest {
@Test
public void testConditional() throws Exception {
final CtType<Foo> aFoo = ModelUtils.buildClass(Foo.class);
final CtConditional aConditional = aFoo.getMethod("m2").getElements(new TypeFilter<CtConditional>(CtConditional.class)).get(0);
assertEquals("return a == 18 ? true : false", aConditional.getParent().toString());
}
@Test
public void testConditionalWithAssignment() throws Exception {
final CtType<Foo> aFoo = ModelUtils.buildClass(Foo.class);
final CtConditional aConditional = aFoo.getMethod("m").getElements(new TypeFilter<CtConditional>(CtConditional.class)).get(0);
assertEquals("x = (a == 18) ? true : false", aConditional.getParent().toString());
}
@Test
public void testBlockInConditionAndLoop() throws Exception {
final CtType<Foo> aFoo = ModelUtils.buildClass(Foo.class);
final List<CtIf> conditions = aFoo.getMethod("m3").getElements(new TypeFilter<CtIf>(CtIf.class));
assertEquals(4, conditions.size());
for (CtIf condition : conditions) {
assertTrue(condition.getThenStatement() instanceof CtBlock);
if (condition.getElseStatement() != null && !(condition.getElseStatement() instanceof CtIf)) {
assertTrue(condition.getElseStatement() instanceof CtBlock);
}
}
}
@Test
public void testNoBlockInConditionAndLoop() throws Exception {
String newLine = System.getProperty("line.separator");
final CtType<Foo> aFoo = ModelUtils.buildClass(Foo.class);
CtMethod<Object> method = aFoo.getMethod("m3");
final List<CtIf> conditions = method.getElements(new TypeFilter<CtIf>(CtIf.class));
for (int i = 0; i < conditions.size(); i++) {
CtIf ctIf = conditions.get(i);
// replace the block to a statement
CtStatement then = ((CtBlock) ctIf.getThenStatement()).getStatement(0);
ctIf.setThenStatement(then);
if (ctIf.getElseStatement() != null) {
CtStatement elseStatement = ((CtBlock) ctIf.getElseStatement()).getStatement(0);
ctIf.setElseStatement(elseStatement);
}
}
assertEquals("if (true)" + newLine
+ " java.lang.System.out.println();" + newLine
+ "else if (true)" + newLine
+ " java.lang.System.out.println();" + newLine
+ "else" + newLine
+ " java.lang.System.out.println();" + newLine,
method.getBody().getStatement(0).toString());
}
}