#include "libft.h" #include "test_utils.h" #include _S_CRASH (ft_strmapi_null, ft_strmapi (NULL, NULL)) static char _s_to_upper (unsigned int i, char c) { (void)i; return (toupper (c)); } static char _s_add_index (unsigned int i, char c) { return (c + i); } static void _s_test_strmapi (void) { int i; char label[128]; _s_section ("ft_strmapi"); /* NULL crashes */ _s_check ("NULL crashes", _s_crashes (_s_crash_ft_strmapi_null)); /* basic: to uppercase */ { char *p = ft_strmapi ("hello", _s_to_upper); _s_check ("to_upper", p && strcmp (p, "HELLO") == 0); free (p); } /* function receives correct index */ { char *p = ft_strmapi ("aaaa", _s_add_index); _s_check ("index passed", p && p[0] == 'a' && p[1] == 'b' && p[2] == 'c' && p[3] == 'd'); free (p); } /* empty string */ { char *p = ft_strmapi ("", _s_to_upper); _s_check ("empty", p && strcmp (p, "") == 0); free (p); } /* returns independent copy */ { char s[] = "hello"; char *p = ft_strmapi (s, _s_to_upper); _s_check ("independent ptr", p && p != s); _s_check ("original unchanged", strcmp (s, "hello") == 0); free (p); } /* single character */ { char *p = ft_strmapi ("a", _s_to_upper); _s_check ("single char", p && strcmp (p, "A") == 0); free (p); } /* randomized: apply to_upper, compare with manual */ for (i = 0; i < _S_RAND_ITERS; i++) { int len = rand () % 200 + 1; char *src = malloc (len + 1); char *expected = malloc (len + 1); char *p; int j; if (!src || !expected) { free (src); free (expected); continue; } for (j = 0; j < len; j++) { src[j] = 'a' + rand () % 26; expected[j] = toupper (src[j]); } src[len] = '\0'; expected[len] = '\0'; p = ft_strmapi (src, _s_to_upper); snprintf (label, sizeof (label), "random len=%d", len); _s_check (label, p && strcmp (p, expected) == 0); free (src); free (expected); free (p); } } int main (void) { srand (time (NULL)); _s_test_strmapi (); _s_print_results (); return (_s_fail != 0); }