2522 const size_t len = 75; |
2522 const size_t len = 75; |
2523 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
2523 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
2524 cxDefineAdvancedDestructor(list, advanced_destr_test_fun, NULL); |
2524 cxDefineAdvancedDestructor(list, advanced_destr_test_fun, NULL); |
2525 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
2525 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
2526 free(testdata); |
2526 free(testdata); |
|
2527 }) |
|
2528 |
|
2529 static void *test_clone_func(void *dest, const void *src, const CxAllocator *al, void *data) { |
|
2530 if (dest == NULL) { |
|
2531 dest = cxMalloc(al, sizeof(int)); |
|
2532 } |
|
2533 |
|
2534 *((int*) dest) = *(int*) src + *(int*) data; |
|
2535 (*(int*) data)++; |
|
2536 |
|
2537 // TODO: create a separate test with another clone func which simulates a failure after a few allocations |
|
2538 return dest; |
|
2539 } |
|
2540 |
|
2541 static CX_TEST_SUBROUTINE(verify_clone, CxList *target, CxList *source, bool target_isptrlist) { |
|
2542 // testing allocator for the target elements if target_isptrlist is true |
|
2543 CxTestingAllocator talloc; |
|
2544 cx_testing_allocator_init(&talloc); |
|
2545 CxAllocator *testing_alloc = &talloc.base; |
|
2546 |
|
2547 // register a destructor for the target list if it is storing pointers |
|
2548 if (target_isptrlist) { |
|
2549 cxDefineAdvancedDestructor(target, cxFree, testing_alloc); |
|
2550 } |
|
2551 |
|
2552 // fill the source list |
|
2553 int source_data[8] = array_init(1, 2, 3, 4, 5, 6, 7, 8); |
|
2554 for (unsigned i = 0 ; i < 8 ; i++) { |
|
2555 cxListAdd(source, &source_data[i]); |
|
2556 } |
|
2557 |
|
2558 // add some initial data to the target |
|
2559 int initial_data[4] = array_init(1, 2, 3, 4); |
|
2560 for (unsigned i = 0; i < 4; i++) { |
|
2561 if (target_isptrlist) { |
|
2562 int *x = cxMalloc(testing_alloc, sizeof(int)); |
|
2563 *x = initial_data[i]; |
|
2564 cxListAdd(target, x); |
|
2565 } else { |
|
2566 cxListAdd(target, &initial_data[i]); |
|
2567 } |
|
2568 } |
|
2569 |
|
2570 // perform the test |
|
2571 int expected_data[12] = array_init(1, 2, 3, 4, 1, 3, 5, 7, 9, 11, 13, 15); |
|
2572 int c = 0; |
|
2573 size_t cloned = cxListClone(target, source, test_clone_func, testing_alloc, &c); |
|
2574 CX_TEST_ASSERT(cloned == 8); |
|
2575 CX_TEST_ASSERT(c == 8); |
|
2576 CX_TEST_ASSERT(cxListSize(target) == 12); |
|
2577 CX_TEST_ASSERT(cxListSize(source) == 8); |
|
2578 for (unsigned i = 0 ; i < 12 ; i++) { |
|
2579 CX_TEST_ASSERT(*(int*)cxListAt(target, i) == expected_data[i]); |
|
2580 } |
|
2581 for (unsigned i = 0 ; i < 8 ; i++) { |
|
2582 CX_TEST_ASSERT(*(int*)cxListAt(source, i) == source_data[i]); |
|
2583 } |
|
2584 cxListFree(target); |
|
2585 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
|
2586 cx_testing_allocator_destroy(&talloc); |
|
2587 } |
|
2588 |
|
2589 roll_out_test_combos(clone_into_arl, { |
|
2590 CxList *target = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int), 8); |
|
2591 CX_TEST_CALL_SUBROUTINE(verify_clone, target, list, false); |
|
2592 }) |
|
2593 |
|
2594 roll_out_test_combos(clone_into_ll, { |
|
2595 CxList *target = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, sizeof(int)); |
|
2596 CX_TEST_CALL_SUBROUTINE(verify_clone, target, list, false); |
|
2597 }) |
|
2598 |
|
2599 roll_out_test_combos(clone_into_parl, { |
|
2600 CxList *target = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 8); |
|
2601 CX_TEST_CALL_SUBROUTINE(verify_clone, target, list, true); |
|
2602 }) |
|
2603 |
|
2604 roll_out_test_combos(clone_into_pll, { |
|
2605 CxList *target = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
|
2606 CX_TEST_CALL_SUBROUTINE(verify_clone, target, list, true); |
2527 }) |
2607 }) |
2528 |
2608 |
2529 CX_TEST(test_list_pointer_list_supports_null) { |
2609 CX_TEST(test_list_pointer_list_supports_null) { |
2530 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
2610 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
2531 int x = 47; |
2611 int x = 47; |
2696 cx_test_register(suite, test_list_parl_compare_parl); |
2776 cx_test_register(suite, test_list_parl_compare_parl); |
2697 cx_test_register(suite, test_list_arl_simple_destr); |
2777 cx_test_register(suite, test_list_arl_simple_destr); |
2698 cx_test_register(suite, test_list_parl_simple_destr); |
2778 cx_test_register(suite, test_list_parl_simple_destr); |
2699 cx_test_register(suite, test_list_arl_advanced_destr); |
2779 cx_test_register(suite, test_list_arl_advanced_destr); |
2700 cx_test_register(suite, test_list_parl_advanced_destr); |
2780 cx_test_register(suite, test_list_parl_advanced_destr); |
|
2781 cx_test_register(suite, test_list_arl_clone_into_arl); |
|
2782 cx_test_register(suite, test_list_parl_clone_into_arl); |
|
2783 cx_test_register(suite, test_list_arl_clone_into_ll); |
|
2784 cx_test_register(suite, test_list_parl_clone_into_ll); |
|
2785 cx_test_register(suite, test_list_arl_clone_into_parl); |
|
2786 cx_test_register(suite, test_list_parl_clone_into_parl); |
|
2787 cx_test_register(suite, test_list_arl_clone_into_pll); |
|
2788 cx_test_register(suite, test_list_parl_clone_into_pll); |
2701 |
2789 |
2702 return suite; |
2790 return suite; |
2703 } |
2791 } |
2704 |
2792 |
2705 CxTestSuite *cx_test_suite_array_list_defaulted_funcs(void) { |
2793 CxTestSuite *cx_test_suite_array_list_defaulted_funcs(void) { |
2815 cx_test_register(suite, test_list_pll_compare_parl); |
2903 cx_test_register(suite, test_list_pll_compare_parl); |
2816 cx_test_register(suite, test_list_ll_simple_destr); |
2904 cx_test_register(suite, test_list_ll_simple_destr); |
2817 cx_test_register(suite, test_list_pll_simple_destr); |
2905 cx_test_register(suite, test_list_pll_simple_destr); |
2818 cx_test_register(suite, test_list_ll_advanced_destr); |
2906 cx_test_register(suite, test_list_ll_advanced_destr); |
2819 cx_test_register(suite, test_list_pll_advanced_destr); |
2907 cx_test_register(suite, test_list_pll_advanced_destr); |
|
2908 cx_test_register(suite, test_list_ll_clone_into_arl); |
|
2909 cx_test_register(suite, test_list_pll_clone_into_arl); |
|
2910 cx_test_register(suite, test_list_ll_clone_into_ll); |
|
2911 cx_test_register(suite, test_list_pll_clone_into_ll); |
|
2912 cx_test_register(suite, test_list_ll_clone_into_parl); |
|
2913 cx_test_register(suite, test_list_pll_clone_into_parl); |
|
2914 cx_test_register(suite, test_list_ll_clone_into_pll); |
|
2915 cx_test_register(suite, test_list_pll_clone_into_pll); |
2820 |
2916 |
2821 return suite; |
2917 return suite; |
2822 } |
2918 } |
2823 |
2919 |
2824 CxTestSuite *cx_test_suite_linked_list_defaulted_funcs(void) { |
2920 CxTestSuite *cx_test_suite_linked_list_defaulted_funcs(void) { |
2907 cx_test_register(suite, test_list_pkvl_compare_parl); |
3003 cx_test_register(suite, test_list_pkvl_compare_parl); |
2908 cx_test_register(suite, test_list_kvl_simple_destr); |
3004 cx_test_register(suite, test_list_kvl_simple_destr); |
2909 cx_test_register(suite, test_list_pkvl_simple_destr); |
3005 cx_test_register(suite, test_list_pkvl_simple_destr); |
2910 cx_test_register(suite, test_list_kvl_advanced_destr); |
3006 cx_test_register(suite, test_list_kvl_advanced_destr); |
2911 cx_test_register(suite, test_list_pkvl_advanced_destr); |
3007 cx_test_register(suite, test_list_pkvl_advanced_destr); |
|
3008 // note: kv-lists also support a list clone, but that does not clone the keys |
|
3009 cx_test_register(suite, test_list_kvl_clone_into_arl); |
|
3010 cx_test_register(suite, test_list_pkvl_clone_into_arl); |
|
3011 cx_test_register(suite, test_list_kvl_clone_into_ll); |
|
3012 cx_test_register(suite, test_list_pkvl_clone_into_ll); |
|
3013 cx_test_register(suite, test_list_kvl_clone_into_parl); |
|
3014 cx_test_register(suite, test_list_pkvl_clone_into_parl); |
|
3015 cx_test_register(suite, test_list_kvl_clone_into_pll); |
|
3016 cx_test_register(suite, test_list_pkvl_clone_into_pll); |
2912 |
3017 |
2913 return suite; |
3018 return suite; |
2914 } |
3019 } |
2915 |
3020 |
2916 CxTestSuite *cx_test_suite_empty_list(void) { |
3021 CxTestSuite *cx_test_suite_empty_list(void) { |