diff options
| author | Charles <sircharlesaze@gmail.com> | 2019-11-01 17:18:40 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2019-11-01 17:18:40 +0100 |
| commit | 573d059fc002343f280945a6a58482c7e018566c (patch) | |
| tree | 9e5920fe7dc454d5a3017a126bb90ee78fb39a9c /header.h | |
| download | ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.gz ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.tar.bz2 ft_printf_test-573d059fc002343f280945a6a58482c7e018566c.zip | |
Basic testing framework
Diffstat (limited to 'header.h')
| -rw-r--r-- | header.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/header.h b/header.h new file mode 100644 index 0000000..31bfa81 --- /dev/null +++ b/header.h @@ -0,0 +1,81 @@ +#ifndef FT_PRINTF_TEST_HEADER_H +# define FT_PRINTF_TEST_HEADER_H + +# include <sys/wait.h> +# include <stdlib.h> +# include <stdio.h> +# include <unistd.h> +# include <string.h> +# include <stdbool.h> + +# define BUF_SIZE 2048 + +int pid; +bool signaled; +bool origin_signaled; +bool user_signaled; +int origin_ret; +int user_ret; +char *origin_buf; +char *user_buf; + +int ft_printf(const char *format, ...); + +void print_buf_ko(char *msg); +void print_ret_ko(char *msg); +void print_signaled_ko(char *msg); +void print_ok(void); +void print_ko(void); + +/* moulitest functions */ +void capture_close_saved_stdout(void); +void capture_stdout(void); +char *capture_stdout_get_buf(void); +void capture_stdout_destroy(void); + +# define TEST_SEGFAULT(x) do { \ + if ((pid = fork()) < 0) \ + exit(EXIT_FAILURE); \ + if (pid == 0) { \ + do { x } while(0); \ + exit(EXIT_SUCCESS); \ + } \ + wait(&pid); \ + signaled = WIFSIGNALED(pid); \ +} while(0); + +# define TEST_PRINTF(...) do { \ + capture_stdout(); \ + TEST_SEGFAULT( \ + origin_ret = printf(__VA_ARGS__); \ + origin_buf = strdup(capture_stdout_get_buf()); \ + ); \ + origin_signaled = signaled; \ + TEST_SEGFAULT( \ + user_ret = ft_printf(__VA_ARGS__); \ + user_buf = strdup(capture_stdout_get_buf()); \ + ); \ + capture_stdout_destroy(); \ + user_signaled = signaled; \ +} while (0); + +# define ASSERT_PRINTF(...) do { \ + TEST_PRINTF(__VA_ARGS__); \ + if (!origin_signaled) \ + if (user_signaled) \ + print_signaled_ko(#__VA_ARGS__); \ + else \ + print_ok(); \ + else { \ + if (strcmp(origin_buf, user_buf) != 0) \ + print_buf_ko(#__VA_ARGS__); \ + else if (origin_ret != user_ret) \ + print_ret_ko(#__VA_ARGS__); \ + else \ + print_ko(); \ + } \ + free(origin_buf); \ + free(user_buf); \ +} while (0); + +#endif |
