90 } |
90 } |
91 return node_test_data{begin}; |
91 return node_test_data{begin}; |
92 } |
92 } |
93 |
93 |
94 template<typename InputIter> |
94 template<typename InputIter> |
95 static node_test_data create_nodes_test_data(InputIter begin, InputIter end) { |
95 static node_test_data create_nodes_test_data( |
|
96 InputIter begin, |
|
97 InputIter end |
|
98 ) { |
96 if (begin == end) return node_test_data{nullptr}; |
99 if (begin == end) return node_test_data{nullptr}; |
97 node *first = new node; |
100 node *first = new node; |
98 first->data = *begin; |
101 first->data = *begin; |
99 node *prev = first; |
102 node *prev = first; |
100 begin++; |
103 begin++; |
590 cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]); |
593 cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]); |
591 return list; |
594 return list; |
592 } |
595 } |
593 |
596 |
594 void verifyCreate(CxList *list) const { |
597 void verifyCreate(CxList *list) const { |
|
598 EXPECT_EQ(list->content_destructor_type, CX_DESTRUCTOR_NONE); |
595 EXPECT_EQ(list->size, 0); |
599 EXPECT_EQ(list->size, 0); |
596 EXPECT_EQ(list->capacity, (size_t) -1); |
600 EXPECT_EQ(list->capacity, (size_t) -1); |
597 EXPECT_EQ(list->allocator, &testingAllocator); |
601 EXPECT_EQ(list->allocator, &testingAllocator); |
598 EXPECT_EQ(list->cmpfunc, cmp_int); |
602 EXPECT_EQ(list->cmpfunc, cmp_int); |
599 } |
603 } |
600 |
604 |
601 void verifyAdd(CxList *list, bool write_through) { |
605 void verifyAdd( |
|
606 CxList *list, |
|
607 bool write_through |
|
608 ) { |
602 auto len = testdata_len; |
609 auto len = testdata_len; |
603 cx_for_n (i, len) EXPECT_EQ(cxListAdd(list, &testdata.data[i]), 0); |
610 cx_for_n (i, len) EXPECT_EQ(cxListAdd(list, &testdata.data[i]), 0); |
604 EXPECT_EQ(list->size, len); |
611 EXPECT_EQ(list->size, len); |
605 EXPECT_GE(list->capacity, list->size); |
612 EXPECT_GE(list->capacity, list->size); |
606 cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]); |
613 cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]); |
739 cx_for_n(i, testdata_len) { |
746 cx_for_n(i, testdata_len) { |
740 ASSERT_EQ(*(int *) cxListAt(list, i), testdata.data[testdata_len - 1 - i]); |
747 ASSERT_EQ(*(int *) cxListAt(list, i), testdata.data[testdata_len - 1 - i]); |
741 } |
748 } |
742 } |
749 } |
743 |
750 |
744 static void verifyCompare(CxList *left, CxList *right) { |
751 static void verifyCompare( |
|
752 CxList *left, |
|
753 CxList *right |
|
754 ) { |
745 EXPECT_EQ(cxListCompare(left, right), 0); |
755 EXPECT_EQ(cxListCompare(left, right), 0); |
746 int x = 42; |
756 int x = 42; |
747 cxListAdd(left, &x); |
757 cxListAdd(left, &x); |
748 ASSERT_GT(left->size, right->size); |
758 ASSERT_GT(left->size, right->size); |
749 EXPECT_GT(cxListCompare(left, right), 0); |
759 EXPECT_GT(cxListCompare(left, right), 0); |
755 cxListInsert(left, 15, &a); |
765 cxListInsert(left, 15, &a); |
756 cxListInsert(right, 15, &b); |
766 cxListInsert(right, 15, &b); |
757 ASSERT_EQ(left->size, right->size); |
767 ASSERT_EQ(left->size, right->size); |
758 EXPECT_LT(cxListCompare(left, right), 0); |
768 EXPECT_LT(cxListCompare(left, right), 0); |
759 EXPECT_GT(cxListCompare(right, left), 0); |
769 EXPECT_GT(cxListCompare(right, left), 0); |
760 *(int*)cxListAt(left, 15) = 10; |
770 *(int *) cxListAt(left, 15) = 10; |
761 EXPECT_EQ(cxListCompare(left, right), 0); |
771 EXPECT_EQ(cxListCompare(left, right), 0); |
762 } |
772 } |
763 }; |
773 }; |
764 |
774 |
765 class LinkedList : public HighLevelTest { |
775 class LinkedList : public HighLevelTest { |
877 auto left = pointerLinkedListFromTestData(); |
887 auto left = pointerLinkedListFromTestData(); |
878 auto right = pointerLinkedListFromTestData(); |
888 auto right = pointerLinkedListFromTestData(); |
879 verifyCompare(left, right); |
889 verifyCompare(left, right); |
880 } |
890 } |
881 |
891 |
|
892 TEST_F(PointerLinkedList, NoDestructor) { |
|
893 void *item = cxMalloc(&testingAllocator, sizeof(int)); |
|
894 auto list = cxPointerLinkedListCreate(cxDefaultAllocator, cmp_int); |
|
895 cxListAdd(list, item); |
|
896 ASSERT_FALSE(testingAllocator.verify()); |
|
897 cxListDestroy(list); |
|
898 EXPECT_FALSE(testingAllocator.verify()); |
|
899 cxFree(&testingAllocator, item); |
|
900 EXPECT_TRUE(testingAllocator.verify()); |
|
901 } |
|
902 |
|
903 TEST_F(PointerLinkedList, SimpleDestructor) { |
|
904 int item = 0; |
|
905 auto list = cxPointerLinkedListCreate(cxDefaultAllocator, cmp_int); |
|
906 list->content_destructor_type = CX_DESTRUCTOR_SIMPLE; |
|
907 list->simple_destructor = [](void *elem) { *(int *) elem = 42; }; |
|
908 cxListAdd(list, &item); |
|
909 cxListDestroy(list); |
|
910 EXPECT_EQ(item, 42); |
|
911 } |
|
912 |
|
913 TEST_F(PointerLinkedList, AdvancedDestructor) { |
|
914 void *item = cxMalloc(&testingAllocator, sizeof(int)); |
|
915 auto list = cxPointerLinkedListCreate(cxDefaultAllocator, cmp_int); |
|
916 list->content_destructor_type = CX_DESTRUCTOR_ADVANCED; |
|
917 list->advanced_destructor.data = &testingAllocator; |
|
918 list->advanced_destructor.func = (cx_destructor_func2) cxFree; |
|
919 cxListAdd(list, item); |
|
920 ASSERT_FALSE(testingAllocator.verify()); |
|
921 cxListDestroy(list); |
|
922 EXPECT_TRUE(testingAllocator.verify()); |
|
923 } |