minishell/tests/test_here_doc.c

169 lines
5.2 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* test_here_doc.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: khais <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2025/03/07 11:43:32 by khais #+# #+# */
/* Updated: 2025/04/08 16:34:50 by khais ### ########.fr */
/* */
/* ************************************************************************** */
#include <assert.h>
#include "testutil.h"
#include "libft.h"
#include <unistd.h>
#include <fcntl.h>
#include "../src/executing/here_doc/here_doc.h"
#include "../src/env/env_manip.h"
#include "../src/ft_errno.h"
static void test_here_doc_filename_generation(void)
{
char *filename1;
char *filename2;
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
ft_errno(FT_ESUCCESS);
filename1 = here_doc_random_filename();
filename2 = here_doc_random_filename();
assert(filename1 != NULL);
assert(filename2 != NULL);
ft_dprintf(STDERR_FILENO, "Got filename: [%s]\n", filename1);
ft_dprintf(STDERR_FILENO, "Got filename: [%s]\n", filename2);
assert(ft_strcmp(filename1, filename2) != 0);
free(filename1);
free(filename2);
do_leak_check();
}
static void test_here_doc_invalid_args(void)
{
t_worddesc *marker;
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
ft_errno(FT_ESUCCESS);
assert(-1 == here_doc(NULL, 0, NULL));
marker = worddesc_create(NULL, 0, NULL, WORD_TOKEN);
assert(-1 == here_doc(marker, 0, NULL));
worddesc_destroy(marker);
marker = worddesc_create(ft_strdup("EOF"), 0, NULL, WORD_TOKEN);
assert(-1 == here_doc(marker, -1, NULL));
worddesc_destroy(marker);
do_leak_check();
}
static void test_here_doc_only_end_marker(void)
{
t_worddesc *marker;
int infile;
int result;
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
ft_errno(FT_ESUCCESS);
marker = worddesc_create(ft_strdup("EOF"), 0, NULL, WORD_TOKEN);
infile = open("./here_doc_only_eof.input", O_RDONLY);
result = here_doc(marker, infile, NULL);
close(infile);
assert(result != -1);
assert(NULL == get_next_line(result));
close(result);
worddesc_destroy(marker);
do_leak_check();
}
static void test_here_doc_input_plus_end_marker(void)
{
t_worddesc *marker;
int infile;
int result;
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
ft_errno(FT_ESUCCESS);
marker = worddesc_create(ft_strdup("EOF"), 0, NULL, WORD_TOKEN);
infile = open("./here_doc_input_plus_eof.input", O_RDONLY);
result = here_doc(marker, infile, NULL);
close(infile);
worddesc_destroy(marker);
assert(result != -1);
assert_strequal("input\n", get_next_line(result));
close(result);
do_leak_check();
}
static void test_here_doc_input_no_end_marker(void)
{
t_worddesc *marker;
int infile;
int result;
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
marker = worddesc_create(ft_strdup("EOF"), 0, NULL, WORD_TOKEN);
infile = open("./here_doc_input_no_eof.input", O_RDONLY);
result = here_doc(marker, infile, NULL);
close(infile);
worddesc_destroy(marker);
assert(result != -1);
assert_strequal("input\n", get_next_line(result));
close(result);
do_leak_check();
}
static void test_here_doc_with_expansion(void)
{
t_worddesc *marker;
int infile;
int result;
t_minishell app;
ft_bzero(&app, sizeof(t_minishell));
app.env = env_set_entry(&app.env, ft_strdup("USER"), ft_strdup("kcolin"));
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
ft_errno(FT_ESUCCESS);
marker = worddesc_create(ft_strdup("EOF"), 0, NULL, WORD_TOKEN);
infile = open("./here_doc_with_expansion.input", O_RDONLY);
result = here_doc(marker, infile, &app);
close(infile);
worddesc_destroy(marker);
assert(result != -1);
assert_strequal("hello\n", get_next_line(result));
assert_strequal("kcolin\n", get_next_line(result));
assert_strequal("end\n", get_next_line(result));
close(result);
do_leak_check();
}
static void test_here_doc_with_no_expansion(void)
{
t_worddesc *marker;
int infile;
int result;
t_minishell app;
ft_bzero(&app, sizeof(t_minishell));
app.env = env_set_entry(&app.env, ft_strdup("USER"), ft_strdup("kcolin"));
ft_dprintf(STDERR_FILENO, "==> %s <==\n", __FUNCTION__);
marker = worddesc_create(ft_strdup("EOF"), W_QUOTED, NULL, WORD_TOKEN);
infile = open("./here_doc_with_expansion.input", O_RDONLY);
result = here_doc(marker, infile, &app);
close(infile);
worddesc_destroy(marker);
assert(result != -1);
assert_strequal("hello\n", get_next_line(result));
assert_strequal("$USER\n", get_next_line(result));
assert_strequal("end\n", get_next_line(result));
close(result);
do_leak_check();
}
int main(void) {
test_here_doc_filename_generation();
test_here_doc_invalid_args();
test_here_doc_only_end_marker();
test_here_doc_input_plus_end_marker();
test_here_doc_input_no_end_marker();
test_here_doc_with_expansion();
test_here_doc_with_no_expansion();
return (0);
}