Add another parser test

This commit is contained in:
Laria 2021-12-18 17:06:17 +01:00
parent 3759813ed9
commit c74bd74bda

View file

@ -977,6 +977,149 @@ TEST(simple_function, t) {
destroy_parser_test(pt);
}
TEST(complex_function, t) {
struct parser_test *pt = new_parser_test(t,
// 1 2
// 12345678901234567890123456789
"{ a ~b c?d?(e f) -> foo; bar\n"
" baz\n"
"1 [] ->; x [y?x ~ys] ->\n"
" a\n"
" b\n"
" c { x -> y }\n"
" \n"
"}\n"
);
expect_expr(pt, (struct apfl_expr) {
.type = APFL_EXPR_COMPLEX_FUNC,
.position = POS(1, 1),
.complex_func = LIST_BEGIN(pt, complex_func)
LIST_ADD {
.params = LIST_BEGIN(pt, params)
LIST_ADD {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "a"),
},
LIST_ADD {
.type = APFL_EXPR_PARAM_EXPAND,
.expand = BEGIN_NEW(pt, struct apfl_expr_param) {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "b"),
} END_NEW
},
LIST_ADD {
.type = APFL_EXPR_PARAM_PREDICATE,
.predicate = {
.lhs = BEGIN_NEW(pt, struct apfl_expr_param) {
.type = APFL_EXPR_PARAM_PREDICATE,
.predicate = {
.lhs = BEGIN_NEW(pt, struct apfl_expr_param) {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "c")
} END_NEW,
.rhs = new_var(pt, 1, 10, "d"),
},
} END_NEW,
.rhs = BEGIN_NEW(pt, struct apfl_expr) {
.type = APFL_EXPR_CALL,
.position = POS(1, 12),
.call = {
.callee = new_var(pt, 1, 13, "e"),
.arguments = LIST_BEGIN(pt, list)
LIST_ADD list_item(false, new_var(pt, 1, 15, "f")),
LIST_END,
},
} END_NEW,
},
},
LIST_END,
.body = LIST_BEGIN(pt, body)
LIST_ADD var(pt, 1, 21, "foo"),
LIST_ADD var(pt, 1, 26, "bar"),
LIST_ADD var(pt, 2, 5, "baz"),
LIST_END,
},
LIST_ADD {
.params = LIST_BEGIN(pt, params)
LIST_ADD {
.type = APFL_EXPR_PARAM_CONSTANT,
.constant = num_const(1),
},
LIST_ADD {
.type = APFL_EXPR_PARAM_LIST,
.list = LIST_BEGIN(pt, params)
LIST_END,
},
LIST_END,
.body = LIST_BEGIN(pt, body)
LIST_END,
},
LIST_ADD {
.params = LIST_BEGIN(pt, params)
LIST_ADD {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "x"),
},
LIST_ADD {
.type = APFL_EXPR_PARAM_LIST,
.list = LIST_BEGIN(pt, params)
LIST_ADD {
.type = APFL_EXPR_PARAM_PREDICATE,
.predicate = {
.lhs = BEGIN_NEW(pt, struct apfl_expr_param) {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "y"),
} END_NEW,
.rhs = new_var(pt, 3, 15, "x"),
},
},
LIST_ADD {
.type = APFL_EXPR_PARAM_EXPAND,
.expand = BEGIN_NEW(pt, struct apfl_expr_param) {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "ys"),
} END_NEW,
},
LIST_END
},
LIST_END,
.body = LIST_BEGIN(pt, body)
LIST_ADD var(pt, 4, 5, "a"),
LIST_ADD var(pt, 5, 5, "b"),
LIST_ADD {
.type = APFL_EXPR_CALL,
.position = POS(6, 5),
.call = {
.callee = new_var(pt, 6, 5, "c"),
.arguments = LIST_BEGIN(pt, list)
LIST_ADD list_item(false, BEGIN_NEW(pt, struct apfl_expr) {
.type = APFL_EXPR_COMPLEX_FUNC,
.position = POS(6, 7),
.complex_func = LIST_BEGIN(pt, complex_func)
LIST_ADD {
.params = LIST_BEGIN(pt, params)
LIST_ADD {
.type = APFL_EXPR_PARAM_VAR,
.var = new_string(pt, "x"),
},
LIST_END,
.body = LIST_BEGIN(pt, body)
LIST_ADD var(pt, 6, 14, "y"),
LIST_END
}
LIST_END
} END_NEW),
LIST_END,
},
}
LIST_END
},
LIST_END,
});
expect_eof(pt);
destroy_parser_test(pt);
}
TESTS_BEGIN
ADDTEST(empty),
ADDTEST(hello_world),
@ -995,4 +1138,5 @@ TESTS_BEGIN
ADDTEST(dict),
ADDTEST(assignment),
ADDTEST(simple_function),
ADDTEST(complex_function),
TESTS_END