package spoon.test.model;
import org.junit.Test;
import spoon.reflect.code.CtCase;
import spoon.reflect.code.CtLiteral;
import spoon.reflect.code.CtStatement;
import spoon.reflect.code.CtSwitch;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.factory.Factory;
import spoon.reflect.visitor.filter.TypeFilter;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static spoon.testing.utils.ModelUtils.build;
import static spoon.testing.utils.ModelUtils.createFactory;
public class SwitchCaseTest {
@Test
public void testIterationStatements() {
Factory factory = createFactory();
CtClass<?> clazz = factory
.Code()
.createCodeSnippetStatement(
"" + "class X {" + "public void foo() {" + " int x=0;" +
"switch(x) {"
+ "case 0: x=x+1;break;"
+ "case 1: x=0;"
+ "default: x=-1;"
+ "}"
+ "}};")
.compile();
CtMethod<?> foo = (CtMethod<?>) clazz.getMethods().toArray()[0];
CtSwitch<?> sw = foo.getElements(
new TypeFilter<CtSwitch<?>>(CtSwitch.class)).get(0);
assertEquals(3, sw.getCases().size());
CtCase<?> c = (CtCase<?>) sw.getCases().get(0);
assertEquals(0, ((CtLiteral<?>) c.getCaseExpression()).getValue());
assertEquals(2, c.getStatements().size());
List<CtStatement> l = new ArrayList<CtStatement>();
// this compiles (thanks to the new CtCase extends CtStatementList)
for (CtStatement s : c) {
l.add(s);
}
assertTrue(c.getStatements().equals(l));
}
@Test
public void testSwitchStatementOnAString() throws Exception {
CtClass<?> clazz = build("spoon.test.model", "SwitchStringClass");
CtMethod<?> method = (CtMethod<?>) clazz.getMethods().toArray()[0];
CtSwitch<?> ctSwitch = method
.getElements(new TypeFilter<CtSwitch<?>>(CtSwitch.class))
.get(0);
// Checks the selector is a string.
assertEquals(String.class,
ctSwitch.getSelector().getType().getActualClass());
// Checks all cases are strings.
for (CtCase<?> aCase : ctSwitch.getCases()) {
if (aCase.getCaseExpression() == null) {
// default case
continue;
}
assertEquals(String.class,
aCase.getCaseExpression().getType().getActualClass());
}
}
}