package spoon.test.parameters;
import org.junit.Test;
import spoon.Launcher;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtParameter;
import spoon.reflect.reference.CtParameterReference;
import spoon.reflect.reference.CtTypeReference;
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.assertNotNull;
public class ParameterTest {
@Test
public void testParameterInNoClasspath() throws Exception {
final Launcher launcher = new Launcher();
launcher.addInputResource("./src/test/resources/parameter");
launcher.setSourceOutputDirectory("./target/parameter");
launcher.getEnvironment().setNoClasspath(true);
launcher.run();
final CtClass<Object> aClass = launcher.getFactory().Class().get("org.eclipse.draw2d.text.FlowUtilities");
final CtParameter<?> parameter = aClass.getElements(new NameFilter<CtParameter<?>>("font")).get(0);
assertEquals("font", parameter.getSimpleName());
assertNotNull(parameter.getType());
assertEquals("org.eclipse.swt.graphics.Font", parameter.getType().toString());
assertEquals("org.eclipse.swt.graphics.Font font", parameter.toString());
}
@Test
public void testGetParameterReferenceInLambdaNoClasspath() throws Exception {
Launcher launcher = new Launcher();
launcher.addInputResource("./src/test/resources/noclasspath/Tacos.java");
launcher.getEnvironment().setNoClasspath(true);
launcher.buildModel();
CtMethod<?> ctMethod = launcher.getFactory().Type().get("Tacos").getMethodsByName("setStarRatings").get(0);
CtParameter ctParameter = ctMethod.getBody().getStatement(0).getElements(new TypeFilter<CtParameter>(CtParameter.class) {
@Override
public boolean matches(CtParameter element) {
return "entryPair".equals(element.getSimpleName()) && super.matches(element);
}
}).get(0);
assertNotNull(ctParameter.getReference());
List<CtParameterReference> elements = ctMethod.getBody().getStatement(0).getElements(new TypeFilter<CtParameterReference>(CtParameterReference.class) {
@Override
public boolean matches(CtParameterReference element) {
return "entryPair".equals(element.getSimpleName()) && super.matches(element);
}
});
assertEquals(2, elements.size());
for (CtParameterReference element : elements) {
assertEquals(ctParameter, element.getDeclaration());
assertEquals(ctParameter.getReference(), element);
}
}
@Test
@SuppressWarnings("unchecked")
public void testMultiParameterLambdaTypeReference() {
Launcher launcher = new Launcher();
launcher.addInputResource("./src/test/resources/noclasspath/lambdas/MultiParameterLambda.java");
launcher.getEnvironment().setNoClasspath(true);
launcher.buildModel();
List<CtParameter> parameters;
// test string parameters
parameters = launcher.getModel()
.getElements(new NameFilter<CtMethod>("stringLambda"))
.get(0)
.getElements(new TypeFilter<>(CtParameter.class));
assertEquals(2, parameters.size());
for (final CtParameter param : parameters) {
for (final CtTypeReference refType :
(List<CtTypeReference>) param.getReference()
.getDeclaringExecutable()
.getParameters()) {
assertEquals(launcher.getFactory().Type().STRING, refType);
}
}
// test integer parameters
parameters = launcher.getModel()
.getElements(new NameFilter<CtMethod>("integerLambda"))
.get(0)
.getElements(new TypeFilter<>(CtParameter.class));
assertEquals(2, parameters.size());
for (final CtParameter param : parameters) {
for (final CtTypeReference refType :
(List<CtTypeReference>) param.getReference()
.getDeclaringExecutable()
.getParameters()) {
assertEquals(launcher.getFactory().Type().INTEGER, refType);
}
}
// test unknown parameters
parameters = launcher.getModel()
.getElements(new NameFilter<CtMethod>("unknownLambda"))
.get(0)
.getElements(new TypeFilter<>(CtParameter.class));
assertEquals(2, parameters.size());
for (final CtParameter param : parameters) {
for (final CtTypeReference refType :
(List<CtTypeReference>) param.getReference()
.getDeclaringExecutable()
.getParameters()) {
assertEquals(launcher.getFactory().Type().OBJECT, refType);
}
}
}
}