# HG changeset patch # User Mike Becker # Date 1762881317 -3600 # Node ID 814c1c61488ded77c1bc49672be5857a5afe3bb0 # Parent d72725216f37141a450a573cd22073ecb211ab90 add tests for cxListShrink() and cxListReserve() + fixes a bug diff -r d72725216f37 -r 814c1c61488d src/list.c --- a/src/list.c Tue Nov 11 17:02:26 2025 +0100 +++ b/src/list.c Tue Nov 11 18:15:17 2025 +0100 @@ -186,7 +186,11 @@ } static int cx_pl_change_capacity(struct cx_list_s *list, size_t cap) { - return list->climpl->change_capacity(list, cap); + if (list->climpl->change_capacity == NULL) { + return 0; + } else { + return list->climpl->change_capacity(list, cap); + } } static struct cx_iterator_s cx_pl_iterator( diff -r d72725216f37 -r 814c1c61488d tests/test_list.c --- a/tests/test_list.c Tue Nov 11 17:02:26 2025 +0100 +++ b/tests/test_list.c Tue Nov 11 18:15:17 2025 +0100 @@ -2526,6 +2526,30 @@ free(testdata); }) +roll_out_test_combos(reserve_and_shrink, { + // there is no actual observable behavior, + // so we just check that the functions return zero + int *td1 = int_test_data_added_to_list(list, isptrlist, 500); + CX_TEST_ASSERT(0 == cxListReserve(list, 200)); + CX_TEST_ASSERT(0 == cxListReserve(list, 1000)); + int *td2 = int_test_data_added_to_list(list, isptrlist, 500); + int *td3 = int_test_data_added_to_list(list, isptrlist, 500); + CX_TEST_ASSERT(0 == cxListShrink(list)); + size_t i = 0; + for (size_t j = 0 ; j < 500 ; j++, i++) { + CX_TEST_ASSERT(*(int*)cxListAt(list, i) == td1[j]); + } + for (size_t j = 0 ; j < 500 ; j++, i++) { + CX_TEST_ASSERT(*(int*)cxListAt(list, i) == td2[j]); + } + for (size_t j = 0 ; j < 500 ; j++, i++) { + CX_TEST_ASSERT(*(int*)cxListAt(list, i) == td3[j]); + } + free(td1); + free(td2); + free(td3); +}) + static bool test_clone_func_max_enabled = false; static unsigned test_clone_func_max_clones; static void *test_clone_func(void *dest, const void *src, const CxAllocator *al, void *data) { @@ -3226,6 +3250,8 @@ cx_test_register(suite, test_list_parl_simple_destr); cx_test_register(suite, test_list_arl_advanced_destr); cx_test_register(suite, test_list_parl_advanced_destr); + cx_test_register(suite, test_list_arl_reserve_and_shrink); + cx_test_register(suite, test_list_parl_reserve_and_shrink); cx_test_register(suite, test_list_arl_clone_into_arl); cx_test_register(suite, test_list_parl_clone_into_arl); cx_test_register(suite, test_list_arl_clone_into_ll); @@ -3361,6 +3387,8 @@ cx_test_register(suite, test_list_pll_simple_destr); cx_test_register(suite, test_list_ll_advanced_destr); cx_test_register(suite, test_list_pll_advanced_destr); + cx_test_register(suite, test_list_ll_reserve_and_shrink); + cx_test_register(suite, test_list_pll_reserve_and_shrink); cx_test_register(suite, test_list_ll_clone_into_arl); cx_test_register(suite, test_list_pll_clone_into_arl); cx_test_register(suite, test_list_ll_clone_into_ll); @@ -3469,6 +3497,8 @@ cx_test_register(suite, test_list_pkvl_simple_destr); cx_test_register(suite, test_list_kvl_advanced_destr); cx_test_register(suite, test_list_pkvl_advanced_destr); + cx_test_register(suite, test_list_kvl_reserve_and_shrink); + cx_test_register(suite, test_list_pkvl_reserve_and_shrink); // note: kv-lists also support a list clone, but that does not clone the keys cx_test_register(suite, test_list_kvl_clone_into_arl); cx_test_register(suite, test_list_pkvl_clone_into_arl);