diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:10:26 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-06-06 19:10:26 +0100 |
| commit | 24019585814742baa6c8bee85b8373be319fbaa8 (patch) | |
| tree | 38faac50c0ff6a5d29e9bbb81da98bfaa518539f /src/test/java | |
| parent | fe5c62948545b21ca4af1089a1eb33a70899086c (diff) | |
Parse string literals
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java | 17 | ||||
| -rw-r--r-- | src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java | 55 |
2 files changed, 72 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java new file mode 100644 index 00000000..6e0c7654 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/ast/UntypedNodeMatchers.java @@ -0,0 +1,17 @@ +package org.shedlang.compiler.ast; + +import org.zwobble.precisely.Matcher; + +import static org.zwobble.precisely.Matchers.*; + +public class UntypedNodeMatchers { + private UntypedNodeMatchers() { + } + + public static Matcher<UntypedExpressionNode> isUntypedStringLiteralNode(String value) { + return instanceOf( + UntypedStringLiteralNode.class, + has("value", x -> x.value(), equalTo(value)) + ); + } +} diff --git a/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java b/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java new file mode 100644 index 00000000..d625a603 --- /dev/null +++ b/src/test/java/org/shedlang/compiler/parser/ParserStringLiteralTests.java @@ -0,0 +1,55 @@ +package org.shedlang.compiler.parser; + +import org.junit.jupiter.api.Test; +import org.shedlang.compiler.sources.FileFragmentSource; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.shedlang.compiler.ast.UntypedNodeMatchers.isUntypedStringLiteralNode; +import static org.shedlang.compiler.parser.ParserTesting.parseString; +import static org.zwobble.precisely.AssertThat.assertThat; +import static org.zwobble.precisely.Matchers.*; + +public class ParserStringLiteralTests { + @Test + public void canParseEmptyString() { + var source = "\"\""; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat(node, isUntypedStringLiteralNode("")); + } + + @Test + public void canParseStringWithUnescapedCharacters() { + var source = "\"abc 123 XYZ\""; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat(node, isUntypedStringLiteralNode("abc 123 XYZ")); + } + + @Test + public void canParseStringWithEscapedCharacters() { + var source = "\"\\n\\r\\t\\\\\\\"\""; + + var node = parseString(source, Parser::parseTopLevelExpression); + + assertThat(node, isUntypedStringLiteralNode("\n\r\t\\\"")); + } + + @Test + public void whenStringHasUnrecognisedEscapeSequenceThenExceptionIsThrown() { + var source = "\"a\\ab\""; + + var error = assertThrows( + UnrecognisedEscapeSequenceError.class, + () -> parseString(source, Parser::parseTopLevelExpression) + ); + + assertThat(error.getMessage(), equalTo("Unrecognised escape sequence: \\a")); + assertThat(error.getSource(), instanceOf(FileFragmentSource.class, allOf( + has("characterIndexStart", x -> x.characterIndexStart(), equalTo(1)), + has("characterIndexEnd", x -> x.characterIndexEnd(), equalTo(3)) + ))); + } +} |
