From 8eac30c13cfa4f47a8a0aa0772b96f0813fe33a5 Mon Sep 17 00:00:00 2001 From: hachem Date: Sun, 30 Aug 2026 23:14:01 +0200 Subject: feat: add sematic analysis --- tests/sema_test.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 tests/sema_test.c (limited to 'tests/sema_test.c') diff --git a/tests/sema_test.c b/tests/sema_test.c new file mode 100644 index 0000000..a1946d9 --- /dev/null +++ b/tests/sema_test.c @@ -0,0 +1,48 @@ +#include + +#include "parser/parser.h" +#include "sema/sema.h" +#include "tests.h" + +static bool analyze_source(const char* source) +{ + struct Lexer lexer = create_lexer(source); + struct Program program; + if (!parse_program(&lexer, &program)) + { + free_program(&program); + return false; + } + + bool ok = analyze_program(&program); + free_program(&program); + return ok; +} + +static void test_valid_program(struct TestContext* context) +{ + check(context, analyze_source("const N = 1\ndata msg = \"hi\"\nproc main\n{\nsyscall\n}\n")); +} + +static void test_missing_main(struct TestContext* context) +{ + check(context, !analyze_source("proc helper\n{\nsyscall\n}\n")); +} + +static void test_duplicate_const(struct TestContext* context) +{ + check(context, !analyze_source("const X = 1\nconst X = 2\nproc main\n{\nsyscall\n}\n")); +} + +static void test_duplicate_across_kinds(struct TestContext* context) +{ + check(context, !analyze_source("data foo = \"a\"\nproc foo\n{\nsyscall\n}\nproc main\n{\nsyscall\n}\n")); +} + +void run_sema_tests(struct TestContext* context) +{ + test_valid_program(context); + test_missing_main(context); + test_duplicate_const(context); + test_duplicate_across_kinds(context); +} -- cgit v1.3