tests/test_list.c

changeset 1436
c331add0d9f8
parent 1435
48ebf22b698e
equal deleted inserted replaced
1435:48ebf22b698e 1436:c331add0d9f8
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) {

mercurial