|
20 | 20 | import spoon.support.compiler.FileSystemFile;
|
21 | 21 | import spoon.support.template.Parameters;
|
22 | 22 | import spoon.template.TemplateMatcher;
|
| 23 | +import spoon.template.TemplateParameter; |
| 24 | +import spoon.test.template.testclasses.ArrayAccessTemplate; |
23 | 25 | import spoon.test.template.testclasses.InvocationTemplate;
|
24 | 26 | import spoon.test.template.testclasses.SecurityCheckerTemplate;
|
25 | 27 | import spoon.test.template.testclasses.bounds.CheckBound;
|
@@ -476,4 +478,29 @@ public void testTemplateInvocationSubstitution() throws Exception {
|
476 | 478 | //iface.$method$() becomes iface.hashCode()
|
477 | 479 | assertEquals("iface.hashCode()", templateRoot.toString());
|
478 | 480 | }
|
| 481 | + @Test |
| 482 | + public void testTemplateArrayAccess() throws Exception { |
| 483 | + //contract: the template engine supports substitution of arrays of parameters. |
| 484 | + Launcher spoon = new Launcher(); |
| 485 | + spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/testclasses/ArrayAccessTemplate.java")); |
| 486 | + |
| 487 | + spoon.buildModel(); |
| 488 | + Factory factory = spoon.getFactory(); |
| 489 | + |
| 490 | + CtClass<?> resultKlass = factory.Class().create("Result"); |
| 491 | + CtClass<?> templateClass = factory.Class().get(ArrayAccessTemplate.class); |
| 492 | + //create array of template parameters, which contains CtBlocks |
| 493 | + TemplateParameter[] params = templateClass.getMethod("sampleBlocks").getBody().getStatements().toArray(new TemplateParameter[0]); |
| 494 | + new ArrayAccessTemplate(params).apply(resultKlass); |
| 495 | + CtMethod<?> m = resultKlass.getMethod("method"); |
| 496 | + //check that both TemplateParameter usages were replaced by appropriate parameter value |
| 497 | + assertEquals(2, m.getBody().getStatements().size()); |
| 498 | + assertTrue(m.getBody().getStatements().get(0) instanceof CtBlock); |
| 499 | + assertEquals("int i = 0", ((CtBlock)m.getBody().getStatements().get(0)).getStatement(0).toString()); |
| 500 | + assertTrue(m.getBody().getStatements().get(1) instanceof CtBlock); |
| 501 | + assertEquals("java.lang.String s = \"Spoon is cool!\"", ((CtBlock)m.getBody().getStatements().get(1)).getStatement(0).toString()); |
| 502 | + //check that both @Parameter usage was replaced by appropriate parameter value |
| 503 | + CtMethod<?> m2 = resultKlass.getMethod("method2"); |
| 504 | + assertEquals("java.lang.System.out.println(\"second\")", m2.getBody().getStatement(0).toString()); |
| 505 | + } |
479 | 506 | }
|
0 commit comments