diff options
Diffstat (limited to 'tests/src/test_strtrim.c')
| -rw-r--r-- | tests/src/test_strtrim.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/tests/src/test_strtrim.c b/tests/src/test_strtrim.c new file mode 100644 index 0000000..aa57ef7 --- /dev/null +++ b/tests/src/test_strtrim.c @@ -0,0 +1,162 @@ +#include "libft.h" +#include "test_utils.h" + +_S_CRASH (ft_strtrim_null_s1, ft_strtrim (NULL, " ")) +_S_CRASH (ft_strtrim_null_set, ft_strtrim ("hello", NULL)) +_S_CRASH (ft_strtrim_null_both, ft_strtrim (NULL, NULL)) + +static void +_s_test_strtrim (void) +{ + int i; + char label[128]; + + _s_section ("ft_strtrim"); + + /* NULL crashes */ + _s_check ("NULL s1 crashes", _s_crashes (_s_crash_ft_strtrim_null_s1)); + _s_check ("NULL set crashes", _s_crashes (_s_crash_ft_strtrim_null_set)); + _s_check ("NULL both crashes", _s_crashes (_s_crash_ft_strtrim_null_both)); + + /* trim spaces from both ends */ + { + char *p = ft_strtrim (" hello ", " "); + _s_check ("spaces both ends", p && strcmp (p, "hello") == 0); + free (p); + } + + /* trim multiple characters */ + { + char *p = ft_strtrim ("xxhelloxx", "x"); + _s_check ("single trim char", p && strcmp (p, "hello") == 0); + free (p); + } + + /* trim set with multiple chars */ + { + char *p = ft_strtrim (".-hello-.", ".-"); + _s_check ("multi-char set", p && strcmp (p, "hello") == 0); + free (p); + } + + /* nothing to trim */ + { + char *p = ft_strtrim ("hello", " "); + _s_check ("nothing to trim", p && strcmp (p, "hello") == 0); + free (p); + } + + /* everything trimmed */ + { + char *p = ft_strtrim ("aaaa", "a"); + _s_check ("all trimmed", p && strcmp (p, "") == 0); + free (p); + } + + /* empty string */ + { + char *p = ft_strtrim ("", "abc"); + _s_check ("empty s1", p && strcmp (p, "") == 0); + free (p); + } + + /* empty set */ + { + char *p = ft_strtrim (" hello ", ""); + _s_check ("empty set", p && strcmp (p, " hello ") == 0); + free (p); + } + + /* trim only leading */ + { + char *p = ft_strtrim ("xxhello", "x"); + _s_check ("leading only", p && strcmp (p, "hello") == 0); + free (p); + } + + /* trim only trailing */ + { + char *p = ft_strtrim ("helloxx", "x"); + _s_check ("trailing only", p && strcmp (p, "hello") == 0); + free (p); + } + + /* set chars in the middle are preserved */ + { + char *p = ft_strtrim (" hello world ", " "); + _s_check ("middle preserved", p && strcmp (p, "hello world") == 0); + free (p); + } + + /* single character string, in set */ + { + char *p = ft_strtrim ("x", "x"); + _s_check ("single char trimmed", p && strcmp (p, "") == 0); + free (p); + } + + /* single character string, not in set */ + { + char *p = ft_strtrim ("x", "y"); + _s_check ("single char kept", p && strcmp (p, "x") == 0); + free (p); + } + + /* returns independent copy */ + { + char s1[] = "hello"; + char *p = ft_strtrim (s1, ""); + _s_check ("independent ptr", p && p != s1); + free (p); + } + + /* randomized */ + for (i = 0; i < _S_RAND_ITERS; i++) + { + int core_len = rand () % 100 + 1; + int pad_len = rand () % 20; + char *src; + char *p; + char *expected; + int j; + + src = malloc (pad_len + core_len + pad_len + 1); + expected = malloc (core_len + 1); + if (!src || !expected) + { + free (src); + free (expected); + continue; + } + + /* pad with spaces, core with letters */ + for (j = 0; j < pad_len; j++) + src[j] = ' '; + for (j = 0; j < core_len; j++) + { + src[pad_len + j] = 'A' + rand () % 26; + expected[j] = src[pad_len + j]; + } + expected[core_len] = '\0'; + for (j = 0; j < pad_len; j++) + src[pad_len + core_len + j] = ' '; + src[pad_len + core_len + pad_len] = '\0'; + + p = ft_strtrim (src, " "); + snprintf (label, sizeof (label), "random core=%d pad=%d", core_len, + pad_len); + _s_check (label, p && strcmp (p, expected) == 0); + free (src); + free (expected); + free (p); + } +} + +int +main (void) +{ + srand (time (NULL)); + _s_test_strtrim (); + _s_print_results (); + return (_s_fail != 0); +} |
