#include #include #include static void test_lexer_ok(char const* oracle, char const* source) { lexer_t lex; lexer_init(&lex, source, NULL); node_t* tok = lexer_try_new_next(&lex); cr_assert(tok != NULL, "error -> %s", source); size_t const SZ = 512; char str[SZ]; node_str(tok, str, SZ); cr_assert_str_eq(str, oracle, "error -> %s", source); node_free(tok); lexer_free(&lex); } static void test_lexer_ko(char const* source) { lexer_t lex; err_t err; err_init(&err); err.quiet = 1; lexer_init(&lex, source, &err); node_t* tok = lexer_try_new_next(&lex); cr_assert(tok == NULL, "error -> %s", source); cr_assert_gt(err.total, 0); err_free(&err); lexer_free(&lex); } static void test_lexer(char const* source, size_t n, ...) { va_list lst; va_start(lst, n); lexer_t lexer; lexer_init(&lexer, source, NULL); for (size_t i=0; i >=5", 6, "NUM[1]", "LT", "LE", "GT", "GE", "NUM[5]"); } Test(lexer, num_arith) { test_lexer("()+-*/^%", 8, "OPAR", "CPAR", "ADD", "SUB", "MUL", "DIV", "POW", "MODULO"); } Test(lexer, bool_arith) { test_lexer("and or not", 3, "AND", "OR", "NOT"); } Test(lexer, let_var) { test_lexer("let x = 3", 4, "LET", "IDENT[x]", "ASSIGN", "NUM[3]"); } Test(lexer, blocks) { test_lexer("begin end", 2, "BEGIN", "END"); }