Skip to content

Commit 60e931f

Browse files
committed
Handle alternate exptest syntax for is false and is true exp tests
1 parent 84c54df commit 60e931f

3 files changed

Lines changed: 78 additions & 2 deletions

File tree

src/main/java/com/hubspot/jinjava/el/ext/ExtendedParser.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,10 @@ protected AstNode nonliteral() throws ScanException, ParseException {
281281
switch (getToken().getSymbol()) {
282282
case IDENTIFIER:
283283
String name = consumeToken().getImage();
284+
Symbol lookahead = lookahead(0).getSymbol();
284285
if (
285286
getToken().getSymbol() == COLON &&
286-
lookahead(0).getSymbol() == IDENTIFIER &&
287+
(lookahead == IDENTIFIER || lookahead == FALSE || lookahead == TRUE) &&
287288
(lookahead(1).getSymbol() == LPAREN || (isPossibleExpTestOrFilter(name)))
288289
) { // ns:f(...)
289290
consumeToken();

src/test/java/com/hubspot/jinjava/el/ExpressionResolverTest.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,40 @@ public void itResolvesLazyExpressionsInNested() {
602602
assertThat(interpreter.getErrorsCopy()).isEmpty();
603603
}
604604

605+
@Test
606+
public void itResolvesAlternateExpTestSyntax() {
607+
assertThat(interpreter.render("{% if 2 is even %}yes{% endif %}")).isEqualTo("yes");
608+
609+
assertThat(
610+
interpreter.render(
611+
"{% if exptest:even.evaluate(2, ____int3rpr3t3r____) %}yes{% endif %}"
612+
)
613+
)
614+
.isEqualTo("yes");
615+
assertThat(
616+
interpreter.render(
617+
"{% if exptest:false.evaluate(false, ____int3rpr3t3r____) %}yes{% endif %}"
618+
)
619+
)
620+
.isEqualTo("yes");
621+
}
622+
623+
@Test
624+
public void itResolvesAlternateExpTestSyntaxForTrueAndFalseExpTests() {
625+
assertThat(
626+
interpreter.render(
627+
"{% if exptest:false.evaluate(false, ____int3rpr3t3r____) %}yes{% endif %}"
628+
)
629+
)
630+
.isEqualTo("yes");
631+
assertThat(
632+
interpreter.render(
633+
"{% if exptest:true.evaluate(true, ____int3rpr3t3r____) %}yes{% endif %}"
634+
)
635+
)
636+
.isEqualTo("yes");
637+
}
638+
605639
public String result(String value, TestClass testClass) {
606640
testClass.touch();
607641
return value;

src/test/java/com/hubspot/jinjava/el/ext/ExtendedParserTest.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33
import static org.assertj.core.api.Assertions.assertThat;
44
import static org.assertj.core.api.Assertions.fail;
55

6+
import com.hubspot.jinjava.lib.exptest.IsEvenExpTest;
7+
import com.hubspot.jinjava.lib.exptest.IsFalseExpTest;
8+
import com.hubspot.jinjava.lib.exptest.IsTrueExpTest;
69
import de.odysseus.el.tree.impl.Builder;
10+
import de.odysseus.el.tree.impl.Builder.Feature;
711
import de.odysseus.el.tree.impl.ast.AstBinary;
12+
import de.odysseus.el.tree.impl.ast.AstDot;
813
import de.odysseus.el.tree.impl.ast.AstIdentifier;
914
import de.odysseus.el.tree.impl.ast.AstMethod;
1015
import de.odysseus.el.tree.impl.ast.AstNested;
@@ -127,6 +132,39 @@ public void itParsesExpTestLikeDictionary() {
127132
assertThat(astNode).isInstanceOf(AstDict.class);
128133
}
129134

135+
@Test
136+
public void itResolvesAlternateExpTestSyntax() {
137+
AstNode regularSyntax = buildExpressionNodes("#{2 is even}");
138+
139+
assertThat(regularSyntax).isInstanceOf(AstMethod.class);
140+
assertThat(regularSyntax.getChild(0)).isInstanceOf(AstDot.class);
141+
assertThat(regularSyntax.getChild(1)).isInstanceOf(AstParameters.class);
142+
AstNode alternateSyntax = buildExpressionNodes(
143+
"#{exptest:even.evaluate(2, ____int3rpr3t3r____)}"
144+
);
145+
146+
assertThat(alternateSyntax).isInstanceOf(AstMethod.class);
147+
assertThat(alternateSyntax.getChild(0)).isInstanceOf(AstDot.class);
148+
assertThat(alternateSyntax.getChild(1)).isInstanceOf(AstParameters.class);
149+
}
150+
151+
@Test
152+
public void itResolvesAlternateExpTestSyntaxForTrueAndFalseExpTests() {
153+
AstNode falseExpTest = buildExpressionNodes(
154+
"#{exptest:false.evaluate(2, ____int3rpr3t3r____)}"
155+
);
156+
assertThat(falseExpTest).isInstanceOf(AstMethod.class);
157+
assertThat(falseExpTest.getChild(0)).isInstanceOf(AstDot.class);
158+
assertThat(falseExpTest.getChild(1)).isInstanceOf(AstParameters.class);
159+
160+
AstNode trueExpTest = buildExpressionNodes(
161+
"#{exptest:true.evaluate(2, ____int3rpr3t3r____)}"
162+
);
163+
assertThat(trueExpTest).isInstanceOf(AstMethod.class);
164+
assertThat(trueExpTest.getChild(0)).isInstanceOf(AstDot.class);
165+
assertThat(trueExpTest.getChild(1)).isInstanceOf(AstParameters.class);
166+
}
167+
130168
private void assertForExpression(
131169
AstNode astNode,
132170
String leftExpected,
@@ -164,7 +202,10 @@ private void assertLeftAndRightByOperator(
164202
}
165203

166204
private AstNode buildExpressionNodes(String input) {
167-
ExtendedCustomParser extendedParser = new ExtendedCustomParser(new Builder(), input);
205+
ExtendedCustomParser extendedParser = new ExtendedCustomParser(
206+
new Builder(Feature.METHOD_INVOCATIONS),
207+
input
208+
);
168209
extendedParser.consumeTokenExpose();
169210
extendedParser.consumeTokenExpose();
170211

0 commit comments

Comments
 (0)