package spoon.test.path;
import org.junit.Before;
import org.junit.Test;
import spoon.Launcher;
import spoon.compiler.SpoonResourceHelper;
import spoon.reflect.code.CtIf;
import spoon.reflect.code.CtLiteral;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtElement;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.factory.Factory;
import spoon.reflect.path.CtPath;
import spoon.reflect.path.CtPathBuilder;
import spoon.reflect.path.CtPathException;
import spoon.reflect.path.CtPathRole;
import spoon.reflect.path.CtPathStringBuilder;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Created by nicolas on 10/06/2015.
*/
public class PathTest {
Factory factory;
@Before
public void setup() throws Exception {
Launcher spoon = new Launcher();
factory = spoon.createFactory();
spoon.createCompiler(
factory,
SpoonResourceHelper
.resources("./src/test/java/spoon/test/path/Foo.java"))
.build();
}
private void equals(CtPath path, CtElement... elements) {
Collection<CtElement> result = path.evaluateOn(Arrays.asList(factory.Package().getRootPackage()));
assertEquals(elements.length, result.size());
assertArrayEquals(elements, result.toArray(new CtElement[0]));
}
private void equalsSet(CtPath path, Set<? extends CtElement> elements) {
Collection<CtElement> result = path.evaluateOn(Arrays.asList(factory.Package().getRootPackage()));
assertEquals(elements.size(), result.size());
assertTrue(result.containsAll(elements));
}
@Test
public void testBuilderMethod() throws Exception {
equalsSet(
new CtPathBuilder().name("spoon").name("test").name("path").name("Foo").type(CtMethod.class).build(),
factory.Type().get("spoon.test.path.Foo").getMethods()
);
equalsSet(
new CtPathStringBuilder().fromString(".spoon.test.path.Foo/CtMethod"),
factory.Type().get("spoon.test.path.Foo").getMethods()
);
}
@Test
public void testBuilder() {
equals(
new CtPathBuilder().recursiveWildcard().name("toto").role(CtPathRole.DEFAULT_VALUE).build(),
factory.Package().get("spoon.test.path").getType("Foo").getField("toto").getDefaultExpression()
);
}
@Test
public void testPathFromString() throws Exception {
// match the first statement of Foo.foo() method
equals(
new CtPathStringBuilder().fromString(".spoon.test.path.Foo.foo#body[index=0]"),
factory.Package().get("spoon.test.path").getType("Foo").getMethod("foo").getBody()
.getStatement(0));
equals(new CtPathStringBuilder().fromString(".spoon.test.path.Foo.bar/CtParameter"),
factory.Package().get("spoon.test.path").getType("Foo").getMethod("bar",
factory.Type().createReference(int.class),
factory.Type().createReference(int.class))
.getParameters().toArray(new CtElement[0])
);
CtLiteral<String> literal = factory.Core().createLiteral();
literal.setValue("salut");
literal.setType(literal.getFactory().Type().STRING);
equals(new CtPathStringBuilder().fromString(".spoon.test.path.Foo.toto#defaultValue"), literal);
}
@Test
public void testWildcards() throws Exception {
// get the first statements of all Foo methods
equals(new CtPathStringBuilder().fromString(".spoon.test.path.Foo.*#body[index=0]"),
((CtClass) factory.Package().get("spoon.test.path").getType("Foo")).getConstructor().getBody()
.getStatement(0),
factory.Package().get("spoon.test.path").getType("Foo").getMethod("foo").getBody()
.getStatement(0),
factory.Package().get("spoon.test.path").getType("Foo").getMethod("bar",
factory.Type().createReference(int.class), factory.Type().createReference(int.class)).getBody()
.getStatement(0)
);
}
@Test
public void testRoles() throws Exception {
// get the then statement
equals(new CtPathStringBuilder().fromString(".**/CtIf#else"),
((CtIf) factory.Package().get("spoon.test.path").getType("Foo").getMethod("foo").getBody()
.getStatement(2)).getElseStatement()
);
equals(new CtPathStringBuilder().fromString(".**#else"),
((CtIf) factory.Package().get("spoon.test.path").getType("Foo").getMethod("foo").getBody()
.getStatement(2)).getElseStatement()
);
}
@Test
public void toStringTest() throws Exception {
comparePath(".spoon.test.path.Foo/CtMethod");
comparePath(".spoon.test.path.Foo.foo#body[index=0]");
comparePath(".spoon.test.path.Foo.bar/CtParameter");
comparePath(".spoon.test.path.Foo.toto#defaultValue");
comparePath(".spoon.test.path.Foo.*#body[index=0]");
comparePath(".**/CtIf#else");
comparePath(".**#else");
}
private void comparePath(String path) throws CtPathException {
assertEquals(path, new CtPathStringBuilder().fromString(path).toString());
}
}