From 358355a05beb0240028763078efb30fbd334f7fe Mon Sep 17 00:00:00 2001 From: Batoste Date: Thu, 29 Jan 2026 21:49:04 +0100 Subject: [PATCH] fix(tests_parser): add some test --- tests/test_parser.c | 108 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/tests/test_parser.c b/tests/test_parser.c index 8c8b200..370858e 100644 --- a/tests/test_parser.c +++ b/tests/test_parser.c @@ -1232,3 +1232,111 @@ Test(parser_func, function_bad_creation) lexer_free(&my_lexer); fclose(fd); } + +Test(parser_parse_simple_command, assignments) +{ + FILE *fd = tmpfile(); + char test_input[] = "VAR=value"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_simple_command(&my_lexer); + cr_assert_not_null(my_ast_node); + cr_assert_eq(my_ast_node->type, AST_CMD); + + if (my_ast_node->data.cmd_node.args) + cr_assert_null(my_ast_node->data.cmd_node.args[0]); + + cr_assert_not_null(my_ast_node->data.cmd_node.assignment); + cr_assert_str_eq(my_ast_node->data.cmd_node.assignment[0], "VAR=value"); + ast_free(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +} + +Test(parser_parse_simple_command, assignments_cmd) +{ + FILE *fd = tmpfile(); + char test_input[] = "echo if then else elif fi do"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_simple_command(&my_lexer); + cr_assert_not_null(my_ast_node); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[0], "echo"); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[1], "if"); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[2], "then"); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[3], "else"); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[4], "elif"); + ast_free(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +} +Test(parser_parse_simple_command, negation) +{ + FILE *fd = tmpfile(); + char test_input[] = "echo ! word"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_simple_command(&my_lexer); + cr_assert_not_null(my_ast_node); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[0], "echo"); + cr_assert_str_eq(my_ast_node->data.cmd_node.args[1], "!"); + ast_free(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +} + +Test(parser_parse_for, missing_do_error) +{ + FILE *fd = tmpfile(); + char test_input[] = "for i in a b echo ok; done"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_for(&my_lexer); + cr_assert_null(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +} +Test(parser_parse_for, miss_done) +{ + FILE *fd = tmpfile(); + char test_input[] = "for i in a; do echo ok"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_for(&my_lexer); + cr_assert_null(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +} + +Test(parser_func, func_redir) +{ + FILE *fd = tmpfile(); + char test_input[] = "foo() { echo bar; } > out.txt"; + cr_assert_not_null(fd); + fwrite(test_input, 1, sizeof(test_input) - 1, fd); + fseek(fd, 0, SEEK_SET); + struct lexer my_lexer; + lexer_init(&my_lexer, fd); + struct ast_node *my_ast_node = parse_command(&my_lexer); + cr_assert_not_null(my_ast_node); + cr_assert_eq(my_ast_node->type, AST_REDIR); + cr_assert_eq(my_ast_node->data.redir_node.child->type, AST_FUNC); + ast_free(my_ast_node); + lexer_free(&my_lexer); + fclose(fd); +}