summaryrefslogtreecommitdiff
path: root/test/moe/anita/mai/lexer/LexerStringTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/moe/anita/mai/lexer/LexerStringTest.java')
-rw-r--r--test/moe/anita/mai/lexer/LexerStringTest.java102
1 files changed, 102 insertions, 0 deletions
diff --git a/test/moe/anita/mai/lexer/LexerStringTest.java b/test/moe/anita/mai/lexer/LexerStringTest.java
new file mode 100644
index 0000000..4707264
--- /dev/null
+++ b/test/moe/anita/mai/lexer/LexerStringTest.java
@@ -0,0 +1,102 @@
+package moe.anita.mai.lexer;
+
+import moe.anita.mai.buffer.MemBuf;
+import moe.anita.mai.test.Case;
+import moe.anita.mai.test.Runner;
+import moe.anita.mai.token.TokenKind;
+
+@Runner(name = "Lexer Strings")
+public final class LexerStringTest {
+
+ @Case(name = "string literal")
+ static void string() {
+ var lexer = lexer("\"hello\"");
+
+ assert lexer.next().kind() == TokenKind.STRING;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "empty string")
+ static void emptyString() {
+ var lexer = lexer("\"\"");
+
+ assert lexer.next().kind() == TokenKind.STRING;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "escaped quote")
+ static void escapedQuote() {
+ var lexer = lexer("\"hello \\\"mai\\\"\"");
+
+ assert lexer.next().kind() == TokenKind.STRING;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "escaped backslash")
+ static void escapedBackslash() {
+ var lexer = lexer("\"foo\\\\bar\"");
+
+ assert lexer.next().kind() == TokenKind.STRING;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "unterminated string")
+ static void unterminatedString() {
+ var lexer = lexer("\"hello");
+
+ assert lexer.next().kind() == TokenKind.ERROR;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "string cannot cross newline")
+ static void stringNewline() {
+ var lexer = lexer("\"hello\nworld\"");
+
+ assert lexer.next().kind() == TokenKind.ERROR;
+ }
+
+ @Case(name = "rune literal")
+ static void rune() {
+ var lexer = lexer("'a'");
+
+ assert lexer.next().kind() == TokenKind.RUNE;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "escaped rune")
+ static void escapedRune() {
+ var lexer = lexer("'\\n'");
+
+ assert lexer.next().kind() == TokenKind.RUNE;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "quote rune")
+ static void quoteRune() {
+ var lexer = lexer("'\\''");
+
+ assert lexer.next().kind() == TokenKind.RUNE;
+ assert lexer.next().kind() == TokenKind.EOF;
+ }
+
+ @Case(name = "empty rune is invalid")
+ static void emptyRune() {
+ var lexer = lexer("''");
+
+ assert lexer.next().kind() == TokenKind.ERROR;
+ }
+
+ @Case(name = "multiple characters are invalid rune")
+ static void multipleRune() {
+ var lexer = lexer("'ab'");
+
+ assert lexer.next().kind() == TokenKind.ERROR;
+ }
+
+ private static Lexer lexer(String source) {
+ return new Lexer(new MemBuf(source));
+ }
+
+ private LexerStringTest() {
+ }
+}