2023-12-09 17:24:41 +00:00
|
|
|
#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);
|
|
|
|
|
2023-12-15 18:30:20 +00:00
|
|
|
cr_assert(NULL != node, "error -> %s", source);
|
2023-12-09 17:24:41 +00:00
|
|
|
|
|
|
|
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(" § ");
|
|
|
|
}
|
2023-12-09 21:59:24 +00:00
|
|
|
|
|
|
|
Test(parser, bool) {
|
|
|
|
test_parser_ok("MOD(BOOL[true],BOOL[false])", "true false");
|
|
|
|
}
|
2023-12-10 03:49:28 +00:00
|
|
|
|
|
|
|
Test(parser, str) {
|
|
|
|
test_parser_ok("MOD(STR[bim bam bum])", " \"bim bam bum\"");
|
|
|
|
}
|
2023-12-11 17:01:22 +00:00
|
|
|
|
|
|
|
Test(parser, assert) {
|
|
|
|
test_parser_ok("MOD(ASSERT(BOOL[false]))", " assert false ");
|
|
|
|
test_parser_ok("MOD(ASSERT(BOOL[true]))", " assert true ");
|
|
|
|
}
|
2023-12-15 18:30:20 +00:00
|
|
|
|
|
|
|
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 ");
|
|
|
|
}
|
2023-12-15 20:32:17 +00:00
|
|
|
|
|
|
|
Test(parser, cmp) {
|
|
|
|
test_parser_ok("MOD(LT(NUM[3],NUM[3]))", " 3 < 3 ");
|
|
|
|
test_parser_ok("MOD(LE(NUM[3],NUM[3]))", " 3 <= 3 ");
|
|
|
|
test_parser_ok("MOD(GT(NUM[3],NUM[3]))", " 3 > 3 ");
|
|
|
|
test_parser_ok("MOD(GE(NUM[3],NUM[3]))", " 3 >= 3 ");
|
|
|
|
}
|
2023-12-15 21:31:01 +00:00
|
|
|
|
|
|
|
Test(parser, num_arith) {
|
|
|
|
test_parser_ok("MOD(ADD(NUM[1],MUL(NUM[2],NUM[3])))", " 1 + 2 * 3 ");
|
|
|
|
test_parser_ok("MOD(MUL(ADD(NUM[1],NUM[2]),NUM[3]))", " (1 + 2) * 3 ");
|
|
|
|
test_parser_ok("MOD(SUB(NUM[1],DIV(NUM[2],NUM[3])))", " 1 - 2 / 3 ");
|
|
|
|
test_parser_ok("MOD(DIV(SUB(NUM[1],NUM[2]),NUM[3]))", " (1 - 2) / 3 ");
|
|
|
|
test_parser_ok("MOD(POW(NUM[2],ADD(NUM[1],NUM[2])))", " 2^(1+2) ");
|
|
|
|
}
|
2023-12-16 18:12:20 +00:00
|
|
|
|
|
|
|
Test(parser, bool_arith) {
|
|
|
|
test_parser_ok("MOD(OR(AND(BOOL[true],BOOL[false]),NOT(BOOL[true])))",
|
|
|
|
" true and false or not true ");
|
|
|
|
|
|
|
|
test_parser_ok("MOD(ASSERT(AND(BOOL[true],BOOL[false])))",
|
|
|
|
" assert (true and false) ");
|
|
|
|
}
|