roza/tests/units/parser.c

79 lines
1.5 KiB
C

#include <criterion/criterion.h>
#include <lexer.h>
#include <parser.h>
static void test_parser_ok(char const* oracle, char const* source)
{
err_t err;
err_init(&err);
lexer_t lex;
lexer_init(&lex, source, &err);
parser_t parser;
parser_init(&parser, &lex, &err);
node_t* node = parser_try_new_tree(&parser);
cr_assert(NULL != node, "error -> %s", source);
size_t const SZ = 256;
char msg[SZ];
node_str(node, msg, SZ);
cr_assert_str_eq(msg, oracle);
node_free(node);
free(node);
parser_free(&parser);
lexer_free(&lex);
err_free(&err);
}
static void test_parser_ko(char const* source)
{
err_t err;
err_init(&err);
lexer_t lex;
lexer_init(&lex, source, &err);
parser_t parser;
parser_init(&parser, &lex, &err);
node_t* node = parser_try_new_tree(&parser);
cr_assert(NULL == node);
cr_assert_gt(err.size, 0);
parser_free(&parser);
lexer_free(&lex);
err_free(&err);
}
Test(parser, num) {
test_parser_ok("MOD", "");
test_parser_ok("MOD(NUM[37],NUM[29])", "37 29");
test_parser_ko(" § ");
}
Test(parser, bool) {
test_parser_ok("MOD(BOOL[true],BOOL[false])", "true false");
}
Test(parser, str) {
test_parser_ok("MOD(STR[bim bam bum])", " \"bim bam bum\"");
}
Test(parser, assert) {
test_parser_ok("MOD(ASSERT(BOOL[false]))", " assert false ");
test_parser_ok("MOD(ASSERT(BOOL[true]))", " assert true ");
}
Test(parser, eqne) {
test_parser_ok("MOD(EQ(NUM[3],NUM[3]))", " 3 == 3 ");
test_parser_ok("MOD(NE(NUM[3],NUM[3]))", " 3 != 3 ");
}