diff options
Diffstat (limited to 'test/parser_test.c')
-rw-r--r-- | test/parser_test.c | 49 |
1 files changed, 25 insertions, 24 deletions
diff --git a/test/parser_test.c b/test/parser_test.c index 43eb27b..acc238f 100644 --- a/test/parser_test.c +++ b/test/parser_test.c @@ -48,9 +48,9 @@ assert_parser_error(char *src, char *error_msg) make_lexer_from_static_src(&lexer, src); parser_init(&parser, &lexer, scope); - ast_node_t *ast_function = parser_parse_function_declaration(&parser); + ast_node_t *ast_ns = parser_parse_ns(&parser); - assert_false(ast_function != NULL); + assert_false(ast_ns != NULL); assert_int(1, ==, parser.errors_len); assert_string_equal(error_msg, parser.errors[0].message); @@ -64,17 +64,15 @@ test_parse_function(const MunitParameter params[], void *user_data_or_fixture) lexer_t lexer; scope_t *scope = scope_new(); - make_lexer_from_static_src(&lexer, "fn main(): i32 { \nreturn 42;\n }"); + make_lexer_from_static_src(&lexer, "fn add(): i32 { return 2; } fn main(): i32 { \nreturn 42;\n }"); parser_init(&parser, &lexer, scope); - ast_node_t *ast_function = parser_parse_function_declaration(&parser); + ast_node_t *ast_ns = parser_parse_ns(&parser); - assert_not_null(ast_function); + assert_not_null(ast_ns); - char actual[5]; + ast_node_t *ast_function = ast_node_ns_get_function_node_by_name(ast_ns, "main"); - string_view_to_str(&ast_function->data.function.identifier.name, actual); - assert_string_equal("main", actual); - assert_int(AST_FUNCTION_DECLARATION, ==, ast_function->kind); + assert_not_null(ast_function); ast_node_t *ast_return = vector_at(ast_function->data.function.body->data.block.body, 0); @@ -106,7 +104,7 @@ test_parse_variable_definition(const MunitParameter params[], void *user_data_or char actual[5]; - string_view_to_str(&ast_function->data.function.identifier.name, actual); + string_view_to_str(&ast_function->data.function.prototype.identifier.name, actual); assert_string_equal("main", actual); assert_int(AST_FUNCTION_DECLARATION, ==, ast_function->kind); @@ -143,7 +141,7 @@ test_parse_boolean(const MunitParameter params[], void *user_data_or_fixture) assert_true(ast_function != NULL); - assert_string_view_equal("my_bool_fn", ast_function->data.function.identifier.name); + assert_string_view_equal("my_bool_fn", ast_node_function_declaration_name(ast_function)); assert_int(AST_FUNCTION_DECLARATION, ==, ast_function->kind); ast_node_t *ast_variable = vector_at(ast_function->data.function.body->data.block.body, 0); @@ -320,35 +318,35 @@ test_parse_all_boolean_expression(const MunitParameter params[], void *user_data ast_node_t *exp1 = ast_expression; assert_int(TYPE_BOOL, ==, exp1->result_type); - assert_int(AST_BINOP_NOT_EQUAL, ==, exp1->data.binary_operation.kind); + assert_int(AST_BINOP_AND, ==, exp1->data.binary_operation.kind); ast_node_t *exp2 = exp1->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp2->result_type); - assert_int(AST_BINOP_EQUAL, ==, exp2->data.binary_operation.kind); + assert_int(AST_BINOP_OR, ==, exp2->data.binary_operation.kind); - ast_node_t *exp3 = exp2->data.binary_operation.left; + ast_node_t *exp3 = exp1->data.binary_operation.right; assert_int(TYPE_BOOL, ==, exp3->result_type); - assert_int(AST_BINOP_LT_EQUAL, ==, exp3->data.binary_operation.kind); + assert_int(AST_BINOP_NOT_EQUAL, ==, exp3->data.binary_operation.kind); ast_node_t *exp4 = exp3->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp4->result_type); - assert_int(AST_BINOP_GT_EQUAL, ==, exp4->data.binary_operation.kind); + assert_int(AST_BINOP_EQUAL, ==, exp4->data.binary_operation.kind); ast_node_t *exp5 = exp4->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp5->result_type); - assert_int(AST_BINOP_LT, ==, exp5->data.binary_operation.kind); + assert_int(AST_BINOP_LT_EQUAL, ==, exp5->data.binary_operation.kind); ast_node_t *exp6 = exp5->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp6->result_type); - assert_int(AST_BINOP_GT, ==, exp6->data.binary_operation.kind); + assert_int(AST_BINOP_GT_EQUAL, ==, exp6->data.binary_operation.kind); ast_node_t *exp7 = exp6->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp7->result_type); - assert_int(AST_BINOP_AND, ==, exp7->data.binary_operation.kind); + assert_int(AST_BINOP_LT, ==, exp7->data.binary_operation.kind); ast_node_t *exp8 = exp7->data.binary_operation.left; assert_int(TYPE_BOOL, ==, exp8->result_type); - assert_int(AST_BINOP_OR, ==, exp8->data.binary_operation.kind); + assert_int(AST_BINOP_GT, ==, exp8->data.binary_operation.kind); ast_node_destroy(ast_expression); scope_destroy(scope); @@ -396,10 +394,10 @@ assert_string_view_equal(char *expected, string_view_t actual) static MunitResult test_parse_basic_syntax_errors(const MunitParameter params[], void *user_data_or_fixture) { - assert_parser_error("main(): i32 { return 42; }", "expected 'fn' but got 'TOKEN_NAME'"); + assert_parser_error("main(): i32 { return 42; }", "Unexpected token 'main'"); assert_parser_error("fn (): i32 { return 42; }", "expected 'TOKEN_NAME' but got '('"); assert_parser_error("fn main): i32 { return 42; }", "expected '(' but got ')'"); - assert_parser_error("fn main(: i32 { return 42; }", "expected ')' but got ':'"); + assert_parser_error("fn main(: i32 { return 42; }", "expected 'TOKEN_NAME' but got ':'"); assert_parser_error("fn main() i32 { return 42; }", "expected ':' but got 'TOKEN_NAME'"); assert_parser_error("fn main(): { return 42; }", "expected 'TOKEN_NAME' but got '{'"); assert_parser_error("fn main(): i32 return 42; }", "expected '{' but got 'return'"); @@ -429,8 +427,11 @@ test_parse_basic_syntax_errors(const MunitParameter params[], void *user_data_or "incompatible types: expected 'bool', actual 'i32'."); assert_parser_error("fn main(): i32 { if true { return true; } \nreturn 42;\n }", "incompatible types: expected 'i32', actual 'bool'."); - // FIXME: once function calls are implemented, this error should inform that - // neither a variable or function call was found. + assert_parser_error("fn main(): i32 { return fn_404(); }", "identifier 'fn_404' not defined"); + assert_parser_error("fn my_bool_fn(): bool { return true; } fn main(): i32 { return my_bool_fn(); }", + "incompatible types: expected 'i32', actual 'bool'."); + assert_parser_error("fn main(): i32 { return my_bool_fn(); } fn my_bool_fn(): bool { return true; }", + "incompatible types: expected 'i32', actual 'bool'."); assert_parser_error("fn main(): i32 { oxi 42; }", "unexpected token 'TOKEN_NAME' value='oxi'"); return MUNIT_OK; |