diff --git a/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java b/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java index 78450465a..f2ef3de1d 100644 --- a/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java +++ b/src/main/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParser.java @@ -4,21 +4,23 @@ public class StrictWhitespaceControlParser implements WhitespaceControlParser { @Override public boolean hasLeftTrim(String unwrapped) { - return unwrapped.charAt(0) == '-'; + return !unwrapped.isEmpty() && unwrapped.charAt(0) == '-'; } @Override public String stripLeft(String unwrapped) { - return unwrapped.substring(1); + return unwrapped.isEmpty() ? unwrapped : unwrapped.substring(1); } @Override public boolean hasRightTrim(String unwrapped) { - return unwrapped.charAt(unwrapped.length() - 1) == '-'; + return !unwrapped.isEmpty() && unwrapped.charAt(unwrapped.length() - 1) == '-'; } @Override public String stripRight(String unwrapped) { - return unwrapped.substring(0, unwrapped.length() - 1); + return unwrapped.isEmpty() + ? unwrapped + : unwrapped.substring(0, unwrapped.length() - 1); } } diff --git a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java index 09289d4b5..48bbed0c9 100644 --- a/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java +++ b/src/test/java/com/hubspot/jinjava/interpret/LegacyWhitespaceControlParsingTest.java @@ -82,4 +82,11 @@ public void itErrorsOnSpacedDashesOnBothSides() { .isThrownBy(() -> modern.render(template, new HashMap<>())) .withMessageContaining("syntax error at position 9"); } + + @Test + public void itHandlesEmptyExpressionToken() { + String template = "{{}}"; + + assertThat(modern.render(template, new HashMap<>())).isEqualTo(""); + } } diff --git a/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest b/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest new file mode 100644 index 000000000..b0343e287 --- /dev/null +++ b/src/test/java/com/hubspot/jinjava/tree/parse/StrictWhitespaceControlParserTest @@ -0,0 +1,48 @@ +package com.hubspot.jinjava.tree.parse; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.Before; +import org.junit.Test; + +public class StrictWhitespaceControlParserTest { + + StrictWhitespaceControlParser parser; + + @Before + public void setUp() { + parser = new StrictWhitespaceControlParser(); + } + + @Test + public void itDoesNotTrimEmptyTokenOnLeft() { + assertThat(parser.hasLeftTrim("")).isFalse(); + } + + @Test + public void itDoesNotTrimEmptyTokenOnRight() { + assertThat(parser.hasRightTrim("")).isFalse(); + } + + @Test + public void itStripsLeftOfEmptyTokenWithoutThrowing() { + assertThat(parser.stripLeft("")).isEqualTo(""); + } + + @Test + public void itStripsRightOfEmptyTokenWithoutThrowing() { + assertThat(parser.stripRight("")).isEqualTo(""); + } + + @Test + public void itDetectsLeftTrim() { + assertThat(parser.hasLeftTrim("-foo")).isTrue(); + assertThat(parser.stripLeft("-foo")).isEqualTo("foo"); + } + + @Test + public void itDetectsRightTrim() { + assertThat(parser.hasRightTrim("foo-")).isTrue(); + assertThat(parser.stripRight("foo-")).isEqualTo("foo"); + } +}