summaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorElias Haugsbakk <[email protected]>2026-09-18 23:10:31 +0200
committerElias Haugsbakk <[email protected]>2026-09-19 01:59:23 +0200
commit1ef6f0e6b9083748e5b91743f15f10f09c6b8432 (patch)
tree66a0144ae1ffb8f42b915551021ef5e30f64fe2a /src/test/java
parentdf845a788a831c169a0725f49f96cae0a896ad64 (diff)
Implement parser creating AST
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/no/eliashaugsbakk/kompilator/parsing/ParserTest.java70
-rw-r--r--src/test/java/no/eliashaugsbakk/kompilator/tokenization/LexerTest.java18
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());
}
}