Add another parser test
This commit is contained in:
parent
3759813ed9
commit
c74bd74bda
1 changed files with 144 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue