diff options
Diffstat (limited to 'test/moe/anita/mai/lexer/LexerStringTest.java')
| -rw-r--r-- | test/moe/anita/mai/lexer/LexerStringTest.java | 102 |
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() { + } +} |
