package spoon.test.literal;
import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.code.CtLiteral;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtType;
import spoon.reflect.factory.CodeFactory;
import spoon.reflect.factory.Factory;
import spoon.reflect.factory.TypeFactory;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.comparator.DeepRepresentationComparator;
import spoon.test.literal.testclasses.Tacos;
import java.util.TreeSet;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static spoon.testing.utils.ModelUtils.buildClass;
import static spoon.testing.utils.ModelUtils.canBeBuilt;
public class LiteralTest {
@Test
public void testCharLiteralInNoClasspath() throws Exception {
final Launcher launcher = new Launcher();
launcher.addInputResource("./src/test/resources/noclasspath/SecondaryIndexManager.java");
launcher.setSourceOutputDirectory("./target/literal");
launcher.getEnvironment().setNoClasspath(true);
launcher.run();
final CtClass<Object> aClass = launcher.getFactory().Class().get("org.apache.cassandra.index.SecondaryIndexManager");
TreeSet<CtLiteral<?>> ts = new TreeSet<CtLiteral<?>>(new DeepRepresentationComparator());
ts.addAll(aClass.getElements(new TypeFilter<CtLiteral<Character>>(CtLiteral.class) {
@Override
public boolean matches(CtLiteral element) {
return element.getValue() instanceof Character && super.matches(element);
}
}));
assertTrue(ts.last().getType().isPrimitive());
assertEquals(':', ts.last().getValue());
canBeBuilt("./target/literal", 8, true);
}
@Test
public void testLiteralInForEachWithNoClasspath() {
Launcher runLaunch = new Launcher();
runLaunch.getEnvironment().setNoClasspath(true);
runLaunch.addInputResource("./src/test/resources/noclasspath/LiteralInForEach.java");
runLaunch.buildModel();
}
@Test
public void testBuildLiternal() throws Exception {
CtType<Tacos> ctType = buildClass(Tacos.class);
TypeFactory typeFactory = ctType.getFactory().Type();
CtLiteral<?> literal = (CtLiteral<?>) ctType.getField("a").getDefaultExpression();
assertEquals(0, literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.INTEGER_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("b").getDefaultExpression();
assertEquals(0x0, literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.INTEGER_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("c").getDefaultExpression();
assertEquals(0f, literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.FLOAT_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("d").getDefaultExpression();
assertEquals(0l, literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.LONG_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("e").getDefaultExpression();
assertEquals(0d, literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.DOUBLE_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("f").getDefaultExpression();
assertEquals('0', literal.getValue());
assertTrue(literal.getType().isPrimitive());
assertEquals(typeFactory.CHARACTER_PRIMITIVE, literal.getType());
literal = (CtLiteral<?>) ctType.getField("g").getDefaultExpression();
assertEquals("0", literal.getValue());
assertFalse(literal.getType().isPrimitive());
assertEquals(typeFactory.STRING, literal.getType());
literal = (CtLiteral<?>) ctType.getField("h").getDefaultExpression();
assertEquals(null, literal.getValue());
assertFalse(literal.getType().isPrimitive());
assertEquals(typeFactory.NULL_TYPE, literal.getType());
}
@Test
public void testFactoryLiternal() {
Launcher runLaunch = new Launcher();
Factory factory = runLaunch.getFactory();
CodeFactory code = factory.Code();
CtLiteral literal = code.createLiteral(1);
assertEquals(1, literal.getValue());
assertEquals(factory.Type().integerPrimitiveType(), literal.getType());
literal = code.createLiteral(new Integer(1));
assertEquals(1, literal.getValue());
assertEquals(factory.Type().integerPrimitiveType(), literal.getType());
literal = code.createLiteral(1.0);
assertEquals(1.0, literal.getValue());
assertEquals(factory.Type().doublePrimitiveType(), literal.getType());
literal = code.createLiteral("literal");
assertEquals("literal", literal.getValue());
assertEquals(factory.Type().stringType(), literal.getType());
}
}