package spoon.test.arrays;
import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.code.CtInvocation;
import spoon.reflect.code.CtLiteral;
import spoon.reflect.code.CtNewArray;
import spoon.reflect.declaration.CtField;
import spoon.reflect.declaration.CtType;
import spoon.reflect.reference.CtArrayTypeReference;
import spoon.reflect.visitor.filter.TypeFilter;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static spoon.testing.utils.ModelUtils.build;
public class ArraysTest {
@Test
public void testArrayReferences() throws Exception {
CtType<?> type = build("spoon.test.arrays", "ArrayClass");
assertEquals("ArrayClass", type.getSimpleName());
assertEquals("int[][][]", type.getField("i").getType().getSimpleName());
assertEquals(3, ((CtArrayTypeReference<?>) type.getField("i").getType()).getDimensionCount());
final CtArrayTypeReference<?> arrayTypeReference = (CtArrayTypeReference<?>) type.getField("i").getDefaultExpression().getType();
assertEquals(1, arrayTypeReference.getArrayType().getAnnotations().size());
assertEquals("@spoon.test.arrays.ArrayClass.TypeAnnotation(integer = 1)" + System.lineSeparator(), arrayTypeReference.getArrayType().getAnnotations().get(0).toString());
CtField<?> x = type.getField("x");
assertTrue(x.getType() instanceof CtArrayTypeReference);
assertEquals("int[]", x.getType().getSimpleName());
assertEquals("int[]", x.getType().getQualifiedName());
assertEquals("int", ((CtArrayTypeReference<?>) x.getType()).getComponentType().getSimpleName());
assertTrue(((CtArrayTypeReference<?>) x.getType()).getComponentType().getActualClass().equals(int.class));
}
@Test
public void testInitializeWithNewArray() throws Exception {
Launcher launcher = new Launcher();
launcher.setArgs(new String[] {"--output-type", "nooutput" });
launcher.addInputResource("./src/test/resources/noclasspath/Foo.java");
launcher.getEnvironment().setNoClasspath(true);
launcher.run();
CtType<Object> aType = launcher.getFactory().Type().get("com.example.Foo");
final List<CtNewArray> elements = aType.getElements(new TypeFilter<>(CtNewArray.class));
assertEquals(2, elements.size());
final CtNewArray attribute = elements.get(0);
assertEquals(1, attribute.getDimensionExpressions().size());
assertEquals(0, ((CtLiteral) attribute.getDimensionExpressions().get(0)).getValue());
assertTrue(attribute.getType() instanceof CtArrayTypeReference);
assertEquals("new java.lang.String[0]", attribute.toString());
final CtNewArray local = elements.get(1);
assertEquals(1, local.getDimensionExpressions().size());
assertTrue(local.getDimensionExpressions().get(0) instanceof CtInvocation);
assertTrue(local.getType() instanceof CtArrayTypeReference);
assertEquals("new com.example.Type[list.size()]", local.toString());
}
@Test
public void testCtNewArrayInnerCtNewArray() throws Exception {
final Launcher launcher = new Launcher();
launcher.addInputResource("src/test/java/spoon/test/arrays/testclasses/Foo.java");
launcher.setSourceOutputDirectory("target/foo");
launcher.buildModel();
launcher.prettyprint();
try {
launcher.getModelBuilder().compile();
} catch (Exception e) {
fail(e.getMessage());
}
}
@Test
public void testCtNewArrayWitComments() throws Exception {
final Launcher launcher = new Launcher();
launcher.addInputResource("src/test/java/spoon/test/arrays/testclasses/NewArrayWithComment.java");
launcher.getEnvironment().setCommentEnabled(true);
launcher.setSourceOutputDirectory("target/foo2");
launcher.buildModel();
launcher.prettyprint();
try {
launcher.getModelBuilder().compile();
} catch (Exception e) {
fail(e.getMessage());
}
}
}