#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); }