gux/lang/tests/lexer.c

71 lines
1.3 KiB
C

#include <criterion/criterion.h>
#include <vec.h>
#include <node.h>
#include <lexer.h>
static void test_lexer(char const* source, size_t size, ...)
{
va_list lst;
va_start(lst, size);
struct vec tokens;
vec_init(&tokens, 1);
struct lexer lex;
lexer_init(&lex, source);
int err = lexer_extract(&lex, &tokens);
cr_assert_eq(0, err);
cr_assert_eq(size, tokens.size,
"size (%zu) != tokens.size (%zu)",
size, tokens.size);
for (size_t i=0; i<size; i++)
{
size_t SZ = 256;
char buf[SZ];
node_str(tokens.data[i], buf, SZ);
cr_assert_str_eq(va_arg(lst, char*), buf);
}
va_end(lst);
lexer_free(&lex);
vec_free_elements(&tokens);
vec_free(&tokens);
}
Test(lexer, builtins) {
test_lexer("true false;", 3,
"BOOL[true]",
"BOOL[false]",
"SEMICOLON");
}
Test(lexer, error) {
struct vec tokens;
vec_init(&tokens, 1);
struct lexer lex;
lexer_init(&lex, " true § false;");
int res = lexer_extract(&lex, &tokens);
cr_assert_neq(0, res);
lexer_free(&lex);
vec_free_elements(&tokens);
vec_free(&tokens);
}
Test(lexer, assert) {
test_lexer("assert", 1, "ASSERT");
}
Test(lexer, comment) {
test_lexer("assert # salut \n assert", 2, "ASSERT", "ASSERT");
}
Test(lexer, bool_arith) {
test_lexer("&&||!", 3, "AND", "OR", "NOT");
}