Skip to content

Commit c226a61

Browse files
pvojtechovskysurli
authored andcommitted
review: test Template array access (#1353)
* test Template array access * fix comments
1 parent 4ed677b commit c226a61

File tree

2 files changed

+68
-0
lines changed

2 files changed

+68
-0
lines changed

src/test/java/spoon/test/template/TemplateTest.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import spoon.support.compiler.FileSystemFile;
2121
import spoon.support.template.Parameters;
2222
import spoon.template.TemplateMatcher;
23+
import spoon.template.TemplateParameter;
24+
import spoon.test.template.testclasses.ArrayAccessTemplate;
2325
import spoon.test.template.testclasses.InvocationTemplate;
2426
import spoon.test.template.testclasses.SecurityCheckerTemplate;
2527
import spoon.test.template.testclasses.bounds.CheckBound;
@@ -476,4 +478,29 @@ public void testTemplateInvocationSubstitution() throws Exception {
476478
//iface.$method$() becomes iface.hashCode()
477479
assertEquals("iface.hashCode()", templateRoot.toString());
478480
}
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+
}
479506
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package spoon.test.template.testclasses;
2+
3+
import spoon.reflect.code.CtBlock;
4+
import spoon.template.ExtensionTemplate;
5+
import spoon.template.Local;
6+
import spoon.template.Parameter;
7+
import spoon.template.TemplateParameter;
8+
9+
public class ArrayAccessTemplate extends ExtensionTemplate {
10+
11+
public void method() throws Throwable {
12+
blocks[0].S();
13+
blocks[1].S();
14+
}
15+
16+
public void method2() throws Throwable {
17+
System.out.println(strings[1]);
18+
}
19+
20+
@Parameter
21+
TemplateParameter<CtBlock<?>>[] blocks;
22+
23+
@Parameter
24+
String[] strings;
25+
26+
@Local
27+
public ArrayAccessTemplate(TemplateParameter<CtBlock<?>>[] blocks) {
28+
this.blocks = blocks;
29+
strings = new String[]{"first","second"};
30+
}
31+
32+
@Local
33+
void sampleBlocks() {
34+
{
35+
int i=0;
36+
}
37+
{
38+
String s="Spoon is cool!";
39+
}
40+
}
41+
}

0 commit comments

Comments
 (0)