#include "test_utils.h" #include "lexer.h" #include "arena.h" void test_simple_tokens() { Arena a = arena_create(1); const char* src = "fn main() { return 42; }"; size_t count; ErrorInfo error = {0}; Token* tokens = lex(&a, src, "test", &count, &error); ASSERT(tokens != NULL); ASSERT(count >= 8); ASSERT(tokens[0].kind == TOK_FN); ASSERT(tokens[1].kind == TOK_IDENT); ASSERT(tokens[2].kind == TOK_LPAREN); ASSERT(tokens[3].kind == TOK_RPAREN); ASSERT(tokens[4].kind == TOK_LBRACE); ASSERT(tokens[5].kind == TOK_RETURN); ASSERT(tokens[6].kind == TOK_INT_LIT); ASSERT(tok_int_value(&tokens[6]) == 42); arena_destroy(&a); } void test_keywords() { Arena a = arena_create(1); const char* src = "fn let if else while return i64 f64 bool void true false"; TokenKind expected[] = {TOK_FN, TOK_LET, TOK_IF, TOK_ELSE, TOK_WHILE, TOK_RETURN, TOK_I64, TOK_F64, TOK_BOOL, TOK_VOID, TOK_TRUE, TOK_FALSE, TOK_EOF}; size_t count; ErrorInfo error = {0}; Token* tokens = lex(&a, src, "test", &count, &error); ASSERT(tokens != NULL); for (int i = 0; i < 13; i++) ASSERT(tokens[i].kind == expected[i]); arena_destroy(&a); } void test_operators() { Arena a = arena_create(1); const char* src = "+ - * / % == != < > <= >= && || ! ->"; TokenKind expected[] = {TOK_PLUS, TOK_MINUS, TOK_STAR, TOK_SLASH, TOK_PERCENT, TOK_EQ_EQ, TOK_BANG_EQ, TOK_LT, TOK_GT, TOK_LT_EQ, TOK_GT_EQ, TOK_AND_AND, TOK_PIPE_PIPE, TOK_BANG, TOK_ARROW, TOK_EOF}; size_t count; ErrorInfo error = {0}; Token* tokens = lex(&a, src, "test", &count, &error); ASSERT(tokens != NULL); for (int i = 0; i < 16; i++) ASSERT(tokens[i].kind == expected[i]); arena_destroy(&a); } int main(void) { TEST_RUN(test_simple_tokens); TEST_RUN(test_keywords); TEST_RUN(test_operators); return test_summary(); }