tests/test_list.c

changeset 1684
89a07d18f86c
parent 1675
36c0fb2b60b2
--- a/tests/test_list.c	Tue Dec 30 22:13:44 2025 +0100
+++ b/tests/test_list.c	Wed Dec 31 12:24:39 2025 +0100
@@ -81,6 +81,115 @@
     cx_array_free(arr);
 }
 
+CX_TEST(test_array_insert) {
+    CX_ARRAY(int, arr);
+    cx_array_init(arr, 5);
+    arr.data[0] = 2;
+    arr.data[1] = 3;
+    arr.data[2] = 5;
+    arr.data[3] = 7;
+    arr.size = 4;
+    int elem = 8, elem2 = 47;
+    int result;
+    CX_TEST_DO {
+        result = cx_array_insert(arr, 3, elem);
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(arr.data[0] == 2);
+        CX_TEST_ASSERT(arr.data[1] == 3);
+        CX_TEST_ASSERT(arr.data[2] == 5);
+        CX_TEST_ASSERT(arr.data[3] == 8);
+        CX_TEST_ASSERT(arr.data[4] == 7);
+        CX_TEST_ASSERT(arr.size == 5);
+        CX_TEST_ASSERT(arr.capacity == 5);
+
+        result = cx_array_insert(arr, 2, elem2);
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(arr.data[0] == 2);
+        CX_TEST_ASSERT(arr.data[1] == 3);
+        CX_TEST_ASSERT(arr.data[2] == 47);
+        CX_TEST_ASSERT(arr.data[3] == 5);
+        CX_TEST_ASSERT(arr.data[4] == 8);
+        CX_TEST_ASSERT(arr.data[5] == 7);
+        CX_TEST_ASSERT(arr.size == 6);
+        CX_TEST_ASSERT(arr.capacity >= 6);
+    }
+    cx_array_free(arr);
+}
+
+CX_TEST(test_array_insert_array) {
+    CX_ARRAY(int, arr);
+    cx_array_init(arr, 5);
+    arr.data[0] = 2;
+    arr.data[1] = 3;
+    arr.data[2] = 5;
+    arr.size = 3;
+    int arr1[2] = {13, 37};
+    int arr2[2] = {47, 11};
+    int arr3[2] = {8, 15};
+    int result;
+    CX_TEST_DO {
+        result = cx_array_insert_array(arr, 1, arr1, 2);
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(arr.size == 5);
+        CX_TEST_ASSERT(arr.capacity == 5);
+        CX_TEST_ASSERT(arr.data[0] == 2);
+        CX_TEST_ASSERT(arr.data[1] == 13);
+        CX_TEST_ASSERT(arr.data[2] == 37);
+        CX_TEST_ASSERT(arr.data[3] == 3);
+        CX_TEST_ASSERT(arr.data[4] == 5);
+
+        result = cx_array_insert_array(arr, 2, arr2, 2);
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(arr.size == 7);
+        CX_TEST_ASSERT(arr.capacity >= 7);
+        CX_TEST_ASSERT(arr.data[0] == 2);
+        CX_TEST_ASSERT(arr.data[1] == 13);
+        CX_TEST_ASSERT(arr.data[2] == 47);
+        CX_TEST_ASSERT(arr.data[3] == 11);
+        CX_TEST_ASSERT(arr.data[4] == 37);
+        CX_TEST_ASSERT(arr.data[5] == 3);
+        CX_TEST_ASSERT(arr.data[6] == 5);
+
+        result = cx_array_add_array(arr, arr3, 2);
+        CX_TEST_ASSERT(result == 0);
+        CX_TEST_ASSERT(arr.size == 9);
+        CX_TEST_ASSERT(arr.capacity >= 9);
+        CX_TEST_ASSERT(arr.data[0] == 2);
+        CX_TEST_ASSERT(arr.data[1] == 13);
+        CX_TEST_ASSERT(arr.data[2] == 47);
+        CX_TEST_ASSERT(arr.data[3] == 11);
+        CX_TEST_ASSERT(arr.data[4] == 37);
+        CX_TEST_ASSERT(arr.data[5] == 3);
+        CX_TEST_ASSERT(arr.data[6] == 5);
+        CX_TEST_ASSERT(arr.data[7] == 8);
+        CX_TEST_ASSERT(arr.data[8] == 15);
+    }
+    cx_array_free(arr);
+}
+
+CX_TEST(test_array_insert_array_overflow) {
+    CX_ARRAY(int, arr);
+    cx_array_init(arr, 5);
+    int dummy[1];
+    int result;
+    CX_TEST_DO {
+        // first test: overflow only the memory (but not the capacity)
+        arr.size = arr.capacity = SIZE_MAX / sizeof(int) - 5;
+        errno = 0;
+        result = cx_array_add_array(arr, dummy, 6);
+        CX_TEST_ASSERT(result != 0);
+        CX_TEST_ASSERT(errno == EOVERFLOW);
+
+        // first test: overflow the capacity
+        arr.size = arr.capacity = SIZE_MAX - 5;
+        errno = 0;
+        result = cx_array_add_array(arr, dummy, 6);
+        CX_TEST_ASSERT(result != 0);
+        CX_TEST_ASSERT(errno == EOVERFLOW);
+    }
+    cx_array_free(arr);
+}
+
 CX_TEST(test_array_add_capacity_grow_strategy) {
     /*
      * if (cap < 128) alignment = 16;
@@ -3723,6 +3832,9 @@
 
     cx_test_register(suite, test_array_add);
     cx_test_register(suite, test_array_add_capacity_grow_strategy);
+    cx_test_register(suite, test_array_insert);
+    cx_test_register(suite, test_array_insert_array);
+    cx_test_register(suite, test_array_insert_array_overflow);
     cx_test_register(suite, test_array_remove);
     cx_test_register(suite, test_array_remove_fast);
     cx_test_register(suite, test_array_remove_array);

mercurial