diff options
| author | Elias Haugsbakk <[email protected]> | 2026-09-18 23:10:31 +0200 |
|---|---|---|
| committer | Elias Haugsbakk <[email protected]> | 2026-09-19 01:59:23 +0200 |
| commit | 1ef6f0e6b9083748e5b91743f15f10f09c6b8432 (patch) | |
| tree | 66a0144ae1ffb8f42b915551021ef5e30f64fe2a /src/test/java | |
| parent | df845a788a831c169a0725f49f96cae0a896ad64 (diff) | |
Implement parser creating AST
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/no/eliashaugsbakk/kompilator/parsing/ParserTest.java | 70 | ||||
| -rw-r--r-- | src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java | 18 |
2 files changed, 79 insertions, 9 deletions
diff --git a/src/test/java/no/eliashaugsbakk/kompilator/parsing/ParserTest.java b/src/test/java/no/eliashaugsbakk/kompilator/parsing/ParserTest.java new file mode 100644 index 0000000..133e9a6 --- /dev/null +++ b/src/test/java/no/eliashaugsbakk/kompilator/parsing/ParserTest.java @@ -0,0 +1,70 @@ +package no.eliashaugsbakk.kompilator.parsing; + +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.KEYWORD; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.LPAREN; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.RPAREN; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.SEMICOLON; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.STRING; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import no.eliashaugsbakk.kompilator.parsing.node.Program; +import no.eliashaugsbakk.kompilator.parsing.node.expression.FunctionCall; +import no.eliashaugsbakk.kompilator.parsing.node.expression.StringLiteral; +import no.eliashaugsbakk.kompilator.parsing.node.statement.ExpressionStatement; +import no.eliashaugsbakk.kompilator.tokenization.Token; +import org.junit.jupiter.api.Test; + +class ParserTest { + + @Test + void validSyntaxBuildsCorrectTree() throws ParserException { + List<Token> tokens = List.of( + new Token(KEYWORD, "print", 1, 0), + new Token(LPAREN, "(", 1, 5), + new Token(STRING, "Hello", 1, 6), + new Token(RPAREN, ")", 1, 13), + new Token(SEMICOLON, ";", 1, 14) + ); + + AST ast = new Parser(tokens).parse(); + + // Verify tree structure + assertNotNull(ast.root); + assertInstanceOf(Program.class, ast.root); + Program program = (Program) ast.root; + assertEquals(1, program.statements.size()); + + ExpressionStatement stmt = (ExpressionStatement) program.statements.getFirst(); + assertInstanceOf(FunctionCall.class, stmt.expression); + + FunctionCall call = (FunctionCall) stmt.expression; + assertEquals("print", call.functionName); + assertEquals(1, call.arguments.size()); + assertEquals("Hello", ((StringLiteral) call.arguments.getFirst()).value); + } + + @Test + void missingSemicolonThrows() { + List<Token> tokens = List.of( + new Token(KEYWORD, "print", 1, 0), + new Token(LPAREN, "(", 1, 5), + new Token(STRING, "Hello", 1, 6), + new Token(RPAREN, ")", 1, 13) + ); + + assertThrows(ParserException.class, () -> new Parser(tokens).parse()); + } + + @Test + void missingParenthesisThrows() { + List<Token> tokens = List.of( + new Token(KEYWORD, "print", 1, 0), + new Token(STRING, "Hello", 1, 5), + new Token(RPAREN, ")", 1, 12), + new Token(SEMICOLON, ";", 1, 13) + ); + + assertThrows(ParserException.class, () -> new Parser(tokens).parse()); + } +} diff --git a/src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java b/src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java index d1fedb9..7f4a5b3 100644 --- a/src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java +++ b/src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java @@ -24,17 +24,17 @@ class LexerTest { // tokens.forEach(t-> IO.println(t.type + " : " + t.value)); - assertSame(KEYWORD, tokens.getFirst().type); - assertEquals(1, tokens.get(0).line); - assertEquals(1, tokens.get(0).colum); + assertSame(KEYWORD, tokens.getFirst().type()); + assertEquals(1, tokens.get(0).line()); + assertEquals(1, tokens.get(0).colum()); - assertSame(LPAREN, tokens.get(1).type); + assertSame(LPAREN, tokens.get(1).type()); - assertSame(STRING, tokens.get(2).type); - assertTrue(tokens.get(2).value.contains("Hello, World")); + assertSame(STRING, tokens.get(2).type()); + assertTrue(tokens.get(2).value().contains("Hello, World")); - assertSame(RPAREN, tokens.get(3).type); - assertSame(SEMICOLON, tokens.get(4).type); - assertSame(EOF, tokens.get(5).type); + assertSame(RPAREN, tokens.get(3).type()); + assertSame(SEMICOLON, tokens.get(4).type()); + assertSame(EOF, tokens.get(5).type()); } } |
