1.1 --- a/test/test_list.cpp Wed Feb 08 18:56:58 2023 +0100 1.2 +++ b/test/test_list.cpp Wed Feb 08 20:26:09 2023 +0100 1.3 @@ -697,6 +697,54 @@ 1.4 EXPECT_NE(cxListRemove(list, testdata_len), 0); 1.5 } 1.6 1.7 + static void verifySwap(CxList *list) { 1.8 + ASSERT_EQ(list->size, 0); 1.9 + 1.10 + int original[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; 1.11 + int swapped[16] = {8, 4, 14, 3, 1, 5, 9, 12, 0, 6, 11, 10, 7, 15, 2, 13}; 1.12 + 1.13 + // we have to add the items one by one, because it could be a pointer list 1.14 + cx_for_n(i, 16) { 1.15 + cxListAdd(list, &original[i]); 1.16 + } 1.17 + 1.18 + int result; 1.19 + 1.20 + // execute the test two times with different item sizes 1.21 + result = cxListSwap(list, 1, 4); 1.22 + EXPECT_EQ(0, result); 1.23 + result = cxListSwap(list, 2, 14); 1.24 + EXPECT_EQ(0, result); 1.25 + result = cxListSwap(list, 9, 6); 1.26 + EXPECT_EQ(0, result); 1.27 + result = cxListSwap(list, 3, 3); 1.28 + EXPECT_EQ(0, result); 1.29 + result = cxListSwap(list, 10, 11); 1.30 + EXPECT_EQ(0, result); 1.31 + result = cxListSwap(list, 8, 0); 1.32 + EXPECT_EQ(0, result); 1.33 + result = cxListSwap(list, 7, 12); 1.34 + EXPECT_EQ(0, result); 1.35 + result = cxListSwap(list, 13, 15); 1.36 + EXPECT_EQ(0, result); 1.37 + 1.38 + result = cxListSwap(list, 5, 16); 1.39 + EXPECT_NE(0, result); 1.40 + result = cxListSwap(list, 16, 6); 1.41 + EXPECT_NE(0, result); 1.42 + result = cxListSwap(list, 16, 17); 1.43 + EXPECT_NE(0, result); 1.44 + 1.45 + auto iter = cxListBegin(list); 1.46 + cx_foreach(int*, e, iter) { 1.47 + EXPECT_EQ(*e, swapped[iter.index]); 1.48 + } 1.49 + // TODO: replace with backward iterator 1.50 + cx_for_n(i, 16) { 1.51 + EXPECT_EQ(*((int *) cxListAt(list, i)), swapped[i]); 1.52 + } 1.53 + } 1.54 + 1.55 void verifyAt(CxList *list) const { 1.56 auto len = testdata_len; 1.57 EXPECT_EQ(list->size, len); 1.58 @@ -903,6 +951,40 @@ 1.59 verifyRemove(arrayListFromTestData()); 1.60 } 1.61 1.62 +TEST_F(LinkedList, cxListSwap) { 1.63 + verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)))); 1.64 +} 1.65 + 1.66 +TEST_F(PointerLinkedList, cxListSwap) { 1.67 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.68 + cxListStorePointers(list); 1.69 + verifySwap(list); 1.70 +} 1.71 + 1.72 +TEST_F(ArrayList, cxListSwap) { 1.73 + verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 16))); 1.74 +} 1.75 + 1.76 +TEST_F(LinkedList, cxListSwapNoSBO) { 1.77 + CX_DISABLE_LINKED_LIST_SWAP_SBO = true; 1.78 + verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)))); 1.79 + CX_DISABLE_LINKED_LIST_SWAP_SBO = false; 1.80 +} 1.81 + 1.82 +TEST_F(PointerLinkedList, cxListSwapNoSBO) { 1.83 + auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int *))); 1.84 + cxListStorePointers(list); 1.85 + CX_DISABLE_LINKED_LIST_SWAP_SBO = true; 1.86 + verifySwap(list); 1.87 + CX_DISABLE_LINKED_LIST_SWAP_SBO = false; 1.88 +} 1.89 + 1.90 +TEST_F(ArrayList, cxListSwapNoSBO) { 1.91 + CX_DISABLE_LINKED_LIST_SWAP_SBO = true; 1.92 + verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 16))); 1.93 + CX_DISABLE_LINKED_LIST_SWAP_SBO = false; 1.94 +} 1.95 + 1.96 TEST_F(LinkedList, cxListAt) { 1.97 verifyAt(linkedListFromTestData()); 1.98 }