package spoon.test.control;
import org.junit.Test;
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtDo;
import spoon.reflect.code.CtFor;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtType;
import spoon.reflect.visitor.filter.NameFilter;
import spoon.reflect.visitor.filter.TypeFilter;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static spoon.testing.utils.ModelUtils.build;
public class ControlTest {
@Test
public void testModelBuildingFor() throws Exception {
CtType<?> type = build("spoon.test.control", "Fors");
assertEquals("Fors", type.getSimpleName());
List<CtFor> fors = type.getElements(new TypeFilter<CtFor>(CtFor.class));
assertEquals(4, fors.size());
CtMethod<?> normalFor = type.getElements(
new NameFilter<CtMethod<?>>("normalFor")).get(0);
CtFor firstFor = (CtFor) normalFor.getBody().getStatements().get(0);
assertEquals("int i = 0", firstFor.getForInit().get(0).toString());
assertEquals("i < 2", firstFor.getExpression().toString());
assertEquals("i++", firstFor.getForUpdate().get(0).toString());
CtMethod<?> empty1 = type.getElements(
new NameFilter<CtMethod<?>>("empty1")).get(0);
CtFor empty1For = (CtFor) empty1.getBody().getStatements().get(1);
assertEquals("i = 0", empty1For.getForInit().get(0).toString());
// TODO: is it good to return null??
// I'm not sure I want to specify this
// I would prefer to add a fake null object that is printed as empty in
// the output
assertNull(empty1For.getExpression());
assertEquals("i++", empty1For.getForUpdate().get(0).toString());
}
@Test
public void testModelBuildingDoWhile() throws Exception {
CtType<?> type = build("spoon.test.control", "DoWhile");
assertEquals("DoWhile", type.getSimpleName());
CtMethod<?> meth = type.getElements(
new NameFilter<CtMethod<?>>("methode")).get(0);
List<CtStatement> stmts = meth.getBody().getStatements();
assertEquals(2, stmts.size());
assertTrue(stmts.get(1) instanceof CtDo);
assertEquals("i++", ((CtBlock) ((CtDo) stmts.get(1)).getBody()).getStatement(0).toString());
}
}