From 6d17fe31618e4a208644fbf00443fe17b3d5eeb7 Mon Sep 17 00:00:00 2001 From: "edgar.lugnier" Date: Thu, 29 Jan 2026 15:35:01 +0100 Subject: [PATCH] pretty_print: add some test --- tests/test_pretty_print.c | 242 +++++++++++++++++++++++++++++++++++++- 1 file changed, 239 insertions(+), 3 deletions(-) diff --git a/tests/test_pretty_print.c b/tests/test_pretty_print.c index e1abff7..44130ec 100644 --- a/tests/test_pretty_print.c +++ b/tests/test_pretty_print.c @@ -13,10 +13,10 @@ * Remove file after test */ -Test(pretty_print, echo_ok) +Test(pretty_print, simple_ast_cmd) { char buf[1024] = { 0 }; - char filename[] = "tmp_test_pretty_print.sh"; + char filename[] = "tmp_test_pretty_print_cmd.sh"; char *args[] = { "echo", "ok", NULL }; struct ast_node my_ast_node; my_ast_node.type = AST_CMD; @@ -27,6 +27,242 @@ Test(pretty_print, echo_ok) cr_assert_neq(fd, -1); cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); close(fd); - cr_assert_str_eq(buf, "echo ok\n"); + cr_assert_str_eq(buf, "\"echo\" \"ok\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_if) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_if.sh"; + char *args_cond[] = { "true", NULL }; + struct ast_node cond; + cond.type = AST_CMD; + cond.data.cmd_node.args = args_cond; + cond.data.cmd_node.assignment = NULL; + char *args_then[] = { "echo", "ok", NULL }; + struct ast_node then_node; + then_node.type = AST_CMD; + then_node.data.cmd_node.args = args_then; + then_node.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_IF; + my_ast_node.data.if_node.condition = &cond; + my_ast_node.data.if_node.then_node = &then_node; + my_ast_node.data.if_node.else_node = NULL; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "if \"true\"\nthen\n\"echo\" \"ok\"\nfi\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_list) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_list.sh"; + char *args_1[] = { "echo", "E", NULL }; + struct ast_node node_1; + node_1.type = AST_CMD; + node_1.data.cmd_node.args = args_1; + node_1.data.cmd_node.assignment = NULL; + char *args_2[] = { "echo", "R", NULL }; + struct ast_node node_2; + node_2.type = AST_CMD; + node_2.data.cmd_node.args = args_2; + node_2.data.cmd_node.assignment = NULL; + struct ast_node *children[] = { &node_1, &node_2 }; + struct ast_node my_ast_node; + my_ast_node.type = AST_LIST; + my_ast_node.data.list_node.count = 2; + my_ast_node.data.list_node.children = children; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "\"echo\" \"E\"\n\"echo\" \"R\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_pipe) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_pipe.sh"; + char *args_left[] = { "echo", "E", NULL }; + struct ast_node left; + left.type = AST_CMD; + left.data.cmd_node.args = args_left; + left.data.cmd_node.assignment = NULL; + char *args_right[] = { "cat", NULL }; + struct ast_node right; + right.type = AST_CMD; + right.data.cmd_node.args = args_right; + right.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_PIPE; + my_ast_node.data.pipe_logic_node.left = &left; + my_ast_node.data.pipe_logic_node.right = &right; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "\"echo\" \"E\"\n | \"cat\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_and) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_and.sh"; + char *args_left[] = { "true", NULL }; + struct ast_node left; + left.type = AST_CMD; + left.data.cmd_node.args = args_left; + left.data.cmd_node.assignment = NULL; + char *args_right[] = { "echo", "ok", NULL }; + struct ast_node right; + right.type = AST_CMD; + right.data.cmd_node.args = args_right; + right.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_AND; + my_ast_node.data.pipe_logic_node.left = &left; + my_ast_node.data.pipe_logic_node.right = &right; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "\"true\"\n && \"echo\" \"ok\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_or) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_or.sh"; + char *args_left[] = { "false", NULL }; + struct ast_node left; + left.type = AST_CMD; + left.data.cmd_node.args = args_left; + left.data.cmd_node.assignment = NULL; + char *args_right[] = { "echo", "ok", NULL }; + struct ast_node right; + right.type = AST_CMD; + right.data.cmd_node.args = args_right; + right.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_OR; + my_ast_node.data.pipe_logic_node.left = &left; + my_ast_node.data.pipe_logic_node.right = &right; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "\"false\"\n || \"echo\" \"ok\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_neg) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_neg.sh"; + char *args[] = { "false", NULL }; + struct ast_node node; + node.type = AST_CMD; + node.data.cmd_node.args = args; + node.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_NEG; + my_ast_node.data.neg_node.node = &node; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "! \"false\"\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_while) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_while.sh"; + char *args_cond[] = { "true", NULL }; + struct ast_node cond; + cond.type = AST_CMD; + cond.data.cmd_node.args = args_cond; + cond.data.cmd_node.assignment = NULL; + char *args_act[] = { "echo", "ok", NULL }; + struct ast_node act; + act.type = AST_CMD; + act.data.cmd_node.args = args_act; + act.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_WHILE; + my_ast_node.data.loop_node.cond = &cond; + my_ast_node.data.loop_node.action = &act; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "while \"true\"\ndo\n\"echo\" \"ok\"\ndone\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_until) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_until.sh"; + char *args_cond[] = { "false", NULL }; + struct ast_node cond; + cond.type = AST_CMD; + cond.data.cmd_node.args = args_cond; + cond.data.cmd_node.assignment = NULL; + char *args_act[] = { "echo", "ok", NULL }; + struct ast_node act; + act.type = AST_CMD; + act.data.cmd_node.args = args_act; + act.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_UNTIL; + my_ast_node.data.loop_node.cond = &cond; + my_ast_node.data.loop_node.action = &act; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "until \"false\"\ndo\n\"echo\" \"ok\"\ndone\n"); + remove(filename); +} + +Test(pretty_print, simple_ast_for) +{ + char buf[1024] = { 0 }; + char filename[] = "tmp_test_pretty_print_for.sh"; + char *value[] = { "E", "R", NULL }; + char *args_act[] = { "echo", "ok", NULL }; + struct ast_node act; + act.type = AST_CMD; + act.data.cmd_node.args = args_act; + act.data.cmd_node.assignment = NULL; + struct ast_node my_ast_node; + my_ast_node.type = AST_FOR; + my_ast_node.data.for_node.variable = "i"; + my_ast_node.data.for_node.value = value; + my_ast_node.data.for_node.action = &act; + cr_assert_eq(pretty_print(filename, my_ast_node), 0); + int fd = open(filename, O_RDONLY); + cr_assert_neq(fd, -1); + cr_assert(read(fd, buf, sizeof(buf) - 1) >= 0); + close(fd); + cr_assert_str_eq(buf, "for i in \"E\" \"R\"\ndo\n\"echo\" \"ok\"\ndone\n"); remove(filename); }