aboutsummaryrefslogtreecommitdiffstats
path: root/tests/test_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_mem.c')
-rw-r--r--tests/test_mem.c296
1 files changed, 296 insertions, 0 deletions
diff --git a/tests/test_mem.c b/tests/test_mem.c
new file mode 100644
index 0000000..adbe12d
--- /dev/null
+++ b/tests/test_mem.c
@@ -0,0 +1,296 @@
+#include "../libft.h"
+#include "test_utils.h"
+#include <strings.h>
+
+static void
+_s_ft_memset_null (void)
+{
+ _s_sink = (size_t)ft_memset (NULL, 'A', 10);
+}
+static void
+_s_libc_memset_null (void)
+{
+ _s_sink = (size_t)memset (NULL, 'A', 10);
+}
+static void
+_s_ft_bzero_null (void)
+{
+ ft_bzero (NULL, 10);
+}
+static void
+_s_libc_bzero_null (void)
+{
+ bzero (NULL, 10);
+}
+static void
+_s_ft_memcpy_null_dst (void)
+{
+ char buf[10];
+ _s_sink = (size_t)ft_memcpy (NULL, buf, 10);
+}
+static void
+_s_libc_memcpy_null_dst (void)
+{
+ char buf[10];
+ _s_sink = (size_t)memcpy (NULL, buf, 10);
+}
+static void
+_s_ft_memcpy_null_src (void)
+{
+ char buf[10];
+ _s_sink = (size_t)ft_memcpy (buf, NULL, 10);
+}
+static void
+_s_libc_memcpy_null_src (void)
+{
+ char buf[10];
+ _s_sink = (size_t)memcpy (buf, NULL, 10);
+}
+static void
+_s_ft_memmove_null_dst (void)
+{
+ char buf[10];
+ _s_sink = (size_t)ft_memmove (NULL, buf, 10);
+}
+static void
+_s_libc_memmove_null_dst (void)
+{
+ char buf[10];
+ _s_sink = (size_t)memmove (NULL, buf, 10);
+}
+static void
+_s_ft_memmove_null_src (void)
+{
+ char buf[10];
+ _s_sink = (size_t)ft_memmove (buf, NULL, 10);
+}
+static void
+_s_libc_memmove_null_src (void)
+{
+ char buf[10];
+ _s_sink = (size_t)memmove (buf, NULL, 10);
+}
+
+/* ======================================
+ * memset
+ * ====================================== */
+
+static void
+_s_test_memset (void)
+{
+ char ft_buf[256];
+ char libc_buf[256];
+ int i;
+ int c;
+ size_t len;
+ void *ret;
+ char label[64];
+
+ printf ("-- memset --\n");
+
+ /* NULL */
+ _s_check_both_crash ("memset NULL", _s_ft_memset_null, _s_libc_memset_null);
+
+ /* zero length */
+ memset (ft_buf, 'X', 256);
+ memset (libc_buf, 'X', 256);
+ ft_memset (ft_buf, 'A', 0);
+ memset (libc_buf, 'A', 0);
+ _s_check ("n=0", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* return value */
+ ret = ft_memset (ft_buf, 'B', 10);
+ _s_check ("return value", ret == ft_buf);
+
+ /* randomized */
+ srand (time (NULL));
+ for (i = 0; i < 50; i++)
+ {
+ c = rand () % 256;
+ len = rand () % 256;
+ ft_memset (ft_buf, c, len);
+ memset (libc_buf, c, len);
+ snprintf (label, sizeof (label), "random c=%d len=%zu", c, len);
+ _s_check (label, memcmp (ft_buf, libc_buf, len) == 0);
+ }
+}
+
+/* ======================================
+ * bzero
+ * ====================================== */
+
+static void
+_s_test_bzero (void)
+{
+ char ft_buf[256];
+ char libc_buf[256];
+ int i;
+ size_t len;
+ char label[64];
+
+ printf ("-- bzero --\n");
+
+ /* NULL */
+ _s_check_both_crash ("bzero NULL", _s_ft_bzero_null, _s_libc_bzero_null);
+
+ /* zero length */
+ memset (ft_buf, 'X', 256);
+ memset (libc_buf, 'X', 256);
+ ft_bzero (ft_buf, 0);
+ bzero (libc_buf, 0);
+ _s_check ("n=0", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* full clear */
+ memset (ft_buf, 'X', 256);
+ memset (libc_buf, 'X', 256);
+ ft_bzero (ft_buf, 256);
+ bzero (libc_buf, 256);
+ _s_check ("n=256", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* randomized */
+ for (i = 0; i < 50; i++)
+ {
+ len = rand () % 256;
+ memset (ft_buf, 'Z', 256);
+ memset (libc_buf, 'Z', 256);
+ ft_bzero (ft_buf, len);
+ bzero (libc_buf, len);
+ snprintf (label, sizeof (label), "random len=%zu", len);
+ _s_check (label, memcmp (ft_buf, libc_buf, 256) == 0);
+ }
+}
+
+/* ======================================
+ * memcpy
+ * ====================================== */
+
+static void
+_s_test_memcpy (void)
+{
+ char src[256];
+ char ft_dst[256];
+ char libc_dst[256];
+ int i;
+ size_t len;
+ void *ret;
+ char label[64];
+
+ printf ("-- memcpy --\n");
+
+ /* NULL */
+ _s_check_both_crash ("memcpy NULL dst", _s_ft_memcpy_null_dst,
+ _s_libc_memcpy_null_dst);
+ _s_check_both_crash ("memcpy NULL src", _s_ft_memcpy_null_src,
+ _s_libc_memcpy_null_src);
+
+ /* fill source with pattern */
+ for (i = 0; i < 256; i++)
+ src[i] = i;
+
+ /* zero length */
+ memset (ft_dst, 'X', 256);
+ memset (libc_dst, 'X', 256);
+ ft_memcpy (ft_dst, src, 0);
+ memcpy (libc_dst, src, 0);
+ _s_check ("n=0", memcmp (ft_dst, libc_dst, 256) == 0);
+
+ /* return value */
+ ret = ft_memcpy (ft_dst, src, 10);
+ _s_check ("return value", ret == ft_dst);
+
+ /* NULL src and dst with n=0 */
+ ret = ft_memcpy (NULL, NULL, 0);
+ _s_check ("NULL,NULL,0", ret == NULL);
+
+ /* randomized */
+ for (i = 0; i < 50; i++)
+ {
+ len = rand () % 256;
+ memset (ft_dst, 0, 256);
+ memset (libc_dst, 0, 256);
+ ft_memcpy (ft_dst, src, len);
+ memcpy (libc_dst, src, len);
+ snprintf (label, sizeof (label), "random len=%zu", len);
+ _s_check (label, memcmp (ft_dst, libc_dst, 256) == 0);
+ }
+}
+
+/* ======================================
+ * memmove
+ * ====================================== */
+
+static void
+_s_test_memmove (void)
+{
+ char ft_buf[256];
+ char libc_buf[256];
+ int i;
+ size_t len;
+ size_t offset;
+ void *ret;
+ char label[64];
+
+ printf ("-- memmove --\n");
+
+ /* NULL */
+ _s_check_both_crash ("memmove NULL dst", _s_ft_memmove_null_dst,
+ _s_libc_memmove_null_dst);
+ _s_check_both_crash ("memmove NULL src", _s_ft_memmove_null_src,
+ _s_libc_memmove_null_src);
+
+ /* return value */
+ memset (ft_buf, 'A', 256);
+ ret = ft_memmove (ft_buf, ft_buf + 10, 10);
+ _s_check ("return value", ret == ft_buf);
+
+ /* NULL src and dst with n=0 */
+ ret = ft_memmove (NULL, NULL, 0);
+ _s_check ("NULL,NULL,0", ret == NULL);
+
+ /* forward overlap: src before dest */
+ for (i = 0; i < 256; i++)
+ ft_buf[i] = libc_buf[i] = i;
+ ft_memmove (ft_buf + 10, ft_buf, 100);
+ memmove (libc_buf + 10, libc_buf, 100);
+ _s_check ("forward overlap", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* backward overlap: dest before src */
+ for (i = 0; i < 256; i++)
+ ft_buf[i] = libc_buf[i] = i;
+ ft_memmove (ft_buf, ft_buf + 10, 100);
+ memmove (libc_buf, libc_buf + 10, 100);
+ _s_check ("backward overlap", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* non-overlapping */
+ for (i = 0; i < 256; i++)
+ ft_buf[i] = libc_buf[i] = i;
+ ft_memmove (ft_buf + 128, ft_buf, 50);
+ memmove (libc_buf + 128, libc_buf, 50);
+ _s_check ("non-overlapping", memcmp (ft_buf, libc_buf, 256) == 0);
+
+ /* randomized overlapping copies */
+ for (i = 0; i < 50; i++)
+ {
+ for (int j = 0; j < 256; j++)
+ ft_buf[j] = libc_buf[j] = rand () % 256;
+ len = rand () % 128 + 1;
+ offset = rand () % 128;
+ ft_memmove (ft_buf + offset, ft_buf, len);
+ memmove (libc_buf + offset, libc_buf, len);
+ snprintf (label, sizeof (label), "random overlap len=%zu off=%zu", len,
+ offset);
+ _s_check (label, memcmp (ft_buf, libc_buf, 256) == 0);
+ }
+}
+
+int
+main (void)
+{
+ printf ("=== mem functions ===\n");
+ _s_test_memset ();
+ _s_test_bzero ();
+ _s_test_memcpy ();
+ _s_test_memmove ();
+ _s_print_results ();
+ return (_s_fail != 0);
+}