diff options
| author | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-21 16:29:51 +0100 |
|---|---|---|
| committer | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-21 16:29:51 +0100 |
| commit | a8f7e6e83bc4846c94c0489e0f6e0f807b35073e (patch) | |
| tree | 0d245c73490427a39d4338da483e335a267c6917 /tests/src/test_substr.c | |
| parent | fd62678a9cf38e3f70efbdd093c1012d448548e1 (diff) | |
| download | Libft-a8f7e6e83bc4846c94c0489e0f6e0f807b35073e.tar.gz Libft-a8f7e6e83bc4846c94c0489e0f6e0f807b35073e.zip | |
Implement libft Part 2 with tests
Add ft_substr, ft_strjoin, ft_strtrim, ft_split, ft_itoa,
ft_strmapi, ft_striteri, ft_putchar_fd, ft_putstr_fd,
ft_putendl_fd, ft_putnbr_fd.
Diffstat (limited to 'tests/src/test_substr.c')
| -rw-r--r-- | tests/src/test_substr.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/tests/src/test_substr.c b/tests/src/test_substr.c new file mode 100644 index 0000000..30e59ce --- /dev/null +++ b/tests/src/test_substr.c @@ -0,0 +1,135 @@ +#include "libft.h" +#include "test_utils.h" + +_S_CRASH (ft_substr_null, ft_substr (NULL, 0, 5)) + +static void +_s_test_substr (void) +{ + int i; + char label[128]; + + _s_section ("ft_substr"); + + /* NULL crashes */ + _s_check ("NULL crashes", _s_crashes (_s_crash_ft_substr_null)); + + /* basic substring from the middle */ + { + char *p = ft_substr ("hello world", 6, 5); + _s_check ("middle", p && strcmp (p, "world") == 0); + free (p); + } + + /* from the start */ + { + char *p = ft_substr ("hello", 0, 3); + _s_check ("from start", p && strcmp (p, "hel") == 0); + free (p); + } + + /* len larger than remaining string */ + { + char *p = ft_substr ("hello", 2, 100); + _s_check ("len > remaining", p && strcmp (p, "llo") == 0); + free (p); + } + + /* start beyond string length */ + { + char *p = ft_substr ("hello", 10, 5); + _s_check ("start > slen", p && strcmp (p, "") == 0); + free (p); + } + + /* start == string length */ + { + char *p = ft_substr ("hello", 5, 5); + _s_check ("start == slen", p && strcmp (p, "") == 0); + free (p); + } + + /* empty source string */ + { + char *p = ft_substr ("", 0, 10); + _s_check ("empty src", p && strcmp (p, "") == 0); + free (p); + } + + /* len == 0 */ + { + char *p = ft_substr ("hello", 0, 0); + _s_check ("len=0", p && strcmp (p, "") == 0); + free (p); + } + + /* full string copy */ + { + char *p = ft_substr ("hello", 0, 5); + _s_check ("full copy", p && strcmp (p, "hello") == 0); + free (p); + } + + /* single character */ + { + char *p = ft_substr ("hello", 4, 1); + _s_check ("single char", p && strcmp (p, "o") == 0); + free (p); + } + + /* returns independent copy */ + { + char src[] = "hello"; + char *p = ft_substr (src, 0, 5); + _s_check ("independent ptr", p && p != src); + free (p); + } + + /* randomized */ + for (i = 0; i < _S_RAND_ITERS; i++) + { + int slen = rand () % 200 + 1; + char *src = malloc (slen + 1); + unsigned int start; + size_t len; + char *p; + int j; + + if (!src) + continue; + for (j = 0; j < slen; j++) + src[j] = 'A' + rand () % 26; + src[slen] = '\0'; + + start = rand () % (slen + 5); + len = rand () % (slen + 5); + p = ft_substr (src, start, len); + + if (start >= (unsigned int)slen) + { + snprintf (label, sizeof (label), "random start=%u >= slen=%d", start, + slen); + _s_check (label, p && strcmp (p, "") == 0); + } + else + { + size_t remaining = slen - start; + size_t expected = remaining < len ? remaining : len; + snprintf (label, sizeof (label), "random start=%u len=%zu slen=%d", + start, len, slen); + _s_check (label, p && strlen (p) == expected + && strncmp (p, src + start, expected) == 0); + } + free (p); + free (src); + } +} + +int +main (void) +{ + srand (time (NULL)); + _s_test_substr (); + _s_print_results (); + return (_s_fail != 0); +} |
