/*
* Copyright 2013 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.soytree;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.template.soy.base.SourceLocation;
import com.google.template.soy.error.ExplodingErrorReporter;
import com.google.template.soy.error.FormattingErrorReporter;
import com.google.template.soy.exprparse.ExpressionParser;
import com.google.template.soy.exprparse.SoyParsingContext;
import com.google.template.soy.exprtree.ExprNode;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Unit tests for {@link MsgSubstUnitBaseVarNameUtils}.
*
*/
@RunWith(JUnit4.class)
public final class MsgSubstUnitBaseVarNameUtilsTest {
private static final SoyParsingContext FAIL = SoyParsingContext.exploding();
@Test
public void testGenBaseNames() {
String exprText = "$aaBb";
assertNaiveBaseNameForExpr("AA_BB", exprText);
assertShortestBaseNameForExpr("AA_BB", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("AA_BB"), exprText);
exprText = "$aaBb.ccDd";
assertNaiveBaseNameForExpr("CC_DD", exprText);
assertShortestBaseNameForExpr("CC_DD", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("CC_DD", "AA_BB_CC_DD"), exprText);
exprText = "$ij.aaBb.ccDd";
assertNaiveBaseNameForExpr("CC_DD", exprText);
assertShortestBaseNameForExpr("CC_DD", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("CC_DD", "AA_BB_CC_DD"), exprText);
exprText = "$aaBb?.ccDd0";
assertNaiveBaseNameForExpr("CC_DD_0", exprText);
assertShortestBaseNameForExpr("CC_DD_0", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("CC_DD_0", "AA_BB_CC_DD_0"), exprText);
exprText = "aa_._bb._CC_DD_";
assertNaiveBaseNameForExpr("CC_DD", exprText);
assertShortestBaseNameForExpr("CC_DD", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("CC_DD", "BB_CC_DD", "AA_BB_CC_DD"), exprText);
exprText = "length($aaBb)";
assertNaiveBaseNameForExpr("FALLBACK", exprText);
assertShortestBaseNameForExpr("FALLBACK", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.<String>of(), exprText);
exprText = "$aaBb + 1";
assertNaiveBaseNameForExpr("FALLBACK", exprText);
assertShortestBaseNameForExpr("FALLBACK", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.<String>of(), exprText);
exprText = "$aa0_0bb[1][2]?.cc_dd.ee?[5]";
assertNaiveBaseNameForExpr("FALLBACK", exprText);
assertShortestBaseNameForExpr("EE_5", exprText);
assertCandidateBaseNamesForExpr(
ImmutableList.of("EE_5", "CC_DD_EE_5", "AA_0_0_BB_1_2_CC_DD_EE_5"), exprText);
exprText = "$aa0_0bb['foo'][2]?.cc_dd.ee?[5]";
assertNaiveBaseNameForExpr("FALLBACK", exprText);
assertShortestBaseNameForExpr("EE_5", exprText);
assertCandidateBaseNamesForExpr(ImmutableList.of("EE_5", "CC_DD_EE_5"), exprText);
}
private void assertNaiveBaseNameForExpr(String expected, String exprText) {
ExprNode exprRoot =
new ExpressionParser(exprText, SourceLocation.UNKNOWN, FAIL).parseExpression();
String actual = MsgSubstUnitBaseVarNameUtils.genNaiveBaseNameForExpr(exprRoot, "FALLBACK");
assertEquals(expected, actual);
}
private void assertShortestBaseNameForExpr(String expected, String exprText) {
ExprNode exprRoot =
new ExpressionParser(exprText, SourceLocation.UNKNOWN, FAIL).parseExpression();
String actual = MsgSubstUnitBaseVarNameUtils.genShortestBaseNameForExpr(exprRoot, "FALLBACK");
assertEquals(expected, actual);
}
private void assertCandidateBaseNamesForExpr(List<String> expected, String exprText) {
ExprNode exprRoot =
new ExpressionParser(exprText, SourceLocation.UNKNOWN, FAIL).parseExpression();
List<String> actual = MsgSubstUnitBaseVarNameUtils.genCandidateBaseNamesForExpr(exprRoot);
assertEquals(expected, actual);
}
@Test
public void testGenNoncollidingBaseNames() {
assertNoncollidingBaseNamesForExprs(ImmutableList.of("GENDER"), "$user.gender");
assertErrorMsgWhenGenNoncollidingBaseNamesForExprs(
"Cannot generate noncolliding base names for vars. "
+ "Colliding expressions: '$gender' and '$ij.gender'.",
"$gender, $ij.gender");
assertErrorMsgWhenGenNoncollidingBaseNamesForExprs(
"Cannot generate noncolliding base names for vars. "
+ "Colliding expressions: '$ij.gender' and '$userGender'.",
"$userGender, $ij.gender");
assertNoncollidingBaseNamesForExprs(
ImmutableList.of("USERGENDER", "GENDER"), "$usergender, $ij.gender");
assertNoncollidingBaseNamesForExprs(
ImmutableList.of("USER_GENDER", "TARGET_GENDER"), "$userGender, $target.gender");
assertNoncollidingBaseNamesForExprs(
ImmutableList.of("USER_GENDER", "TARGET_GENDER"), "$user.gender, $target.gender");
assertNoncollidingBaseNamesForExprs(
ImmutableList.of("USER_GENDER", "TARGET_0_GENDER", "TARGET_1_GENDER"),
"$ij.user.gender, $target[0]?.gender, $target[1]?.gender");
assertNoncollidingBaseNamesForExprs(
ImmutableList.of("OWNER_GENDER", "ACTOR_GENDER", "TARGET_GENDER"),
"$owner.gender, $actor.gender, $target.gender");
}
private void assertNoncollidingBaseNamesForExprs(List<String> expected, String exprListText) {
List<ExprNode> exprRoots =
new ExpressionParser(exprListText, SourceLocation.UNKNOWN, FAIL).parseExpressionList();
List<String> actual =
MsgSubstUnitBaseVarNameUtils.genNoncollidingBaseNamesForExprs(
exprRoots, "FALLBACK", ExplodingErrorReporter.get());
assertEquals(expected, actual);
}
private void assertErrorMsgWhenGenNoncollidingBaseNamesForExprs(
String expectedErrorMsg, String exprListText) {
List<ExprNode> exprRoots =
new ExpressionParser(exprListText, SourceLocation.UNKNOWN, FAIL).parseExpressionList();
FormattingErrorReporter errorReporter = new FormattingErrorReporter();
MsgSubstUnitBaseVarNameUtils.genNoncollidingBaseNamesForExprs(
exprRoots, "FALLBACK", errorReporter);
assertThat(errorReporter.getErrorMessages()).hasSize(1);
assertThat(Iterables.getOnlyElement(errorReporter.getErrorMessages()))
.contains(expectedErrorMsg);
}
}