96 lines
1.8 KiB
C
96 lines
1.8 KiB
C
#include <stdarg.h>
|
|
#include <criterion/criterion.h>
|
|
#include <lexer.h>
|
|
|
|
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);
|
|
|
|
size_t const SZ = 512;
|
|
char str[SZ];
|
|
node_str(tok, str, SZ);
|
|
|
|
cr_assert_str_eq(str, oracle);
|
|
|
|
node_free(tok);
|
|
lexer_free(&lex);
|
|
}
|
|
|
|
static void test_lexer_ko(char const* source)
|
|
{
|
|
lexer_t lex;
|
|
err_t err;
|
|
err_init(&err);
|
|
|
|
lexer_init(&lex, source, &err);
|
|
|
|
node_t* tok = lexer_try_new_next(&lex);
|
|
|
|
cr_assert(tok == NULL);
|
|
cr_assert(err.size > 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<n; i++)
|
|
{
|
|
node_t* tok = lexer_try_new_next(&lexer);
|
|
cr_assert(NULL != tok);
|
|
|
|
size_t const SZ = 256;
|
|
char tok_str[SZ];
|
|
node_str(tok, tok_str, SZ);
|
|
|
|
char* oracle = va_arg(lst, char*);
|
|
cr_assert_str_eq(oracle, tok_str);
|
|
|
|
node_free(tok);
|
|
}
|
|
|
|
lexer_free(&lexer);
|
|
va_end(lst);
|
|
}
|
|
|
|
Test(lexer, num) {
|
|
test_lexer_ok("NUM[35]", " 35 ");
|
|
test_lexer_ok("NUM[-270]", " -270 ");
|
|
test_lexer_ok("NUM[0.7]", "0.7");
|
|
test_lexer_ok("NUM[3.]", "3.");
|
|
test_lexer_ok("NUM[.4]", ".4");
|
|
test_lexer_ok("NUM[-3.14]", "-3.14");
|
|
|
|
test_lexer("-2 4.1 6", 3,
|
|
"NUM[-2]",
|
|
"NUM[4.1]",
|
|
"NUM[6]");
|
|
|
|
test_lexer_ko("-3..14");
|
|
test_lexer_ko("..2");
|
|
test_lexer_ko("2..");
|
|
}
|
|
|
|
Test(lexer, bool) {
|
|
test_lexer_ko("true3");
|
|
test_lexer_ko("1true");
|
|
test_lexer_ko("afalse");
|
|
test_lexer_ko("falset");
|
|
|
|
test_lexer("true 3 false", 3,
|
|
"BOOL[true]",
|
|
"NUM[3]",
|
|
"BOOL[false]");
|
|
}
|