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); +}