diff -r 33f556a7eca6 -r f027a95d93f2 tests/test_list.c --- a/tests/test_list.c Mon Nov 17 22:28:04 2025 +0100 +++ b/tests/test_list.c Tue Nov 18 17:36:41 2025 +0100 @@ -144,20 +144,112 @@ } CX_TEST(test_array_reserve) { + { + // default size + CX_ARRAY_DECLARE(int, arr); + cx_array_initialize(arr, 16); + int result; + CX_TEST_DO { + result = cx_array_reserve( + (void **) &(arr), + &(arr_size), + &(arr_capacity), + 0, // default width + sizeof(int), + 30, + cx_array_default_reallocator + ); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(arr_size == 0); + CX_TEST_ASSERT(arr_capacity == 30); + } + cxFreeDefault(arr); + } + { + // 16-bit size + CX_ARRAY_DECLARE_SIZED(char, arr, uint16_t); + cx_array_initialize(arr, 16); + arr_size = 5; + int result; + CX_TEST_DO { + errno = 0; + result = cx_array_simple_reserve(arr, 3); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(errno == 0); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 16); + + result = cx_array_simple_reserve(arr, 20); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(errno == 0); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 25); + + result = cx_array_simple_reserve(arr, 2000); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(errno == 0); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 2005); + + // this does not fit into an array with a 16-bit size + result = cx_array_simple_reserve(arr, 70000); + CX_TEST_ASSERT(result == 1); + CX_TEST_ASSERT(errno == EOVERFLOW); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 2005); + } + cxFreeDefault(arr); + } + { + // 8-bit size + CX_ARRAY_DECLARE_SIZED(char, arr, uint8_t); + cx_array_initialize(arr, 16); + arr_size = 5; + int result; + CX_TEST_DO { + errno = 0; + result = cx_array_simple_reserve(arr, 3); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(errno == 0); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 16); + + result = cx_array_simple_reserve(arr, 20); + CX_TEST_ASSERT(result == 0); + CX_TEST_ASSERT(errno == 0); + CX_TEST_ASSERT(arr_size == 5); + CX_TEST_ASSERT(arr_capacity == 25); + + // this does not fit into an array with an 8-bit size + arr_size = 10; + result = cx_array_simple_reserve(arr, 250); + CX_TEST_ASSERT(result == 1); + CX_TEST_ASSERT(errno == EOVERFLOW); + CX_TEST_ASSERT(arr_size == 10); + CX_TEST_ASSERT(arr_capacity == 25); + } + cxFreeDefault(arr); + } +} + +CX_TEST(test_array_reserve_unsupported_width) { CX_ARRAY_DECLARE_SIZED(int, arr, uint16_t); cx_array_initialize(arr, 16); - arr_size = 5; int result; CX_TEST_DO { - result = cx_array_simple_reserve(arr, 3); - CX_TEST_ASSERT(result == 0); - CX_TEST_ASSERT(arr_size == 5); + result = cx_array_reserve( + (void **) &(arr), + &(arr_size), + &(arr_capacity), + 12, // unsupported width + sizeof(int), + 30, + cx_array_default_reallocator + ); + CX_TEST_ASSERT(result != 0); + CX_TEST_ASSERT(errno == EINVAL); + CX_TEST_ASSERT(arr_size == 0); CX_TEST_ASSERT(arr_capacity == 16); - - result = cx_array_simple_reserve(arr, 20); - CX_TEST_ASSERT(result == 0); - CX_TEST_ASSERT(arr_size == 5); - CX_TEST_ASSERT(arr_capacity == 25); } cxFreeDefault(arr); } @@ -3196,6 +3288,7 @@ cx_test_register(suite, test_array_add8); cx_test_register(suite, test_array_copy_unsupported_width); cx_test_register(suite, test_array_reserve); + cx_test_register(suite, test_array_reserve_unsupported_width); cx_test_register(suite, test_array_insert_sorted); cx_test_register(suite, test_array_insert_unique); cx_test_register(suite, test_array_binary_search);