summaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-09-12 09:39:38 +0100
committerMichael Williamson <mike@zwobble.org>2026-09-12 09:39:38 +0100
commit3f797af7e4a2e69f2f5aa5305f79960f7e7c5d13 (patch)
treea6329a31fcb42a7af8a2161eda3033a61157afa9 /src/test/java
parent972b8e2407f11d00927e81cd54efe6f1fe5c2346 (diff)
Avoid excessive backtracking when parsing unterminated strings
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
index f70fd77..18f9397 100644
--- a/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
+++ b/src/test/java/org/zwobble/mammoth/tests/styles/parsing/StyleMappingTokeniserTests.java
@@ -47,16 +47,36 @@ public class StyleMappingTokeniserTests {
}
@Test
- public void escapeSequencesInStringsAreTokenised() {
+ public void escapedStringTerminatorsInStringsAreTokenised() {
assertTokens("'Tristan\\''", isToken(TokenType.STRING, "'Tristan\\''"));
}
@Test
+ public void escapeSequencesInStringsAreTokenised() {
+ assertTokens("'Tristan\\\\'", isToken(TokenType.STRING, "'Tristan\\\\'"));
+ }
+
+ @Test
public void unterminatedStringsAreTokenised() {
assertTokens("'Tristan", isToken(TokenType.UNTERMINATED_STRING, "'Tristan"));
}
@Test
+ public void unterminatedStringsEndingWithEscapedStringTerminatorAreTokenised() {
+ assertTokens("'Tristan\\'", isToken(TokenType.UNTERMINATED_STRING, "'Tristan\\'"));
+ }
+
+ @Test
+ public void unterminatedStringsWithUnterminatedEscapeAreTokenised() {
+ assertTokens("'Tristan\\", isToken(TokenType.UNTERMINATED_STRING, "'Tristan\\"));
+ }
+
+ @Test
+ public void unterminatedStringsWithManyEscapeSequencesAreTokenised() {
+ assertTokens("'" + repeatString("\\a", 50), isToken(TokenType.UNTERMINATED_STRING, "'" + repeatString("\\a", 50)));
+ }
+
+ @Test
public void arrowsAreTokenised() {
assertTokens("=>=>", isToken(TokenType.SYMBOL, "=>"), isToken(TokenType.SYMBOL, "=>"));
}
@@ -138,4 +158,14 @@ public class StyleMappingTokeniserTests {
hasProperty("value", equalTo(value))
);
}
+
+ private String repeatString(String value, int repeats) {
+ StringBuilder builder = new StringBuilder();
+
+ for (int i = 0; i < repeats; i++) {
+ builder.append(value);
+ }
+
+ return builder.toString();
+ }
}