704 cx_testing_allocator_init(&talloc); |
704 cx_testing_allocator_init(&talloc); |
705 CxAllocator *alloc = &talloc.base; |
705 CxAllocator *alloc = &talloc.base; |
706 CX_TEST_DO { |
706 CX_TEST_DO { |
707 CxList *list = cxLinkedListCreate(alloc, cx_cmp_int, sizeof(int)); |
707 CxList *list = cxLinkedListCreate(alloc, cx_cmp_int, sizeof(int)); |
708 CX_TEST_ASSERT(list != NULL); |
708 CX_TEST_ASSERT(list != NULL); |
709 CX_TEST_ASSERT(list->base.elem_size == sizeof(int)); |
709 CX_TEST_ASSERT(list->collection.elem_size == sizeof(int)); |
710 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
710 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
711 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
711 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
712 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
712 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
713 CX_TEST_ASSERT(cxListSize(list) == 0); |
713 CX_TEST_ASSERT(cxListSize(list) == 0); |
714 CX_TEST_ASSERT(list->base.allocator == alloc); |
714 CX_TEST_ASSERT(list->collection.allocator == alloc); |
715 CX_TEST_ASSERT(list->base.cmpfunc == cx_cmp_int); |
715 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
716 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
716 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
717 cxListDestroy(list); |
717 cxListDestroy(list); |
718 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
718 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
719 } |
719 } |
720 cx_testing_allocator_destroy(&talloc); |
720 cx_testing_allocator_destroy(&talloc); |
722 |
722 |
723 CX_TEST(test_list_ll_create_simple) { |
723 CX_TEST(test_list_ll_create_simple) { |
724 CxList *list = cxLinkedListCreateSimple(sizeof(int)); |
724 CxList *list = cxLinkedListCreateSimple(sizeof(int)); |
725 CX_TEST_DO { |
725 CX_TEST_DO { |
726 CX_TEST_ASSERT(list != NULL); |
726 CX_TEST_ASSERT(list != NULL); |
727 CX_TEST_ASSERT(list->base.elem_size == sizeof(int)); |
727 CX_TEST_ASSERT(list->collection.elem_size == sizeof(int)); |
728 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
728 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
729 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
729 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
730 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
730 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
731 CX_TEST_ASSERT(cxListSize(list) == 0); |
731 CX_TEST_ASSERT(cxListSize(list) == 0); |
732 CX_TEST_ASSERT(list->base.allocator == cxDefaultAllocator); |
732 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
733 CX_TEST_ASSERT(list->base.cmpfunc == NULL); |
733 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
734 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
734 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
735 } |
735 } |
736 cxListDestroy(list); |
736 cxListDestroy(list); |
737 } |
737 } |
738 |
738 |
739 CX_TEST(test_list_ll_store_pointers) { |
739 CX_TEST(test_list_ll_store_pointers) { |
740 CxList *list = cxLinkedListCreateSimple(47); |
740 CxList *list = cxLinkedListCreateSimple(47); |
741 CX_TEST_DO { |
741 CX_TEST_DO { |
742 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
742 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
743 cxListStorePointers(list); |
743 cxListStorePointers(list); |
744 CX_TEST_ASSERT(list->base.elem_size == sizeof(void *)); |
744 CX_TEST_ASSERT(list->collection.elem_size == sizeof(void *)); |
745 CX_TEST_ASSERT(list->cl != NULL); |
745 CX_TEST_ASSERT(list->cl != NULL); |
746 CX_TEST_ASSERT(list->climpl != NULL); |
746 CX_TEST_ASSERT(list->climpl != NULL); |
747 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
747 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
748 cxListStoreObjects(list); |
748 cxListStoreObjects(list); |
749 CX_TEST_ASSERT(list->cl != NULL); |
749 CX_TEST_ASSERT(list->cl != NULL); |
755 |
755 |
756 CX_TEST(test_list_ll_create_simple_for_pointers) { |
756 CX_TEST(test_list_ll_create_simple_for_pointers) { |
757 CxList *list = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
757 CxList *list = cxLinkedListCreateSimple(CX_STORE_POINTERS); |
758 CX_TEST_DO { |
758 CX_TEST_DO { |
759 CX_TEST_ASSERT(list != NULL); |
759 CX_TEST_ASSERT(list != NULL); |
760 CX_TEST_ASSERT(list->base.elem_size == sizeof(void*)); |
760 CX_TEST_ASSERT(list->collection.elem_size == sizeof(void*)); |
761 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
761 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
762 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
762 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
763 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
763 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
764 CX_TEST_ASSERT(cxListSize(list) == 0); |
764 CX_TEST_ASSERT(cxListSize(list) == 0); |
765 CX_TEST_ASSERT(list->base.allocator == cxDefaultAllocator); |
765 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
766 CX_TEST_ASSERT(list->base.cmpfunc == cx_cmp_ptr); |
766 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
767 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
767 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
768 } |
768 } |
769 cxListDestroy(list); |
769 cxListDestroy(list); |
770 } |
770 } |
771 |
771 |
774 cx_testing_allocator_init(&talloc); |
774 cx_testing_allocator_init(&talloc); |
775 CxAllocator *alloc = &talloc.base; |
775 CxAllocator *alloc = &talloc.base; |
776 CX_TEST_DO { |
776 CX_TEST_DO { |
777 CxList *list = cxArrayListCreate(alloc, cx_cmp_int, sizeof(int), 8); |
777 CxList *list = cxArrayListCreate(alloc, cx_cmp_int, sizeof(int), 8); |
778 CX_TEST_ASSERT(list != NULL); |
778 CX_TEST_ASSERT(list != NULL); |
779 CX_TEST_ASSERT(list->base.elem_size == sizeof(int)); |
779 CX_TEST_ASSERT(list->collection.elem_size == sizeof(int)); |
780 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
780 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
781 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
781 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
782 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
782 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
783 CX_TEST_ASSERT(cxListSize(list) == 0); |
783 CX_TEST_ASSERT(cxListSize(list) == 0); |
784 CX_TEST_ASSERT(list->base.allocator == alloc); |
784 CX_TEST_ASSERT(list->collection.allocator == alloc); |
785 CX_TEST_ASSERT(list->base.cmpfunc == cx_cmp_int); |
785 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_int); |
786 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
786 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
787 cxListDestroy(list); |
787 cxListDestroy(list); |
788 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
788 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
789 } |
789 } |
790 cx_testing_allocator_destroy(&talloc); |
790 cx_testing_allocator_destroy(&talloc); |
792 |
792 |
793 CX_TEST(test_list_arl_create_simple) { |
793 CX_TEST(test_list_arl_create_simple) { |
794 CxList *list = cxArrayListCreateSimple(sizeof(int), 8); |
794 CxList *list = cxArrayListCreateSimple(sizeof(int), 8); |
795 CX_TEST_DO { |
795 CX_TEST_DO { |
796 CX_TEST_ASSERT(list != NULL); |
796 CX_TEST_ASSERT(list != NULL); |
797 CX_TEST_ASSERT(list->base.elem_size == sizeof(int)); |
797 CX_TEST_ASSERT(list->collection.elem_size == sizeof(int)); |
798 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
798 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
799 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
799 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
800 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
800 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
801 CX_TEST_ASSERT(cxListSize(list) == 0); |
801 CX_TEST_ASSERT(cxListSize(list) == 0); |
802 CX_TEST_ASSERT(list->base.allocator == cxDefaultAllocator); |
802 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
803 CX_TEST_ASSERT(list->base.cmpfunc == NULL); |
803 CX_TEST_ASSERT(list->collection.cmpfunc == NULL); |
804 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
804 CX_TEST_ASSERT(!cxListIsStoringPointers(list)); |
805 } |
805 } |
806 cxListDestroy(list); |
806 cxListDestroy(list); |
807 } |
807 } |
808 |
808 |
809 CX_TEST(test_list_arl_create_simple_for_pointers) { |
809 CX_TEST(test_list_arl_create_simple_for_pointers) { |
810 CxList *list = cxArrayListCreateSimple(CX_STORE_POINTERS, 8); |
810 CxList *list = cxArrayListCreateSimple(CX_STORE_POINTERS, 8); |
811 CX_TEST_DO { |
811 CX_TEST_DO { |
812 CX_TEST_ASSERT(list != NULL); |
812 CX_TEST_ASSERT(list != NULL); |
813 CX_TEST_ASSERT(list->base.elem_size == sizeof(void*)); |
813 CX_TEST_ASSERT(list->collection.elem_size == sizeof(void*)); |
814 CX_TEST_ASSERT(list->base.simple_destructor == NULL); |
814 CX_TEST_ASSERT(list->collection.simple_destructor == NULL); |
815 CX_TEST_ASSERT(list->base.advanced_destructor == NULL); |
815 CX_TEST_ASSERT(list->collection.advanced_destructor == NULL); |
816 CX_TEST_ASSERT(list->base.destructor_data == NULL); |
816 CX_TEST_ASSERT(list->collection.destructor_data == NULL); |
817 CX_TEST_ASSERT(cxListSize(list) == 0); |
817 CX_TEST_ASSERT(cxListSize(list) == 0); |
818 CX_TEST_ASSERT(list->base.allocator == cxDefaultAllocator); |
818 CX_TEST_ASSERT(list->collection.allocator == cxDefaultAllocator); |
819 CX_TEST_ASSERT(list->base.cmpfunc == cx_cmp_ptr); |
819 CX_TEST_ASSERT(list->collection.cmpfunc == cx_cmp_ptr); |
820 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
820 CX_TEST_ASSERT(cxListIsStoringPointers(list)); |
821 } |
821 } |
822 cxListDestroy(list); |
822 cxListDestroy(list); |
823 } |
823 } |
824 |
824 |
846 |
846 |
847 CX_TEST(test_list_pll_destroy_simple_destr) { |
847 CX_TEST(test_list_pll_destroy_simple_destr) { |
848 CX_TEST_DO { |
848 CX_TEST_DO { |
849 int item = 0; |
849 int item = 0; |
850 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
850 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
851 list->base.simple_destructor = test_fake_simple_int_destr; |
851 list->collection.simple_destructor = test_fake_simple_int_destr; |
852 cxListAdd(list, &item); |
852 cxListAdd(list, &item); |
853 cxListDestroy(list); |
853 cxListDestroy(list); |
854 CX_TEST_ASSERT(item == 42); |
854 CX_TEST_ASSERT(item == 42); |
855 } |
855 } |
856 } |
856 } |
860 cx_testing_allocator_init(&talloc); |
860 cx_testing_allocator_init(&talloc); |
861 CxAllocator *alloc = &talloc.base; |
861 CxAllocator *alloc = &talloc.base; |
862 CX_TEST_DO { |
862 CX_TEST_DO { |
863 void *item = cxMalloc(alloc, sizeof(int)); |
863 void *item = cxMalloc(alloc, sizeof(int)); |
864 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
864 CxList *list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS); |
865 list->base.destructor_data = alloc; |
865 list->collection.destructor_data = alloc; |
866 list->base.advanced_destructor = (cx_destructor_func2) cxFree; |
866 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
867 cxListAdd(list, item); |
867 cxListAdd(list, item); |
868 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
868 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
869 cxListDestroy(list); |
869 cxListDestroy(list); |
870 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
870 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
871 } |
871 } |
892 |
892 |
893 CX_TEST(test_list_parl_destroy_simple_destr) { |
893 CX_TEST(test_list_parl_destroy_simple_destr) { |
894 CX_TEST_DO { |
894 CX_TEST_DO { |
895 int item = 0; |
895 int item = 0; |
896 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
896 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
897 list->base.simple_destructor = test_fake_simple_int_destr; |
897 list->collection.simple_destructor = test_fake_simple_int_destr; |
898 cxListAdd(list, &item); |
898 cxListAdd(list, &item); |
899 cxListDestroy(list); |
899 cxListDestroy(list); |
900 CX_TEST_ASSERT(item == 42); |
900 CX_TEST_ASSERT(item == 42); |
901 } |
901 } |
902 } |
902 } |
906 cx_testing_allocator_init(&talloc); |
906 cx_testing_allocator_init(&talloc); |
907 CxAllocator *alloc = &talloc.base; |
907 CxAllocator *alloc = &talloc.base; |
908 CX_TEST_DO { |
908 CX_TEST_DO { |
909 void *item = cxMalloc(alloc, sizeof(int)); |
909 void *item = cxMalloc(alloc, sizeof(int)); |
910 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
910 CxList *list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4); |
911 list->base.destructor_data = alloc; |
911 list->collection.destructor_data = alloc; |
912 list->base.advanced_destructor = (cx_destructor_func2) cxFree; |
912 list->collection.advanced_destructor = (cx_destructor_func2) cxFree; |
913 cxListAdd(list, item); |
913 cxListAdd(list, item); |
914 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
914 CX_TEST_ASSERT(!cx_testing_allocator_verify(&talloc)); |
915 cxListDestroy(list); |
915 cxListDestroy(list); |
916 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
916 CX_TEST_ASSERT(cx_testing_allocator_verify(&talloc)); |
917 } |
917 } |
1205 roll_out_test_combos(iterator, { |
1205 roll_out_test_combos(iterator, { |
1206 const size_t len = 50; |
1206 const size_t len = 50; |
1207 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1207 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1208 |
1208 |
1209 CxIterator iter = cxListIterator(list); |
1209 CxIterator iter = cxListIterator(list); |
1210 CX_TEST_ASSERT(iter.elem_size == list->base.elem_size); |
1210 CX_TEST_ASSERT(iter.elem_size == list->collection.elem_size); |
1211 CX_TEST_ASSERT(iter.elem_count == list->base.size); |
1211 CX_TEST_ASSERT(iter.elem_count == list->collection.size); |
1212 size_t i = 0; |
1212 size_t i = 0; |
1213 cx_foreach(int*, x, iter) { |
1213 cx_foreach(int*, x, iter) { |
1214 CX_TEST_ASSERT(i == iter.index); |
1214 CX_TEST_ASSERT(i == iter.index); |
1215 CX_TEST_ASSERT(*x == testdata[iter.index]); |
1215 CX_TEST_ASSERT(*x == testdata[iter.index]); |
1216 i++; |
1216 i++; |
1223 i--; |
1223 i--; |
1224 } |
1224 } |
1225 CX_TEST_ASSERT(i == 0); |
1225 CX_TEST_ASSERT(i == 0); |
1226 i = len / 2; |
1226 i = len / 2; |
1227 CxIterator mut_iter = cxListMutIteratorAt(list, i); |
1227 CxIterator mut_iter = cxListMutIteratorAt(list, i); |
1228 CX_TEST_ASSERT(mut_iter.elem_size == list->base.elem_size); |
1228 CX_TEST_ASSERT(mut_iter.elem_size == list->collection.elem_size); |
1229 CX_TEST_ASSERT(mut_iter.elem_count == list->base.size); |
1229 CX_TEST_ASSERT(mut_iter.elem_count == list->collection.size); |
1230 size_t j = 0; |
1230 size_t j = 0; |
1231 cx_foreach(int*, x, mut_iter) { |
1231 cx_foreach(int*, x, mut_iter) { |
1232 CX_TEST_ASSERT(mut_iter.index == len / 2 + j / 2); |
1232 CX_TEST_ASSERT(mut_iter.index == len / 2 + j / 2); |
1233 CX_TEST_ASSERT(*x == testdata[i]); |
1233 CX_TEST_ASSERT(*x == testdata[i]); |
1234 if (i % 2 == 1) cxIteratorFlagRemoval(mut_iter); |
1234 if (i % 2 == 1) cxIteratorFlagRemoval(mut_iter); |
1393 } |
1393 } |
1394 |
1394 |
1395 roll_out_test_combos(simple_destr, { |
1395 roll_out_test_combos(simple_destr, { |
1396 const size_t len = 60; |
1396 const size_t len = 60; |
1397 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1397 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1398 list->base.simple_destructor = simple_destr_test_fun; |
1398 list->collection.simple_destructor = simple_destr_test_fun; |
1399 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
1399 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
1400 free(testdata); |
1400 free(testdata); |
1401 }) |
1401 }) |
1402 |
1402 |
1403 roll_out_test_combos(advanced_destr, { |
1403 roll_out_test_combos(advanced_destr, { |
1404 const size_t len = 75; |
1404 const size_t len = 75; |
1405 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1405 int *testdata = int_test_data_added_to_list(list, isptrlist, len); |
1406 list->base.advanced_destructor = advanced_destr_test_fun; |
1406 list->collection.advanced_destructor = advanced_destr_test_fun; |
1407 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
1407 CX_TEST_CALL_SUBROUTINE(test_list_verify_destructor, list, testdata, len); |
1408 free(testdata); |
1408 free(testdata); |
1409 }) |
1409 }) |
1410 |
1410 |
1411 CxTestSuite *cx_test_suite_array_list(void) { |
1411 CxTestSuite *cx_test_suite_array_list(void) { |