use of com.google.template.soy.soytree.TemplateRegistry in project closure-templates by google.
the class FindIjParamsVisitorTest method testSimpleRecursion.
@Test
public void testSimpleRecursion() {
// Tests direct recursion (cycle of 1) and indirect recursion with a cycle of 2.
// aaa -> bbb, bbb -> {bbb, ccc}, ccc -> bbb.
String fileContent = "" + "{namespace ns}\n" + "\n" + "/***/\n" + "{template .aaa}\n" + " {call .bbb /} {$ij.boo} {$ij.foo}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .bbb}\n" + " {$ij.boo} {$ij.goo} {call .bbb /} {call .ccc /}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .ccc}\n" + " {$ij.boo} {call .bbb /} {$ij.moo}\n" + "{/template}\n";
SoyFileSetNode soyTree = SoyFileSetParserBuilder.forFileContents(fileContent).parse().fileSet();
TemplateRegistry templateRegistry = new TemplateRegistry(soyTree, FAIL);
TemplateNode aaa = soyTree.getChild(0).getChild(0);
TemplateNode bbb = soyTree.getChild(0).getChild(1);
TemplateNode ccc = soyTree.getChild(0).getChild(2);
// Test with exec(aaa).
// Exercises: processCalleeHelper case 2 (bbb -> bbb).
// Exercises: processCalleeHelper case 3 (ccc -> bbb).
// Exercises: processCalleeHelper case 5 with incorporateCalleeVisitInfo case 2 (bbb -> ccc).
FindIjParamsVisitor visitor = new FindIjParamsVisitor(templateRegistry);
visitor.exec(aaa);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap).hasSize(4);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap.keySet()).hasSize(3);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap).hasSize(4);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap.keySet()).hasSize(3);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap.keySet()).hasSize(4);
}
use of com.google.template.soy.soytree.TemplateRegistry in project closure-templates by google.
the class FindIjParamsVisitorTest method testSmallerRecursiveCycleInLargerRecursiveCycle.
@Test
public void testSmallerRecursiveCycleInLargerRecursiveCycle() {
// aaa -> {bbb, ccc}, bbb -> aaa, ccc -> bbb.
String fileContent = "" + "{namespace ns}\n" + "\n" + "/***/\n" + "{template .aaa}\n" + " {$ij.foo} {$ij.boo} {call .bbb /} {call .ccc /}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .bbb}\n" + " {$ij.goo} {$ij.boo} {call .aaa /}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .ccc}\n" + " {$ij.moo} {$ij.boo} {call .bbb /}\n" + "{/template}\n";
SoyFileSetNode soyTree = SoyFileSetParserBuilder.forFileContents(fileContent).parse().fileSet();
TemplateRegistry templateRegistry = new TemplateRegistry(soyTree, FAIL);
TemplateNode aaa = soyTree.getChild(0).getChild(0);
TemplateNode bbb = soyTree.getChild(0).getChild(1);
TemplateNode ccc = soyTree.getChild(0).getChild(2);
// Test with exec(aaa).
// Exercises: processCalleeHelper case 4 with incorporateCalleeVisitInfo case 3 (ccc -> bbb).
FindIjParamsVisitor visitor = new FindIjParamsVisitor(templateRegistry);
visitor.exec(aaa);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap.keySet()).hasSize(4);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap.keySet()).hasSize(4);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap.keySet()).hasSize(4);
}
use of com.google.template.soy.soytree.TemplateRegistry in project closure-templates by google.
the class FindIjParamsVisitorTest method testLargerRecursiveCycle.
@Test
public void testLargerRecursiveCycle() {
// Tests indirect recursion with a cycle of 3.
// aaa -> bbb, bbb -> ccc, ccc -> aaa.
String fileContent = "" + "{namespace ns}\n" + "\n" + "/***/\n" + "{template .aaa}\n" + " {$ij.foo} {$ij.boo} {call .bbb /}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .bbb}\n" + " {$ij.goo} {call .ccc /} {$ij.boo}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .ccc}\n" + " {call .aaa /} {$ij.moo} {$ij.boo}\n" + "{/template}\n";
SoyFileSetNode soyTree = SoyFileSetParserBuilder.forFileContents(fileContent).parse().fileSet();
TemplateRegistry templateRegistry = new TemplateRegistry(soyTree, FAIL);
TemplateNode aaa = soyTree.getChild(0).getChild(0);
TemplateNode bbb = soyTree.getChild(0).getChild(1);
TemplateNode ccc = soyTree.getChild(0).getChild(2);
// Test with exec(aaa).
// Exercises: processCalleeHelper case 3 (ccc-> aaa).
// Exercises: processCalleeHelper case 5 with incorporateCalleeVisitInfo case 3 (bbb -> ccc).
// Exercises: processCalleeHelper case 5 with incorporateCalleeVisitInfo case 2 (aaa -> bbb).
FindIjParamsVisitor visitor = new FindIjParamsVisitor(templateRegistry);
visitor.exec(aaa);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(ccc).ijParamToCalleesMultimap.keySet()).hasSize(4);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(bbb).ijParamToCalleesMultimap.keySet()).hasSize(4);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap).hasSize(6);
assertThat(visitor.exec(aaa).ijParamToCalleesMultimap.keySet()).hasSize(4);
}
use of com.google.template.soy.soytree.TemplateRegistry in project closure-templates by google.
the class FindIndirectParamsVisitorTest method testFindIndirectParams.
@Test
public void testFindIndirectParams() {
String fileContent1 = "{namespace alpha}\n" + "\n" + "/** @param? a0 @param? b3 */\n" + // 'b3' listed by alpha.zero
"{template .zero}\n" + " {call .zero data=\"all\" /}\n" + // recursive call should not cause 'a0' to be added
" {call .one data=\"all\" /}\n" + " {call .two /}\n" + " {call beta.zero /}\n" + " {call .five data=\"all\"}\n" + " {param a5: $a0 /}\n" + " {param b2: 88 /}\n" + " {/call}\n" + "{/template}\n" + "\n" + "/** @param? a1 */\n" + "{template .one}\n" + " {call .three data=\"all\" /}\n" + " {call .four /}\n" + " {$a1}\n" + "{/template}\n" + "\n" + "/** @param? a2 */\n" + "{template .two}\n" + " {$a2}\n" + "{/template}\n" + "\n" + "/** @param? a3 */\n" + "{template .three}\n" + " {call beta.one data=\"all\" /}\n" + " {$a3}\n" + "{/template}\n" + "\n" + "/** @param? a4 */\n" + "{template .four}\n" + " {call external.one /}\n" + " {$a4}\n" + "{/template}\n" + "\n" + "/** @param? a5 @param? b4 */\n" + // 'b4' listed by alpha.five
"{template .five}\n" + " {call beta.two data=\"all\" /}\n" + " {call beta.three data=\"all\" /}\n" + " {call beta.four data=\"all\" /}\n" + " {$b4}\n" + " {$a5}\n" + "{/template}\n" + "\n" + "/** @param? a6 */\n" + "{template .six}\n" + " {$a6}\n" + "{/template}\n";
String fileContent2 = "{namespace beta}\n" + "\n" + "/** @param? b0 */\n" + "{template .zero}\n" + " {$b0}\n" + "{/template}\n" + "\n" + "/** @param? b1 */\n" + "{template .one}\n" + " {call alpha.six data=\"all\" /}\n" + " {$b1}\n" + "{/template}\n" + "\n" + "/** @param? b2 */\n" + "{template .two}\n" + " {$b2}\n" + "{/template}\n" + "\n" + "/** @param? b3 */\n" + "{template .three}\n" + " {$b3}\n" + "{/template}\n" + "\n" + "/** @param? b4 */\n" + "{template .four}\n" + " {$b4}\n" + "{/template}\n";
ErrorReporter boom = ErrorReporter.exploding();
SoyFileSetNode soyTree = SoyFileSetParserBuilder.forFileContents(fileContent1, fileContent2).errorReporter(boom).parse().fileSet();
TemplateRegistry registry = new TemplateRegistry(soyTree, boom);
SoyFileNode a = soyTree.getChild(0);
TemplateNode a0 = a.getChild(0);
TemplateNode a1 = a.getChild(1);
// TemplateNode a2 = a.getChild(2);
TemplateNode a3 = a.getChild(3);
// TemplateNode a4 = a.getChild(4);
TemplateNode a5 = a.getChild(5);
TemplateNode a6 = a.getChild(6);
SoyFileNode b = soyTree.getChild(1);
// TemplateNode b0 = b.getChild(0);
TemplateNode b1 = b.getChild(1);
// TemplateNode b2 = b.getChild(2);
TemplateNode b3 = b.getChild(3);
TemplateNode b4 = b.getChild(4);
IndirectParamsInfo ipi = new FindIndirectParamsVisitor(registry).exec(a0);
assertThat(ipi.mayHaveIndirectParamsInExternalCalls).isFalse();
assertThat(ipi.mayHaveIndirectParamsInExternalDelCalls).isFalse();
Map<String, TemplateParam> ipMap = ipi.indirectParams;
assertThat(ipMap).hasSize(6);
assertThat(ipMap).doesNotContainKey("a0");
assertThat(ipMap).containsKey("a1");
assertThat(ipMap).doesNotContainKey("a2");
assertThat(ipMap).containsKey("a3");
assertThat(ipMap).doesNotContainKey("a4");
assertThat(ipMap).doesNotContainKey("a5");
assertThat(ipMap).containsKey("a6");
assertThat(ipMap).doesNotContainKey("b0");
assertThat(ipMap).containsKey("b1");
assertThat(ipMap).doesNotContainKey("b2");
assertThat(ipMap).containsKey("b3");
assertThat(ipMap).containsKey("b4");
Multimap<String, TemplateNode> pktcm = ipi.paramKeyToCalleesMultimap;
assertThat(pktcm).valuesForKey("a1").isEqualTo(ImmutableSet.of(a1));
assertThat(pktcm).valuesForKey("a3").isEqualTo(ImmutableSet.of(a3));
assertThat(pktcm).valuesForKey("a6").isEqualTo(ImmutableSet.of(a6));
assertThat(pktcm).valuesForKey("b1").isEqualTo(ImmutableSet.of(b1));
assertThat(pktcm).valuesForKey("b3").isEqualTo(ImmutableSet.of(b3));
// 'b4' listed by alpha.five
assertThat(pktcm).valuesForKey("b4").isEqualTo(ImmutableSet.of(a5, b4));
}
use of com.google.template.soy.soytree.TemplateRegistry in project closure-templates by google.
the class FindTransitiveDepTemplatesVisitorTest method testTwoPathsToSameTemplate.
@Test
public void testTwoPathsToSameTemplate() {
// aaa -> {bbb, ccc}, ccc -> bbb.
String fileContent = "" + "{namespace ns}\n" + "\n" + "/***/\n" + "{template .aaa}\n" + " {call .bbb /} {$ij.boo} {call .ccc /} {$ij.foo}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .bbb}\n" + " {$ij.boo} {$ij.goo}\n" + "{/template}\n" + "\n" + "/***/\n" + "{template .ccc}\n" + " {$ij.boo} {$ij.moo + $ij.woo} {call .bbb /}\n" + "{/template}\n";
ParseResult result = SoyFileSetParserBuilder.forFileContents(fileContent).errorReporter(FAIL).parse();
TemplateRegistry templateRegistry = result.registry();
SoyFileSetNode soyTree = result.fileSet();
TemplateNode aaa = soyTree.getChild(0).getChild(0);
TemplateNode bbb = soyTree.getChild(0).getChild(1);
TemplateNode ccc = soyTree.getChild(0).getChild(2);
// Test with exec(aaa).
// Exercises: processCalleeHelper case 4 with incorporateCalleeVisitInfo case 1 (ccc -> bbb).
FindTransitiveDepTemplatesVisitor visitor = new FindTransitiveDepTemplatesVisitor(templateRegistry);
Map<TemplateNode, TransitiveDepTemplatesInfo> memoizedInfoMap = visitor.templateToFinishedInfoMap;
visitor.exec(aaa);
assertThat(memoizedInfoMap).hasSize(3);
assertThat(memoizedInfoMap.get(bbb).depTemplateSet).isEqualTo(ImmutableSet.of(bbb));
assertThat(memoizedInfoMap.get(ccc).depTemplateSet).isEqualTo(ImmutableSet.of(ccc, bbb));
assertThat(memoizedInfoMap.get(aaa).depTemplateSet).isEqualTo(ImmutableSet.of(aaa, bbb, ccc));
}
Aggregations