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