/* ************************************************************************** */ /* */ /* ::: :::::::: */ /* parse_pipelines.c :+: :+: :+: */ /* +:+ +:+ +:+ */ /* By: khais +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2025/02/21 13:13:58 by khais #+# #+# */ /* Updated: 2025/02/24 17:22:54 by khais ### ########.fr */ /* */ /* ************************************************************************** */ #include "../src/parser/pipeline/pipeline.h" #include "../src/parser/wordsplit/wordsplit.h" #include "../src/ft_errno.h" #include #include "ft_printf.h" #include "libft.h" #include "unistd.h" #include static t_pipeline *parse_pipeline(char *input) { t_wordlist *words = minishell_wordsplit(input); t_pipeline *pipeline = pipeline_from_wordlist(words); return (pipeline); } static void assert_pipeline_cmd_word(t_pipeline *pipeline, char *expected_word, int cmd_num, int word_num) { if (pipeline->num_cmd <= cmd_num) { ft_dprintf(STDERR_FILENO, "expected pipeline %p to have at least %d cmds, but got %d\n", pipeline, cmd_num + 1, pipeline->num_cmd); assert(false); } ft_dprintf(STDERR_FILENO, "for pipeline %p cmd %d word %d, expected '%s', and got ", pipeline, cmd_num, word_num, expected_word); assert(pipeline->cmds[cmd_num] != NULL && "null cmd at that location"); char *got_word = wordlist_get(pipeline->cmds[cmd_num]->words, word_num)->word; ft_dprintf(STDERR_FILENO, "'%s'\n", got_word); assert(expected_word == got_word || ft_strncmp(expected_word, got_word, INT_MAX) == 0); } static void test_parse_empty_pipeline(void) { t_pipeline *pipeline = parse_pipeline(""); assert(pipeline == NULL); pipeline_destroy(pipeline); } static void test_parse_pipeline_single_cmd(void) { t_pipeline *pipeline = parse_pipeline("echo hello world"); assert(pipeline->num_cmd == 1); assert_pipeline_cmd_word(pipeline, "echo", 0, 0); assert_pipeline_cmd_word(pipeline, "hello", 0, 1); assert_pipeline_cmd_word(pipeline, "world", 0, 2); pipeline_destroy(pipeline); } static void test_parse_pipeline_two_cmd(void) { t_pipeline *pipeline = parse_pipeline("echo hello world | tee output.txt"); assert_pipeline_cmd_word(pipeline, "echo", 0, 0); assert_pipeline_cmd_word(pipeline, "hello", 0, 1); assert_pipeline_cmd_word(pipeline, "world", 0, 2); assert_pipeline_cmd_word(pipeline, "tee", 1, 0); assert_pipeline_cmd_word(pipeline, "output.txt", 1, 1); pipeline_destroy(pipeline); } static void test_parse_pipeline_three_cmd(void) { t_pipeline *pipeline = parse_pipeline("echo hello world | tee output.txt | cat -e"); assert_pipeline_cmd_word(pipeline, "echo", 0, 0); assert_pipeline_cmd_word(pipeline, "hello", 0, 1); assert_pipeline_cmd_word(pipeline, "world", 0, 2); assert_pipeline_cmd_word(pipeline, "tee", 1, 0); assert_pipeline_cmd_word(pipeline, "output.txt", 1, 1); assert_pipeline_cmd_word(pipeline, "cat", 2, 0); assert_pipeline_cmd_word(pipeline, "-e", 2, 1); pipeline_destroy(pipeline); } static void test_parse_pipeline_four_cmd(void) { t_pipeline *pipeline = parse_pipeline("echo hello world | tee output.txt | cat -e | hexdump -C"); assert_pipeline_cmd_word(pipeline, "echo", 0, 0); assert_pipeline_cmd_word(pipeline, "hello", 0, 1); assert_pipeline_cmd_word(pipeline, "world", 0, 2); assert_pipeline_cmd_word(pipeline, "tee", 1, 0); assert_pipeline_cmd_word(pipeline, "output.txt", 1, 1); assert_pipeline_cmd_word(pipeline, "cat", 2, 0); assert_pipeline_cmd_word(pipeline, "-e", 2, 1); assert_pipeline_cmd_word(pipeline, "hexdump", 3, 0); assert_pipeline_cmd_word(pipeline, "-C", 3, 1); pipeline_destroy(pipeline); } static void test_parse_pipeline_double_pipe_rejected(void) { ft_errno(FT_ESUCCESS); assert(parse_pipeline("echo hello | | tee output.txt") == NULL); assert(ft_errno_get() == FT_EUNEXPECTED_PIPE); } static void test_parse_pipeline_triple_pipe_rejected(void) { ft_errno(FT_ESUCCESS); assert(parse_pipeline("echo hello | | | tee output.txt") == NULL); assert(ft_errno_get() == FT_EUNEXPECTED_PIPE); } static void test_parse_pipeline_pipe_at_start_rejected(void) { ft_errno(FT_ESUCCESS); assert(parse_pipeline("| echo hello | tee output.txt") == NULL); assert(ft_errno_get() == FT_EUNEXPECTED_PIPE); } static void test_parse_pipeline_pipe_at_end_rejected(void) { ft_errno(FT_ESUCCESS); assert(parse_pipeline("echo hello | tee output.txt |") == NULL); assert(ft_errno_get() == FT_EUNEXPECTED_PIPE); } int main(void) { test_parse_empty_pipeline(); test_parse_pipeline_single_cmd(); test_parse_pipeline_two_cmd(); test_parse_pipeline_three_cmd(); test_parse_pipeline_four_cmd(); test_parse_pipeline_double_pipe_rejected(); test_parse_pipeline_triple_pipe_rejected(); test_parse_pipeline_pipe_at_start_rejected(); test_parse_pipeline_pipe_at_end_rejected(); return (0); }