Search in sources :

Example 61 with Factory

use of spoon.reflect.factory.Factory in project spoon by INRIA.

the class TemplateInvocationSubstitutionTest method testSubstitutionByExpression.

@Test
public void testSubstitutionByExpression() throws Exception {
    // contract: the template engine understands fields whose type extends from TemplateParameter as template parameter automatically. No need for extra annotation
    Launcher spoon = new Launcher();
    spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstitutionByExpressionTemplate.java"));
    spoon.buildModel();
    Factory factory = spoon.getFactory();
    CtClass<?> resultKlass = factory.Class().create("Result");
    CtBlock<?> result = new SubstitutionByExpressionTemplate(factory.createLiteral("abc")).apply(resultKlass);
    assertEquals("java.lang.System.out.println(\"abc\".substring(1))", result.getStatement(0).toString());
}
Also used : InvocationSubstitutionByExpressionTemplate(spoon.test.template.testclasses.InvocationSubstitutionByExpressionTemplate) SubstitutionByExpressionTemplate(spoon.test.template.testclasses.SubstitutionByExpressionTemplate) Launcher(spoon.Launcher) Factory(spoon.reflect.factory.Factory) FileSystemFile(spoon.support.compiler.FileSystemFile) Test(org.junit.Test)

Example 62 with Factory

use of spoon.reflect.factory.Factory in project spoon by INRIA.

the class TemplateTest method substituteStringLiteral.

@Test
public void substituteStringLiteral() throws Exception {
    // contract: the substitution of literals is possible too
    // contract: the template engine supports substitution of root element
    Launcher spoon = new Launcher();
    spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SubstituteLiteralTemplate.java"));
    spoon.buildModel();
    Factory factory = spoon.getFactory();
    {
        // contract: String value is substituted in String literal
        final CtClass<?> result = (CtClass<?>) new SubstituteLiteralTemplate("value1").apply(factory.createClass());
        assertEquals("java.lang.String stringField1 = \"value1\";", result.getField("stringField1").toString());
        assertEquals("java.lang.String stringField2 = \"Substring value1 is substituted too - value1\";", result.getField("stringField2").toString());
        // contract: the parameter of type string replaces only method name
        assertEquals("java.lang.System.out.println(spoon.test.template.testclasses.Params.value1())", result.getMethodsByName("m1").get(0).getBody().getStatement(0).toString());
    }
    {
        // contract: String Literal value is substituted in String literal
        final CtClass<?> result = (CtClass<?>) new SubstituteLiteralTemplate(factory.createLiteral("value2")).apply(factory.createClass());
        assertEquals("java.lang.String stringField1 = \"value2\";", result.getField("stringField1").toString());
        assertEquals("java.lang.String stringField2 = \"Substring value2 is substituted too - value2\";", result.getField("stringField2").toString());
        // contract: the parameter of type String literal replaces whole invocation
        assertEquals("java.lang.System.out.println(\"value2\")", result.getMethodsByName("m1").get(0).getBody().getStatement(0).toString());
    }
    {
        // contract: simple name of type reference is substituted in String literal
        final CtClass<?> result = (CtClass<?>) new SubstituteLiteralTemplate(factory.Type().createReference("some.ignored.package.TypeName")).apply(factory.createClass());
        assertEquals("java.lang.String stringField1 = \"TypeName\";", result.getField("stringField1").toString());
        assertEquals("java.lang.String stringField2 = \"Substring TypeName is substituted too - TypeName\";", result.getField("stringField2").toString());
        // contract type reference is substituted in invocation as class access
        assertEquals("java.lang.System.out.println(some.ignored.package.TypeName.class)", result.getMethodsByName("m1").get(0).getBody().getStatement(0).toString());
    }
    {
        // contract: number literal is substituted in String literal as number converted to string
        final CtClass<?> result = (CtClass<?>) new SubstituteLiteralTemplate(factory.createLiteral(7)).apply(factory.createClass());
        assertEquals("java.lang.String stringField1 = \"7\";", result.getField("stringField1").toString());
        assertEquals("java.lang.String stringField2 = \"Substring 7 is substituted too - 7\";", result.getField("stringField2").toString());
        // contract number literal is substituted in invocation as number literal
        assertEquals("java.lang.System.out.println(7)", result.getMethodsByName("m1").get(0).getBody().getStatement(0).toString());
    }
}
Also used : CtClass(spoon.reflect.declaration.CtClass) Launcher(spoon.Launcher) Factory(spoon.reflect.factory.Factory) FileSystemFile(spoon.support.compiler.FileSystemFile) SubstituteLiteralTemplate(spoon.test.template.testclasses.SubstituteLiteralTemplate) Test(org.junit.Test)

Example 63 with Factory

use of spoon.reflect.factory.Factory in project spoon by INRIA.

the class TemplateTest method testSubstituteInnerClass.

@Test
public void testSubstituteInnerClass() throws Exception {
    // contract: the inner class is substituted well too and references to target class are substituted well
    Launcher spoon = new Launcher();
    spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/InnerClassTemplate.java"));
    spoon.buildModel();
    Factory factory = spoon.getFactory();
    CtClass<?> result = factory.Class().create("x.Result");
    new InnerClassTemplate().apply(result);
    assertEquals(1, result.getNestedTypes().size());
    CtType<?> innerType = result.getNestedType("Inner");
    assertNotNull(innerType);
    CtField<?> innerField = innerType.getField("innerField");
    assertNotNull(innerField);
    assertSame(innerType, innerField.getDeclaringType());
    CtFieldReference<?> fr = innerType.filterChildren((CtFieldReference<?> e) -> true).first();
    // check that reference to declaring type is correctly substituted
    assertEquals("x.Result$Inner", fr.getDeclaringType().getQualifiedName());
}
Also used : FieldAccessOfInnerClassTemplate(spoon.test.template.testclasses.FieldAccessOfInnerClassTemplate) InnerClassTemplate(spoon.test.template.testclasses.InnerClassTemplate) Launcher(spoon.Launcher) Factory(spoon.reflect.factory.Factory) FileSystemFile(spoon.support.compiler.FileSystemFile) Test(org.junit.Test)

Example 64 with Factory

use of spoon.reflect.factory.Factory in project spoon by INRIA.

the class TemplateTest method testObjectIsNotParamTemplate.

@Test
public void testObjectIsNotParamTemplate() throws Exception {
    Launcher spoon = new Launcher();
    spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ObjectIsNotParamTemplate.java"));
    spoon.buildModel();
    Factory factory = spoon.getFactory();
    // contract: String value is substituted in substring of literal, named element and reference
    final CtClass<?> result = (CtClass<?>) new ObjectIsNotParamTemplate().apply(factory.createClass());
    assertEquals(0, result.getMethodsByName("methXXXd").size());
    assertEquals(1, result.getMethodsByName("method").size());
}
Also used : CtClass(spoon.reflect.declaration.CtClass) ObjectIsNotParamTemplate(spoon.test.template.testclasses.ObjectIsNotParamTemplate) Launcher(spoon.Launcher) Factory(spoon.reflect.factory.Factory) FileSystemFile(spoon.support.compiler.FileSystemFile) Test(org.junit.Test)

Example 65 with Factory

use of spoon.reflect.factory.Factory in project spoon by INRIA.

the class TemplateTest method testTemplateMatcherWithWholePackage.

@Test
public void testTemplateMatcherWithWholePackage() throws Exception {
    Launcher spoon = new Launcher();
    spoon.addInputResource("./src/test/java/spoon/test/template/testclasses/ContextHelper.java");
    spoon.addInputResource("./src/test/java/spoon/test/template/testclasses/BServiceImpl.java");
    spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/SecurityCheckerTemplate.java"));
    spoon.buildModel();
    Factory factory = spoon.getFactory();
    CtClass<?> templateKlass = factory.Class().get(SecurityCheckerTemplate.class);
    CtMethod templateMethod = (CtMethod) templateKlass.getElements(new NamedElementFilter<>(CtMethod.class, "matcher1")).get(0);
    CtIf templateRoot = (CtIf) templateMethod.getBody().getStatement(0);
    TemplateMatcher matcher = new TemplateMatcher(templateRoot);
    List<CtElement> matches = matcher.find(factory.getModel().getRootPackage());
    assertEquals(1, matches.size());
    CtElement match = matches.get(0);
    assertTrue("Match is not a if", match instanceof CtIf);
    CtElement matchParent = match.getParent();
    assertTrue("Match parent is not a block", matchParent instanceof CtBlock);
    CtElement matchParentParent = matchParent.getParent();
    assertTrue("Match grand parent is not a method", matchParentParent instanceof CtMethod);
    CtMethod methodHello = (CtMethod) matchParentParent;
    assertEquals("Match grand parent is not a method called hello", "hello", methodHello.getSimpleName());
    CtElement methodParent = methodHello.getParent();
    assertTrue("Parent of the method is not a class", methodParent instanceof CtClass);
    CtClass bservice = (CtClass) methodParent;
    assertEquals("Parent of the method is not a class called BServiceImpl", "BServiceImpl", bservice.getSimpleName());
}
Also used : CtClass(spoon.reflect.declaration.CtClass) CtBlock(spoon.reflect.code.CtBlock) CtElement(spoon.reflect.declaration.CtElement) TemplateMatcher(spoon.template.TemplateMatcher) Launcher(spoon.Launcher) Factory(spoon.reflect.factory.Factory) FileSystemFile(spoon.support.compiler.FileSystemFile) CtMethod(spoon.reflect.declaration.CtMethod) CtIf(spoon.reflect.code.CtIf) Test(org.junit.Test)

Aggregations

Factory (spoon.reflect.factory.Factory)364 Test (org.junit.Test)322 Launcher (spoon.Launcher)154 CtClass (spoon.reflect.declaration.CtClass)87 CtMethod (spoon.reflect.declaration.CtMethod)73 ModelUtils.createFactory (spoon.testing.utils.ModelUtils.createFactory)65 TypeFilter (spoon.reflect.visitor.filter.TypeFilter)53 File (java.io.File)41 CtStatement (spoon.reflect.code.CtStatement)36 CtTypeReference (spoon.reflect.reference.CtTypeReference)32 CtAnnotation (spoon.reflect.declaration.CtAnnotation)31 CtInvocation (spoon.reflect.code.CtInvocation)30 SpoonModelBuilder (spoon.SpoonModelBuilder)29 DefaultCoreFactory (spoon.support.DefaultCoreFactory)29 List (java.util.List)25 FileSystemFile (spoon.support.compiler.FileSystemFile)25 ArrayList (java.util.ArrayList)24 CtExpression (spoon.reflect.code.CtExpression)20 Annotation (java.lang.annotation.Annotation)19 MainTest (spoon.test.main.MainTest)19