diff options
| author | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-21 12:39:20 +0100 |
|---|---|---|
| committer | Thomas Vanbesien <tvanbesi@proton.me> | 2026-02-21 12:39:34 +0100 |
| commit | d699849b2360f90c61f645c5d4d4232cd3e1c962 (patch) | |
| tree | c929ec20ca3b16fe3d34bd75e412ca49f7420125 /tests/test_alloc.c | |
| download | Libft-d699849b2360f90c61f645c5d4d4232cd3e1c962.tar.gz Libft-d699849b2360f90c61f645c5d4d4232cd3e1c962.zip | |
Initial commit: libft Part 1 with tests and documentation
Reimplements 24 libc functions with Doxygen-documented header
and test suite comparing against libc.
Diffstat (limited to 'tests/test_alloc.c')
| -rw-r--r-- | tests/test_alloc.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/test_alloc.c b/tests/test_alloc.c new file mode 100644 index 0000000..191fbbb --- /dev/null +++ b/tests/test_alloc.c @@ -0,0 +1,159 @@ +#include "../libft.h" +#include "test_utils.h" + +static void +_s_ft_strdup_null (void) +{ + _s_sink = (size_t)ft_strdup (NULL); +} +static void +_s_libc_strdup_null (void) +{ + _s_sink = (size_t)strdup (NULL); +} + +/* ====================================== + * calloc + * ====================================== */ + +static void +_s_test_calloc (void) +{ + int i; + char label[64]; + + printf ("-- calloc --\n"); + + /* zeroed memory */ + { + char *ft_p = ft_calloc (100, 1); + char *libc_p = calloc (100, 1); + _s_check ("zeroed", ft_p && libc_p && memcmp (ft_p, libc_p, 100) == 0); + free (ft_p); + free (libc_p); + } + + /* nmemb=0 */ + { + void *p = ft_calloc (0, 10); + _s_check ("nmemb=0 not NULL", p != NULL); + free (p); + } + + /* size=0 */ + { + void *p = ft_calloc (10, 0); + _s_check ("size=0 not NULL", p != NULL); + free (p); + } + + /* overflow protection */ + { + void *p = ft_calloc ((size_t)-1, 2); + _s_check ("overflow returns NULL", p == NULL); + } + + /* single byte */ + { + unsigned char *p = ft_calloc (1, 1); + _s_check ("single byte zeroed", p && *p == 0); + free (p); + } + + /* randomized: check all bytes are zero */ + srand (time (NULL)); + for (i = 0; i < 50; i++) + { + size_t nmemb = rand () % 500 + 1; + size_t size = rand () % 50 + 1; + unsigned char *ft_p = ft_calloc (nmemb, size); + unsigned char *libc_p = calloc (nmemb, size); + int ok = 1; + size_t j; + if (!ft_p || !libc_p) + { + ok = 0; + } + else + { + for (j = 0; j < nmemb * size; j++) + { + if (ft_p[j] != 0) + { + ok = 0; + break; + } + } + } + snprintf (label, sizeof (label), "random nmemb=%zu size=%zu", nmemb, + size); + _s_check (label, ok); + free (ft_p); + free (libc_p); + } +} + +/* ====================================== + * strdup + * ====================================== */ + +static void +_s_test_strdup (void) +{ + int i; + char label[64]; + + printf ("-- strdup --\n"); + + /* NULL */ + _s_check_both_crash ("strdup NULL", _s_ft_strdup_null, _s_libc_strdup_null); + + /* empty string */ + { + char *p = ft_strdup (""); + _s_check ("empty", p && strcmp (p, "") == 0); + free (p); + } + + /* returns independent copy */ + { + char src[] = "hello"; + char *p = ft_strdup (src); + _s_check ("independent copy", p && p != src && strcmp (p, src) == 0); + src[0] = 'X'; + _s_check ("mutation safe", p[0] == 'h'); + free (p); + } + + /* randomized */ + for (i = 0; i < 50; i++) + { + int len = rand () % 500 + 1; + char *src = malloc (len + 1); + int j; + char *ft_p; + char *libc_p; + if (!src) + continue; + for (j = 0; j < len; j++) + src[j] = 'A' + rand () % 26; + src[len] = '\0'; + ft_p = ft_strdup (src); + libc_p = strdup (src); + snprintf (label, sizeof (label), "random len=%d", len); + _s_check (label, ft_p && libc_p && strcmp (ft_p, libc_p) == 0); + free (src); + free (ft_p); + free (libc_p); + } +} + +int +main (void) +{ + printf ("=== alloc functions ===\n"); + _s_test_calloc (); + _s_test_strdup (); + _s_print_results (); + return (_s_fail != 0); +} |
