From c74bd74bda0bf251eef739c3071df600ff97c49c Mon Sep 17 00:00:00 2001 From: Laria Carolin Chabowski Date: Sat, 18 Dec 2021 17:06:17 +0100 Subject: [PATCH] Add another parser test --- src/parser_test.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/src/parser_test.c b/src/parser_test.c index 84f8029..403e0a4 100644 --- a/src/parser_test.c +++ b/src/parser_test.c @@ -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