test/test_list.cpp

changeset 528
4fbfac557df8
parent 521
e5dc54131d55
child 552
4373c2a90066
equal deleted inserted replaced
527:08539b8273fa 528:4fbfac557df8
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 }

mercurial