/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.template.soy.passes;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.template.soy.SoyFileSetParserBuilder;
import com.google.template.soy.error.ErrorReporter;
import com.google.template.soy.error.ExplodingErrorReporter;
import com.google.template.soy.passes.FindIndirectParamsVisitor.IndirectParamsInfo;
import com.google.template.soy.soytree.SoyFileNode;
import com.google.template.soy.soytree.SoyFileSetNode;
import com.google.template.soy.soytree.TemplateNode;
import com.google.template.soy.soytree.TemplateRegistry;
import com.google.template.soy.soytree.defn.TemplateParam;
import java.util.Map;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit tests for FindIndirectParamsVisitor.
*
*/
@RunWith(JUnit4.class)
public final class FindIndirectParamsVisitorTest {
@Test
public void testFindIndirectParams() {
String fileContent1 =
"{namespace alpha autoescape=\"deprecated-noncontextual\"}\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 autoescape=\"deprecated-noncontextual\"}\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 = ExplodingErrorReporter.get();
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));
}
}