tests/test_list.cpp

Tue, 09 Jan 2024 00:01:03 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 09 Jan 2024 00:01:03 +0100
changeset 798
7644da6e2d35
parent 790
42877968260c
child 800
1274e46b3013
permissions
-rw-r--r--

migrate low level linked list tests - relates to #342

universe@390 1 /*
universe@390 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@390 3 *
universe@390 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@390 5 *
universe@390 6 * Redistribution and use in source and binary forms, with or without
universe@390 7 * modification, are permitted provided that the following conditions are met:
universe@390 8 *
universe@390 9 * 1. Redistributions of source code must retain the above copyright
universe@390 10 * notice, this list of conditions and the following disclaimer.
universe@390 11 *
universe@390 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@390 13 * notice, this list of conditions and the following disclaimer in the
universe@390 14 * documentation and/or other materials provided with the distribution.
universe@390 15 *
universe@390 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@390 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@390 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@390 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@390 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@390 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@390 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@390 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@390 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@390 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@390 26 * POSSIBILITY OF SUCH DAMAGE.
universe@390 27 */
universe@390 28
universe@398 29 #include "cx/linked_list.h"
universe@606 30 #include "cx/array_list.h"
universe@509 31 #include "cx/utils.h"
universe@602 32 #include "cx/compare.h"
universe@422 33 #include "util_allocator.h"
universe@398 34
universe@517 35 #include <gtest/gtest.h>
universe@517 36 #include <array>
universe@517 37 #include <vector>
universe@517 38 #include <unordered_set>
universe@517 39 #include <algorithm>
universe@517 40
universe@456 41
universe@517 42 class HighLevelTest : public ::testing::Test {
universe@517 43 mutable std::unordered_set<CxList *> lists;
universe@517 44 protected:
universe@518 45 CxTestingAllocator testingAllocator;
universe@455 46
universe@517 47 void TearDown() override {
universe@517 48 for (auto &&l: lists) cxListDestroy(l);
universe@790 49 CX_TEST_ASSERT(testingAllocator.verify());
universe@517 50 }
universe@517 51
universe@517 52 static constexpr size_t testdata_len = 250;
universe@517 53 int_test_data<testdata_len> testdata;
universe@517 54
universe@517 55 auto autofree(CxList *list) const -> CxList * {
universe@790 56 if (list != NULL) lists.insert(list);
universe@517 57 return list;
universe@517 58 }
universe@517 59
universe@517 60 auto linkedListFromTestData() const -> CxList * {
universe@629 61 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@629 62 cxListAddArray(list, testdata.data.data(), testdata_len);
universe@629 63 return list;
universe@517 64 }
universe@517 65
universe@641 66 auto pointerLinkedListFromTestData() const -> CxList * {
universe@667 67 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS));
universe@641 68 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@641 69 cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]);
universe@641 70 return list;
universe@641 71 }
universe@641 72
universe@606 73 auto arrayListFromTestData() const -> CxList * {
universe@606 74 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), testdata_len));
universe@629 75 cxListAddArray(list, testdata.data.data(), testdata_len);
universe@606 76 return list;
universe@606 77 }
universe@606 78
universe@679 79 auto pointerArrayListFromTestData() const -> CxList * {
universe@679 80 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 256));
universe@679 81 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@679 82 cx_for_n(i, testdata_len) cxListAdd(list, &testdata.data[i]);
universe@679 83 return list;
universe@679 84 }
universe@679 85
universe@528 86 void verifyAdd(
universe@528 87 CxList *list,
universe@606 88 bool as_pointer
universe@528 89 ) {
universe@517 90 auto len = testdata_len;
universe@517 91 cx_for_n (i, len) EXPECT_EQ(cxListAdd(list, &testdata.data[i]), 0);
universe@790 92 CX_TEST_ASSERT(cxListSize(list) == len);
universe@517 93 cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
universe@517 94 cx_for_n (i, len) ++testdata.data[i];
universe@606 95 if (as_pointer) {
universe@517 96 cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
universe@517 97 } else {
universe@517 98 cx_for_n (i, len) EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i] - 1);
universe@517 99 }
universe@517 100 }
universe@517 101
universe@517 102 static void verifyInsert(CxList *list) {
universe@517 103 int a = 5, b = 47, c = 13, d = 42;
universe@517 104
universe@517 105 EXPECT_NE(cxListInsert(list, 1, &a), 0);
universe@677 106 EXPECT_EQ(cxListSize(list), 0);
universe@517 107 EXPECT_EQ(cxListInsert(list, 0, &a), 0);
universe@677 108 EXPECT_EQ(cxListSize(list), 1);
universe@517 109 EXPECT_EQ(cxListInsert(list, 0, &b), 0);
universe@677 110 EXPECT_EQ(cxListSize(list), 2);
universe@517 111 EXPECT_EQ(cxListInsert(list, 1, &c), 0);
universe@677 112 EXPECT_EQ(cxListSize(list), 3);
universe@517 113 EXPECT_EQ(cxListInsert(list, 3, &d), 0);
universe@517 114
universe@790 115 CX_TEST_ASSERT(cxListSize(list) == 4);
universe@517 116
universe@517 117 EXPECT_EQ(*(int *) cxListAt(list, 0), 47);
universe@517 118 EXPECT_EQ(*(int *) cxListAt(list, 1), 13);
universe@517 119 EXPECT_EQ(*(int *) cxListAt(list, 2), 5);
universe@517 120 EXPECT_EQ(*(int *) cxListAt(list, 3), 42);
universe@517 121 }
universe@517 122
universe@641 123 static void verifyInsertArray(
universe@641 124 CxList *list,
universe@641 125 bool pointers = false
universe@641 126 ) {
universe@638 127 int a[5] = {5, 47, 11, 13, 42};
universe@638 128 int b[5] = {9, 18, 72, 50, 7};
universe@641 129 int *aptr[5];
universe@641 130 int *bptr[5];
universe@641 131 cx_for_n(i, 5) {
universe@641 132 aptr[i] = &a[i];
universe@641 133 bptr[i] = &b[i];
universe@641 134 }
universe@638 135
universe@638 136 size_t inserted;
universe@638 137
universe@641 138 if (pointers) {
universe@641 139 inserted = cxListInsertArray(list, 0, aptr, 5);
universe@641 140 } else {
universe@641 141 inserted = cxListInsertArray(list, 0, a, 5);
universe@641 142 }
universe@790 143 CX_TEST_ASSERT(inserted == 5);
universe@638 144 EXPECT_EQ(*(int *) cxListAt(list, 0), 5);
universe@638 145 EXPECT_EQ(*(int *) cxListAt(list, 1), 47);
universe@638 146 EXPECT_EQ(*(int *) cxListAt(list, 2), 11);
universe@638 147 EXPECT_EQ(*(int *) cxListAt(list, 3), 13);
universe@638 148 EXPECT_EQ(*(int *) cxListAt(list, 4), 42);
universe@641 149 if (pointers) {
universe@641 150 inserted = cxListInsertArray(list, 3, bptr, 5);
universe@641 151 } else {
universe@641 152 inserted = cxListInsertArray(list, 3, b, 5);
universe@641 153 }
universe@790 154 CX_TEST_ASSERT(inserted == 5);
universe@638 155 EXPECT_EQ(*(int *) cxListAt(list, 0), 5);
universe@638 156 EXPECT_EQ(*(int *) cxListAt(list, 1), 47);
universe@638 157 EXPECT_EQ(*(int *) cxListAt(list, 2), 11);
universe@638 158 EXPECT_EQ(*(int *) cxListAt(list, 3), 9);
universe@638 159 EXPECT_EQ(*(int *) cxListAt(list, 4), 18);
universe@638 160 EXPECT_EQ(*(int *) cxListAt(list, 5), 72);
universe@638 161 EXPECT_EQ(*(int *) cxListAt(list, 6), 50);
universe@638 162 EXPECT_EQ(*(int *) cxListAt(list, 7), 7);
universe@638 163 EXPECT_EQ(*(int *) cxListAt(list, 8), 13);
universe@638 164 EXPECT_EQ(*(int *) cxListAt(list, 9), 42);
universe@638 165 }
universe@638 166
universe@517 167 void verifyRemove(CxList *list) const {
universe@517 168 EXPECT_EQ(cxListRemove(list, 2), 0);
universe@517 169 EXPECT_EQ(cxListRemove(list, 4), 0);
universe@677 170 EXPECT_EQ(cxListSize(list), testdata_len - 2);
universe@517 171 EXPECT_EQ(*(int *) cxListAt(list, 0), testdata.data[0]);
universe@517 172 EXPECT_EQ(*(int *) cxListAt(list, 1), testdata.data[1]);
universe@517 173 EXPECT_EQ(*(int *) cxListAt(list, 2), testdata.data[3]);
universe@517 174 EXPECT_EQ(*(int *) cxListAt(list, 3), testdata.data[4]);
universe@517 175 EXPECT_EQ(*(int *) cxListAt(list, 4), testdata.data[6]);
universe@517 176
universe@517 177 EXPECT_EQ(cxListRemove(list, 0), 0);
universe@677 178 EXPECT_EQ(cxListSize(list), testdata_len - 3);
universe@517 179 EXPECT_EQ(*(int *) cxListAt(list, 0), testdata.data[1]);
universe@517 180 EXPECT_EQ(*(int *) cxListAt(list, 1), testdata.data[3]);
universe@517 181
universe@517 182 EXPECT_NE(cxListRemove(list, testdata_len), 0);
universe@517 183 }
universe@517 184
universe@764 185 void verifyFindRemove(CxList *list) const {
universe@764 186 size_t exp = rand() % testdata_len; // NOLINT(cert-msc50-cpp)
universe@764 187 int val = testdata.data[exp];
universe@764 188 // randomly picked number could occur earlier in list - find first position
universe@764 189 cx_for_n (i, exp) {
universe@764 190 if (testdata.data[i] == val) {
universe@764 191 exp = i;
universe@764 192 break;
universe@764 193 }
universe@764 194 }
universe@764 195 EXPECT_EQ(cxListSize(list), testdata_len);
universe@764 196 EXPECT_EQ(cxListFind(list, &val), exp);
universe@764 197 EXPECT_EQ(cxListFindRemove(list, &val), exp);
universe@764 198 EXPECT_EQ(cxListSize(list), testdata_len - 1);
universe@764 199 EXPECT_NE(cxListFind(list, &val), exp);
universe@764 200
universe@764 201 int notinlist = -1;
universe@764 202 EXPECT_LT(cxListFindRemove(list, &notinlist), 0);
universe@764 203 EXPECT_EQ(cxListSize(list), testdata_len - 1);
universe@764 204 }
universe@764 205
universe@672 206 static void verifyClear(CxList *list) {
universe@672 207 cxListClear(list);
universe@677 208 EXPECT_EQ(0, cxListSize(list));
universe@672 209 }
universe@666 210
universe@672 211 static unsigned destr_test_ctr;
universe@672 212 static int destr_last_value;
universe@672 213
universe@672 214 static void simple_destr_test_fun(void *data) {
universe@672 215 auto ptr = (int *) data;
universe@672 216 destr_last_value = *ptr;
universe@672 217 *ptr = destr_last_value + 1;
universe@672 218 destr_test_ctr++;
universe@672 219 }
universe@672 220
universe@672 221 static void advanced_destr_test_fun(
universe@672 222 [[maybe_unused]] void *u,
universe@672 223 void *data
universe@672 224 ) {
universe@672 225 simple_destr_test_fun(data);
universe@672 226 }
universe@672 227
universe@672 228 void verifyAnyDestructor(CxList *list) {
universe@672 229 int off = cxListIsStoringPointers(list) ? 1 : 0;
universe@672 230
universe@672 231 cxListRemove(list, 15);
universe@672 232 EXPECT_EQ(1, destr_test_ctr);
universe@672 233 EXPECT_EQ(testdata.data[15], destr_last_value + off);
universe@677 234 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@672 235 cxListRemove(list, 47);
universe@672 236 EXPECT_EQ(2, destr_test_ctr);
universe@672 237 EXPECT_EQ(testdata.data[48], destr_last_value + off);
universe@677 238 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@672 239
universe@672 240 auto iter = cxListMutIteratorAt(list, 7);
universe@672 241 cxIteratorNext(iter);
universe@672 242 EXPECT_EQ(2, destr_test_ctr);
universe@672 243 EXPECT_EQ(testdata.data[48], destr_last_value + off);
universe@677 244 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@672 245 cxIteratorFlagRemoval(iter);
universe@672 246 cxIteratorNext(iter);
universe@672 247 EXPECT_EQ(3, destr_test_ctr);
universe@672 248 EXPECT_EQ(testdata.data[8], destr_last_value + off);
universe@677 249 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@672 250
universe@672 251 iter = cxListMutBackwardsIteratorAt(list, 5);
universe@672 252 cxIteratorNext(iter);
universe@672 253 EXPECT_EQ(3, destr_test_ctr);
universe@672 254 EXPECT_EQ(testdata.data[8], destr_last_value + off);
universe@677 255 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@672 256 cxIteratorFlagRemoval(iter);
universe@672 257 cxIteratorNext(iter);
universe@672 258 EXPECT_EQ(4, destr_test_ctr);
universe@672 259 EXPECT_EQ(testdata.data[4], destr_last_value + off);
universe@677 260 EXPECT_EQ(testdata_len - destr_test_ctr, cxListSize(list));
universe@666 261
universe@666 262 cxListClear(list);
universe@672 263 EXPECT_EQ(testdata_len, destr_test_ctr);
universe@672 264 EXPECT_EQ(testdata.data[testdata_len - 1], destr_last_value + off);
universe@672 265 }
universe@672 266
universe@672 267 void verifySimpleDestructor(CxList *list) {
universe@672 268 destr_test_ctr = 0;
universe@672 269 list->simple_destructor = simple_destr_test_fun;
universe@672 270 verifyAnyDestructor(list);
universe@672 271 }
universe@672 272
universe@672 273 void verifyAdvancedDestructor(CxList *list) {
universe@672 274 destr_test_ctr = 0;
universe@677 275 list->advanced_destructor = advanced_destr_test_fun;
universe@672 276 verifyAnyDestructor(list);
universe@666 277 }
universe@666 278
universe@647 279 static void verifySwap(CxList *list) {
universe@790 280 CX_TEST_ASSERT(cxListSize(list) == 0);
universe@647 281
universe@647 282 int original[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
universe@647 283 int swapped[16] = {8, 4, 14, 3, 1, 5, 9, 12, 0, 6, 11, 10, 7, 15, 2, 13};
universe@647 284
universe@647 285 // we have to add the items one by one, because it could be a pointer list
universe@647 286 cx_for_n(i, 16) {
universe@647 287 cxListAdd(list, &original[i]);
universe@647 288 }
universe@647 289
universe@647 290 int result;
universe@647 291
universe@647 292 // execute the test two times with different item sizes
universe@647 293 result = cxListSwap(list, 1, 4);
universe@647 294 EXPECT_EQ(0, result);
universe@647 295 result = cxListSwap(list, 2, 14);
universe@647 296 EXPECT_EQ(0, result);
universe@647 297 result = cxListSwap(list, 9, 6);
universe@647 298 EXPECT_EQ(0, result);
universe@647 299 result = cxListSwap(list, 3, 3);
universe@647 300 EXPECT_EQ(0, result);
universe@647 301 result = cxListSwap(list, 10, 11);
universe@647 302 EXPECT_EQ(0, result);
universe@647 303 result = cxListSwap(list, 8, 0);
universe@647 304 EXPECT_EQ(0, result);
universe@647 305 result = cxListSwap(list, 7, 12);
universe@647 306 EXPECT_EQ(0, result);
universe@647 307 result = cxListSwap(list, 13, 15);
universe@647 308 EXPECT_EQ(0, result);
universe@647 309
universe@647 310 result = cxListSwap(list, 5, 16);
universe@790 311 CX_TEST_ASSERT(0 != result);
universe@647 312 result = cxListSwap(list, 16, 6);
universe@790 313 CX_TEST_ASSERT(0 != result);
universe@647 314 result = cxListSwap(list, 16, 17);
universe@790 315 CX_TEST_ASSERT(0 != result);
universe@647 316
universe@655 317 auto iter = cxListIterator(list);
universe@647 318 cx_foreach(int*, e, iter) {
universe@647 319 EXPECT_EQ(*e, swapped[iter.index]);
universe@647 320 }
universe@655 321 iter = cxListBackwardsIterator(list);
universe@655 322 cx_foreach(int*, e, iter) {
universe@655 323 EXPECT_EQ(*e, swapped[iter.index]);
universe@647 324 }
universe@647 325 }
universe@647 326
universe@517 327 void verifyAt(CxList *list) const {
universe@517 328 auto len = testdata_len;
universe@677 329 EXPECT_EQ(cxListSize(list), len);
universe@521 330 cx_for_n (i, len) {
universe@521 331 EXPECT_EQ(*(int *) cxListAt(list, i), testdata.data[i]);
universe@521 332 }
universe@790 333 EXPECT_EQ(cxListAt(list, cxListSize(list)), NULL);
universe@517 334 }
universe@517 335
universe@517 336 void verifyFind(CxList *list) const {
universe@517 337 cx_for_n (attempt, 25) {
universe@517 338 size_t exp = rand() % testdata_len; // NOLINT(cert-msc50-cpp)
universe@517 339 int val = testdata.data[exp];
universe@517 340 // randomly picked number could occur earlier in list - find first position
universe@517 341 cx_for_n (i, exp) {
universe@517 342 if (testdata.data[i] == val) {
universe@517 343 exp = i;
universe@517 344 break;
universe@517 345 }
universe@517 346 }
universe@517 347 EXPECT_EQ(cxListFind(list, &val), exp);
universe@517 348 }
universe@672 349
universe@672 350 int notinlist = -1;
universe@699 351 EXPECT_LT(cxListFind(list, &notinlist), 0);
universe@517 352 }
universe@517 353
universe@517 354 void verifySort(CxList *list) const {
universe@517 355 std::array<int, testdata_len> expected{};
universe@517 356 std::partial_sort_copy(testdata.data.begin(), testdata.data.end(), expected.begin(), expected.end());
universe@517 357 cxListSort(list);
universe@790 358 cx_for_n (i, testdata_len) CX_TEST_ASSERT(*(int *) cxListAt(list, i) == expected[i]);
universe@517 359 }
universe@517 360
universe@517 361 void verifyIterator(CxList *list) const {
universe@655 362 auto iter = cxListIterator(list);
universe@655 363 size_t i = 0;
universe@517 364 cx_foreach(int*, x, iter) {
universe@790 365 CX_TEST_ASSERT(i == iter.index);
universe@655 366 EXPECT_EQ(*x, testdata.data[iter.index]);
universe@517 367 i++;
universe@517 368 }
universe@790 369 CX_TEST_ASSERT(i == cxListSize(list));
universe@655 370 iter = cxListBackwardsIterator(list);
universe@655 371 cx_foreach(int*, x, iter) {
universe@790 372 CX_TEST_ASSERT(i - 1 == iter.index);
universe@655 373 EXPECT_EQ(*x, testdata.data[iter.index]);
universe@655 374 i--;
universe@655 375 }
universe@790 376 CX_TEST_ASSERT(i == 0);
universe@517 377 auto len = testdata_len;
universe@655 378 i = len / 2;
universe@655 379 auto mut_iter = cxListMutIteratorAt(list, i);
universe@655 380 size_t j = 0;
universe@655 381 cx_foreach(int*, x, mut_iter) {
universe@790 382 CX_TEST_ASSERT(mut_iter.index == len / 2 + j / 2);
universe@790 383 CX_TEST_ASSERT(*x == testdata.data[i]);
universe@655 384 if (i % 2 == 1) cxIteratorFlagRemoval(mut_iter);
universe@655 385 i++;
universe@655 386 j++;
universe@655 387 }
universe@790 388 CX_TEST_ASSERT(i == len);
universe@655 389 i = len / 2;
universe@655 390 j = 0;
universe@655 391 mut_iter = cxListMutBackwardsIteratorAt(list, i - 1);
universe@655 392 cx_foreach(int*, x, mut_iter) {
universe@790 393 CX_TEST_ASSERT(mut_iter.index == len / 2 - 1 - j);
universe@790 394 CX_TEST_ASSERT(*x == testdata.data[i - 1]);
universe@655 395 if (i % 2 == 0) cxIteratorFlagRemoval(mut_iter);
universe@655 396 i--;
universe@655 397 j++;
universe@655 398 }
universe@790 399 CX_TEST_ASSERT(i == 0);
universe@790 400 CX_TEST_ASSERT(cxListSize(list) == len / 2);
universe@517 401 cx_for_n(j, len / 2) ASSERT_EQ(*(int *) cxListAt(list, j), testdata.data[j * 2]);
universe@517 402 }
universe@517 403
universe@517 404 static void verifyInsertViaIterator(CxList *list) {
universe@517 405 int newdata[] = {10, 20, 30, 40, 50};
universe@517 406
universe@655 407 auto iter = cxListMutIteratorAt(list, 2);
universe@790 408 CX_TEST_ASSERT(cxIteratorValid(iter));
universe@517 409 EXPECT_EQ(iter.index, 2);
universe@630 410 EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
universe@517 411 cxListInsertAfter(&iter, &newdata[0]);
universe@790 412 CX_TEST_ASSERT(cxIteratorValid(iter));
universe@517 413 EXPECT_EQ(iter.index, 2);
universe@630 414 EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
universe@517 415 cxListInsertBefore(&iter, &newdata[1]);
universe@790 416 CX_TEST_ASSERT(cxIteratorValid(iter));
universe@517 417 EXPECT_EQ(iter.index, 3);
universe@630 418 EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 2);
universe@517 419
universe@655 420 iter = cxListMutIterator(list);
universe@517 421 cxListInsertBefore(&iter, &newdata[2]);
universe@790 422 CX_TEST_ASSERT(cxIteratorValid(iter));
universe@517 423 EXPECT_EQ(iter.index, 1);
universe@630 424 EXPECT_EQ(*(int *) cxIteratorCurrent(iter), 0);
universe@677 425 iter = cxListMutIteratorAt(list, cxListSize(list));
universe@517 426 cxListInsertBefore(&iter, &newdata[3]);
universe@790 427 CX_TEST_ASSERT(!cxIteratorValid(iter));
universe@517 428 EXPECT_EQ(iter.index, 9);
universe@677 429 iter = cxListMutIteratorAt(list, cxListSize(list));
universe@517 430 cxListInsertAfter(&iter, &newdata[4]);
universe@790 431 CX_TEST_ASSERT(!cxIteratorValid(iter));
universe@517 432 EXPECT_EQ(iter.index, 10);
universe@517 433
universe@517 434 int expdata[] = {30, 0, 1, 20, 2, 10, 3, 4, 40, 50};
universe@517 435 cx_for_n (j, 10) EXPECT_EQ(*(int *) cxListAt(list, j), expdata[j]);
universe@517 436 }
universe@521 437
universe@521 438 void verifyReverse(CxList *list) const {
universe@521 439 cxListReverse(list);
universe@521 440 cx_for_n(i, testdata_len) {
universe@521 441 ASSERT_EQ(*(int *) cxListAt(list, i), testdata.data[testdata_len - 1 - i]);
universe@521 442 }
universe@521 443 }
universe@521 444
universe@528 445 static void verifyCompare(
universe@528 446 CxList *left,
universe@528 447 CxList *right
universe@528 448 ) {
universe@521 449 EXPECT_EQ(cxListCompare(left, right), 0);
universe@521 450 int x = 42;
universe@521 451 cxListAdd(left, &x);
universe@677 452 ASSERT_GT(cxListSize(left), cxListSize(right));
universe@521 453 EXPECT_GT(cxListCompare(left, right), 0);
universe@521 454 EXPECT_LT(cxListCompare(right, left), 0);
universe@521 455 cxListAdd(right, &x);
universe@790 456 CX_TEST_ASSERT(cxListSize(left) == cxListSize(right));
universe@521 457 EXPECT_EQ(cxListCompare(left, right), 0);
universe@521 458 int a = 5, b = 10;
universe@521 459 cxListInsert(left, 15, &a);
universe@521 460 cxListInsert(right, 15, &b);
universe@790 461 CX_TEST_ASSERT(cxListSize(left) == cxListSize(right));
universe@521 462 EXPECT_LT(cxListCompare(left, right), 0);
universe@521 463 EXPECT_GT(cxListCompare(right, left), 0);
universe@528 464 *(int *) cxListAt(left, 15) = 10;
universe@521 465 EXPECT_EQ(cxListCompare(left, right), 0);
universe@521 466 }
universe@517 467 };
universe@517 468
universe@672 469 unsigned HighLevelTest::destr_test_ctr = 0;
universe@672 470 int HighLevelTest::destr_last_value = 0;
universe@672 471
universe@517 472 class LinkedList : public HighLevelTest {
universe@517 473 };
universe@517 474
universe@641 475 class PointerLinkedList : public HighLevelTest {
universe@641 476 };
universe@641 477
universe@606 478 class ArrayList : public HighLevelTest {
universe@606 479 };
universe@606 480
universe@679 481 class PointerArrayList : public HighLevelTest {
universe@679 482 };
universe@679 483
universe@641 484 TEST_F(PointerLinkedList, cxListStorePointers) {
universe@641 485 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, 47));
universe@790 486 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@641 487 cxListStorePointers(list);
universe@677 488 EXPECT_EQ(list->item_size, sizeof(void *));
universe@790 489 CX_TEST_ASSERT(list->cl != NULL);
universe@790 490 CX_TEST_ASSERT(list->climpl != NULL);
universe@790 491 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@641 492 cxListStoreObjects(list);
universe@790 493 CX_TEST_ASSERT(list->cl != NULL);
universe@790 494 EXPECT_EQ(list->climpl, NULL);
universe@790 495 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@641 496 }
universe@641 497
universe@517 498 TEST_F(LinkedList, cxLinkedListCreate) {
universe@602 499 CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@790 500 ASSERT_NE(list, NULL);
universe@677 501 EXPECT_EQ(list->item_size, sizeof(int));
universe@790 502 EXPECT_EQ(list->simple_destructor, NULL);
universe@790 503 EXPECT_EQ(list->advanced_destructor, NULL);
universe@790 504 EXPECT_EQ(list->destructor_data, NULL);
universe@677 505 EXPECT_EQ(cxListSize(list), 0);
universe@672 506 EXPECT_EQ(list->allocator, &testingAllocator);
universe@672 507 EXPECT_EQ(list->cmpfunc, cx_cmp_int);
universe@790 508 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@506 509 }
universe@506 510
universe@662 511 TEST_F(LinkedList, cxLinkedListCreateSimple) {
universe@662 512 CxList *list = autofree(cxLinkedListCreateSimple(sizeof(int)));
universe@790 513 ASSERT_NE(list, NULL);
universe@677 514 EXPECT_EQ(list->item_size, sizeof(int));
universe@790 515 EXPECT_EQ(list->cmpfunc, NULL);
universe@662 516 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@790 517 EXPECT_EQ(list->simple_destructor, NULL);
universe@790 518 EXPECT_EQ(list->advanced_destructor, NULL);
universe@790 519 EXPECT_EQ(list->destructor_data, NULL);
universe@677 520 EXPECT_EQ(cxListSize(list), 0);
universe@790 521 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@672 522 }
universe@672 523
universe@679 524 TEST_F(PointerLinkedList, cxLinkedListCreateSimpleForPointers) {
universe@672 525 CxList *list = autofree(cxLinkedListCreateSimple(CX_STORE_POINTERS));
universe@790 526 ASSERT_NE(list, NULL);
universe@677 527 EXPECT_EQ(list->item_size, sizeof(void *));
universe@763 528 EXPECT_EQ(list->cmpfunc, cx_cmp_ptr);
universe@672 529 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@790 530 EXPECT_EQ(list->simple_destructor, NULL);
universe@790 531 EXPECT_EQ(list->advanced_destructor, NULL);
universe@790 532 EXPECT_EQ(list->destructor_data, NULL);
universe@677 533 EXPECT_EQ(cxListSize(list), 0);
universe@790 534 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@662 535 }
universe@662 536
universe@606 537 TEST_F(ArrayList, cxArrayListCreate) {
universe@606 538 CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
universe@790 539 ASSERT_NE(list, NULL);
universe@677 540 EXPECT_EQ(list->item_size, sizeof(int));
universe@790 541 EXPECT_EQ(list->simple_destructor, NULL);
universe@790 542 EXPECT_EQ(list->advanced_destructor, NULL);
universe@790 543 EXPECT_EQ(list->destructor_data, NULL);
universe@677 544 EXPECT_EQ(cxListSize(list), 0);
universe@672 545 EXPECT_EQ(list->allocator, &testingAllocator);
universe@672 546 EXPECT_EQ(list->cmpfunc, cx_cmp_int);
universe@790 547 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@606 548 }
universe@606 549
universe@662 550 TEST_F(ArrayList, cxArrayListCreateSimple) {
universe@662 551 CxList *list = autofree(cxArrayListCreateSimple(sizeof(int), 8));
universe@790 552 ASSERT_NE(list, NULL);
universe@790 553 EXPECT_EQ(list->cmpfunc, NULL);
universe@662 554 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@677 555 EXPECT_EQ(list->item_size, sizeof(int));
universe@790 556 EXPECT_EQ(list->simple_destructor, NULL);
universe@790 557 EXPECT_EQ(list->advanced_destructor, NULL);
universe@790 558 EXPECT_EQ(list->destructor_data, NULL);
universe@677 559 EXPECT_EQ(cxListSize(list), 0);
universe@790 560 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@672 561 }
universe@672 562
universe@679 563 TEST_F(PointerArrayList, cxArrayListCreateSimpleForPointers) {
universe@672 564 CxList *list = autofree(cxArrayListCreateSimple(CX_STORE_POINTERS, 8));
universe@790 565 ASSERT_NE(list, NULL);
universe@763 566 EXPECT_EQ(list->cmpfunc, cx_cmp_ptr);
universe@672 567 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@677 568 EXPECT_EQ(list->item_size, sizeof(void *));
universe@790 569 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@662 570 }
universe@662 571
universe@517 572 TEST_F(LinkedList, cxListAdd) {
universe@641 573 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@517 574 verifyAdd(list, false);
universe@488 575 }
universe@488 576
universe@641 577 TEST_F(PointerLinkedList, cxListAdd) {
universe@667 578 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS));
universe@641 579 verifyAdd(list, true);
universe@641 580 }
universe@641 581
universe@606 582 TEST_F(ArrayList, cxListAdd) {
universe@641 583 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
universe@606 584 verifyAdd(list, false);
universe@606 585 }
universe@606 586
universe@679 587 TEST_F(PointerArrayList, cxListAdd) {
universe@679 588 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 8));
universe@679 589 verifyAdd(list, true);
universe@679 590 }
universe@679 591
universe@517 592 TEST_F(LinkedList, cxListInsert) {
universe@602 593 verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@459 594 }
universe@459 595
universe@641 596 TEST_F(PointerLinkedList, cxListInsert) {
universe@667 597 verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@641 598 }
universe@641 599
universe@606 600 TEST_F(ArrayList, cxListInsert) {
universe@606 601 verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 2)));
universe@606 602 }
universe@606 603
universe@679 604 TEST_F(PointerArrayList, cxListInsert) {
universe@679 605 verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 2)));
universe@679 606 }
universe@679 607
universe@638 608 TEST_F(LinkedList, cxListInsertArray) {
universe@638 609 verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@638 610 }
universe@638 611
universe@641 612 TEST_F(PointerLinkedList, cxListInsertArray) {
universe@667 613 verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)), true);
universe@641 614 }
universe@641 615
universe@638 616 TEST_F(ArrayList, cxListInsertArray) {
universe@638 617 verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4)));
universe@638 618 }
universe@638 619
universe@679 620 TEST_F(PointerArrayList, cxListInsertArray) {
universe@679 621 verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 4)), true);
universe@679 622 }
universe@679 623
universe@517 624 TEST_F(LinkedList, cxListRemove) {
universe@517 625 verifyRemove(linkedListFromTestData());
universe@498 626 }
universe@498 627
universe@641 628 TEST_F(PointerLinkedList, cxListRemove) {
universe@641 629 verifyRemove(pointerLinkedListFromTestData());
universe@641 630 }
universe@641 631
universe@606 632 TEST_F(ArrayList, cxListRemove) {
universe@606 633 verifyRemove(arrayListFromTestData());
universe@606 634 }
universe@606 635
universe@679 636 TEST_F(PointerArrayList, cxListRemove) {
universe@679 637 verifyRemove(pointerArrayListFromTestData());
universe@679 638 }
universe@679 639
universe@764 640 TEST_F(LinkedList, cxListFindRemove) {
universe@764 641 verifyFindRemove(linkedListFromTestData());
universe@764 642 }
universe@764 643
universe@764 644 TEST_F(PointerLinkedList, cxListFindRemove) {
universe@764 645 verifyFindRemove(pointerLinkedListFromTestData());
universe@764 646 }
universe@764 647
universe@764 648 TEST_F(ArrayList, cxListFindRemove) {
universe@764 649 verifyFindRemove(arrayListFromTestData());
universe@764 650 }
universe@764 651
universe@764 652 TEST_F(PointerArrayList, cxListFindRemove) {
universe@764 653 verifyFindRemove(pointerArrayListFromTestData());
universe@764 654 }
universe@764 655
universe@666 656 TEST_F(LinkedList, cxListClear) {
universe@672 657 verifyClear(linkedListFromTestData());
universe@666 658 }
universe@666 659
universe@666 660 TEST_F(PointerLinkedList, cxListClear) {
universe@672 661 verifyClear(pointerLinkedListFromTestData());
universe@666 662 }
universe@666 663
universe@666 664 TEST_F(ArrayList, cxListClear) {
universe@672 665 verifyClear(arrayListFromTestData());
universe@666 666 }
universe@666 667
universe@679 668 TEST_F(PointerArrayList, cxListClear) {
universe@679 669 verifyClear(pointerArrayListFromTestData());
universe@679 670 }
universe@679 671
universe@647 672 TEST_F(LinkedList, cxListSwap) {
universe@647 673 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@647 674 }
universe@647 675
universe@647 676 TEST_F(PointerLinkedList, cxListSwap) {
universe@667 677 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@647 678 }
universe@647 679
universe@647 680 TEST_F(ArrayList, cxListSwap) {
universe@647 681 verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 16)));
universe@647 682 }
universe@647 683
universe@679 684 TEST_F(PointerArrayList, cxListSwap) {
universe@679 685 verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 16)));
universe@679 686 }
universe@679 687
universe@647 688 TEST_F(LinkedList, cxListSwapNoSBO) {
universe@647 689 CX_DISABLE_LINKED_LIST_SWAP_SBO = true;
universe@647 690 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@647 691 CX_DISABLE_LINKED_LIST_SWAP_SBO = false;
universe@647 692 }
universe@647 693
universe@647 694 TEST_F(PointerLinkedList, cxListSwapNoSBO) {
universe@647 695 CX_DISABLE_LINKED_LIST_SWAP_SBO = true;
universe@667 696 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@647 697 CX_DISABLE_LINKED_LIST_SWAP_SBO = false;
universe@647 698 }
universe@647 699
universe@517 700 TEST_F(LinkedList, cxListAt) {
universe@517 701 verifyAt(linkedListFromTestData());
universe@509 702 }
universe@509 703
universe@641 704 TEST_F(PointerLinkedList, cxListAt) {
universe@641 705 verifyAt(pointerLinkedListFromTestData());
universe@641 706 }
universe@641 707
universe@606 708 TEST_F(ArrayList, cxListAt) {
universe@606 709 verifyAt(arrayListFromTestData());
universe@606 710 }
universe@606 711
universe@679 712 TEST_F(PointerArrayList, cxListAt) {
universe@679 713 verifyAt(pointerArrayListFromTestData());
universe@679 714 }
universe@679 715
universe@517 716 TEST_F(LinkedList, cxListFind) {
universe@517 717 verifyFind(linkedListFromTestData());
universe@509 718 }
universe@509 719
universe@641 720 TEST_F(PointerLinkedList, cxListFind) {
universe@641 721 verifyFind(pointerLinkedListFromTestData());
universe@641 722 }
universe@641 723
universe@606 724 TEST_F(ArrayList, cxListFind) {
universe@606 725 verifyFind(arrayListFromTestData());
universe@606 726 }
universe@606 727
universe@679 728 TEST_F(PointerArrayList, cxListFind) {
universe@679 729 verifyFind(pointerArrayListFromTestData());
universe@679 730 }
universe@679 731
universe@517 732 TEST_F(LinkedList, cxListSort) {
universe@517 733 verifySort(linkedListFromTestData());
universe@498 734 }
universe@498 735
universe@641 736 TEST_F(PointerLinkedList, cxListSort) {
universe@641 737 verifySort(pointerLinkedListFromTestData());
universe@641 738 }
universe@641 739
universe@606 740 TEST_F(ArrayList, cxListSort) {
universe@606 741 verifySort(arrayListFromTestData());
universe@606 742 }
universe@606 743
universe@679 744 TEST_F(PointerArrayList, cxListSort) {
universe@679 745 verifySort(pointerArrayListFromTestData());
universe@679 746 }
universe@679 747
universe@517 748 TEST_F(LinkedList, Iterator) {
universe@517 749 verifyIterator(linkedListFromTestData());
universe@509 750 }
universe@498 751
universe@641 752 TEST_F(PointerLinkedList, Iterator) {
universe@641 753 verifyIterator(pointerLinkedListFromTestData());
universe@641 754 }
universe@641 755
universe@606 756 TEST_F(ArrayList, Iterator) {
universe@606 757 verifyIterator(arrayListFromTestData());
universe@606 758 }
universe@606 759
universe@679 760 TEST_F(PointerArrayList, Iterator) {
universe@679 761 verifyIterator(pointerArrayListFromTestData());
universe@679 762 }
universe@679 763
universe@517 764 TEST_F(LinkedList, InsertViaIterator) {
universe@517 765 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@629 766 CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@629 767 cxListAddArray(list, fivenums, 5);
universe@517 768 verifyInsertViaIterator(list);
universe@459 769 }
universe@459 770
universe@641 771 TEST_F(PointerLinkedList, InsertViaIterator) {
universe@641 772 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@667 773 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS));
universe@641 774 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@641 775 cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
universe@641 776 verifyInsertViaIterator(list);
universe@641 777 }
universe@641 778
universe@606 779 TEST_F(ArrayList, InsertViaIterator) {
universe@606 780 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@667 781 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4));
universe@629 782 cxListAddArray(list, fivenums, 5);
universe@606 783 verifyInsertViaIterator(list);
universe@606 784 }
universe@606 785
universe@679 786 TEST_F(PointerArrayList, InsertViaIterator) {
universe@679 787 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@679 788 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 4));
universe@679 789 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@679 790 cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
universe@679 791 verifyInsertViaIterator(list);
universe@679 792 }
universe@679 793
universe@521 794 TEST_F(LinkedList, cxListReverse) {
universe@521 795 verifyReverse(linkedListFromTestData());
universe@521 796 }
universe@521 797
universe@641 798 TEST_F(PointerLinkedList, cxListReverse) {
universe@641 799 verifyReverse(pointerLinkedListFromTestData());
universe@641 800 }
universe@641 801
universe@606 802 TEST_F(ArrayList, cxListReverse) {
universe@606 803 verifyReverse(arrayListFromTestData());
universe@606 804 }
universe@606 805
universe@679 806 TEST_F(PointerArrayList, cxListReverse) {
universe@679 807 verifyReverse(pointerArrayListFromTestData());
universe@679 808 }
universe@679 809
universe@521 810 TEST_F(LinkedList, cxListCompare) {
universe@521 811 auto left = linkedListFromTestData();
universe@521 812 auto right = linkedListFromTestData();
universe@521 813 verifyCompare(left, right);
universe@521 814 }
universe@521 815
universe@641 816 TEST_F(LinkedList, cxListCompareWithPtrList) {
universe@641 817 auto left = linkedListFromTestData();
universe@641 818 auto right = pointerLinkedListFromTestData();
universe@641 819 verifyCompare(left, right);
universe@641 820 }
universe@641 821
universe@606 822 TEST_F(LinkedList, cxListCompareWithArrayList) {
universe@606 823 auto left = linkedListFromTestData();
universe@606 824 auto right = arrayListFromTestData();
universe@606 825 verifyCompare(left, right);
universe@606 826 }
universe@606 827
universe@679 828 TEST_F(LinkedList, cxListCompareWithPtrArrayList) {
universe@679 829 auto left = linkedListFromTestData();
universe@679 830 auto right = pointerArrayListFromTestData();
universe@679 831 verifyCompare(left, right);
universe@679 832 }
universe@679 833
universe@641 834 TEST_F(PointerLinkedList, cxListCompare) {
universe@641 835 auto left = pointerLinkedListFromTestData();
universe@641 836 auto right = pointerLinkedListFromTestData();
universe@641 837 verifyCompare(left, right);
universe@641 838 }
universe@641 839
universe@641 840 TEST_F(PointerLinkedList, cxListCompareWithNormalList) {
universe@641 841 auto left = pointerLinkedListFromTestData();
universe@641 842 auto right = linkedListFromTestData();
universe@641 843 verifyCompare(left, right);
universe@641 844 }
universe@641 845
universe@641 846 TEST_F(PointerLinkedList, cxListCompareWithArrayList) {
universe@641 847 auto left = pointerLinkedListFromTestData();
universe@641 848 auto right = arrayListFromTestData();
universe@641 849 verifyCompare(left, right);
universe@641 850 }
universe@641 851
universe@679 852 TEST_F(PointerLinkedList, cxListCompareWithPtrArrayList) {
universe@679 853 auto left = pointerLinkedListFromTestData();
universe@679 854 auto right = pointerArrayListFromTestData();
universe@679 855 verifyCompare(left, right);
universe@679 856 }
universe@679 857
universe@606 858 TEST_F(ArrayList, cxListCompare) {
universe@606 859 auto left = arrayListFromTestData();
universe@606 860 auto right = arrayListFromTestData();
universe@606 861 verifyCompare(left, right);
universe@606 862 }
universe@606 863
universe@641 864 TEST_F(ArrayList, cxListCompareWithPtrList) {
universe@641 865 auto left = arrayListFromTestData();
universe@641 866 auto right = pointerLinkedListFromTestData();
universe@641 867 verifyCompare(left, right);
universe@641 868 }
universe@641 869
universe@641 870 TEST_F(ArrayList, cxListCompareWithNormalList) {
universe@606 871 auto left = arrayListFromTestData();
universe@606 872 auto right = linkedListFromTestData();
universe@606 873 verifyCompare(left, right);
universe@606 874 }
universe@641 875
universe@679 876 TEST_F(ArrayList, cxListCompareWithPtrArrayList) {
universe@679 877 auto left = arrayListFromTestData();
universe@679 878 auto right = pointerArrayListFromTestData();
universe@679 879 verifyCompare(left, right);
universe@679 880 }
universe@679 881
universe@679 882 TEST_F(PointerArrayList, cxListCompare) {
universe@679 883 auto left = pointerArrayListFromTestData();
universe@679 884 auto right = pointerArrayListFromTestData();
universe@679 885 verifyCompare(left, right);
universe@679 886 }
universe@679 887
universe@679 888 TEST_F(PointerArrayList, cxListCompareWithPtrList) {
universe@679 889 auto left = pointerArrayListFromTestData();
universe@679 890 auto right = pointerLinkedListFromTestData();
universe@679 891 verifyCompare(left, right);
universe@679 892 }
universe@679 893
universe@679 894 TEST_F(PointerArrayList, cxListCompareWithNormalList) {
universe@679 895 auto left = pointerArrayListFromTestData();
universe@679 896 auto right = linkedListFromTestData();
universe@679 897 verifyCompare(left, right);
universe@679 898 }
universe@679 899
universe@679 900 TEST_F(PointerArrayList, cxListCompareWithNormalArrayList) {
universe@679 901 auto left = pointerArrayListFromTestData();
universe@679 902 auto right = arrayListFromTestData();
universe@679 903 verifyCompare(left, right);
universe@679 904 }
universe@679 905
universe@672 906 TEST_F(LinkedList, SimpleDestructor) {
universe@672 907 verifySimpleDestructor(linkedListFromTestData());
universe@672 908 }
universe@672 909
universe@672 910 TEST_F(PointerLinkedList, SimpleDestructor) {
universe@672 911 verifySimpleDestructor(pointerLinkedListFromTestData());
universe@672 912 }
universe@672 913
universe@672 914 TEST_F(ArrayList, SimpleDestructor) {
universe@672 915 verifySimpleDestructor(arrayListFromTestData());
universe@672 916 }
universe@672 917
universe@679 918 TEST_F(PointerArrayList, SimpleDestructor) {
universe@679 919 verifySimpleDestructor(pointerArrayListFromTestData());
universe@679 920 }
universe@679 921
universe@672 922 TEST_F(LinkedList, AdvancedDestructor) {
universe@672 923 verifyAdvancedDestructor(linkedListFromTestData());
universe@672 924 }
universe@672 925
universe@672 926 TEST_F(PointerLinkedList, AdvancedDestructor) {
universe@672 927 verifyAdvancedDestructor(pointerLinkedListFromTestData());
universe@672 928 }
universe@672 929
universe@672 930 TEST_F(ArrayList, AdvancedDestructor) {
universe@672 931 verifyAdvancedDestructor(arrayListFromTestData());
universe@672 932 }
universe@672 933
universe@679 934 TEST_F(PointerArrayList, AdvancedDestructor) {
universe@679 935 verifyAdvancedDestructor(pointerArrayListFromTestData());
universe@679 936 }
universe@679 937
universe@672 938 TEST_F(PointerLinkedList, DestroyNoDestructor) {
universe@641 939 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@667 940 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@641 941 cxListAdd(list, item);
universe@790 942 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 943 cxListDestroy(list);
universe@790 944 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 945 cxFree(&testingAllocator, item);
universe@790 946 CX_TEST_ASSERT(testingAllocator.verify());
universe@641 947 }
universe@641 948
universe@672 949 TEST_F(PointerLinkedList, DestroySimpleDestructor) {
universe@641 950 int item = 0;
universe@667 951 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@641 952 list->simple_destructor = [](void *elem) { *(int *) elem = 42; };
universe@641 953 cxListAdd(list, &item);
universe@641 954 cxListDestroy(list);
universe@641 955 EXPECT_EQ(item, 42);
universe@641 956 }
universe@641 957
universe@672 958 TEST_F(PointerLinkedList, DestroyAdvancedDestructor) {
universe@641 959 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@667 960 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@677 961 list->destructor_data = &testingAllocator;
universe@677 962 list->advanced_destructor = (cx_destructor_func2) cxFree;
universe@641 963 cxListAdd(list, item);
universe@790 964 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 965 cxListDestroy(list);
universe@790 966 CX_TEST_ASSERT(testingAllocator.verify());
universe@641 967 }
universe@679 968
universe@679 969 TEST_F(PointerArrayList, DestroyNoDestructor) {
universe@679 970 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@679 971 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 972 cxListAdd(list, item);
universe@790 973 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 974 cxListDestroy(list);
universe@790 975 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 976 cxFree(&testingAllocator, item);
universe@790 977 CX_TEST_ASSERT(testingAllocator.verify());
universe@679 978 }
universe@679 979
universe@679 980 TEST_F(PointerArrayList, DestroySimpleDestructor) {
universe@679 981 int item = 0;
universe@679 982 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 983 list->simple_destructor = [](void *elem) { *(int *) elem = 42; };
universe@679 984 cxListAdd(list, &item);
universe@679 985 cxListDestroy(list);
universe@679 986 EXPECT_EQ(item, 42);
universe@679 987 }
universe@679 988
universe@679 989 TEST_F(PointerArrayList, DestroyAdvancedDestructor) {
universe@679 990 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@679 991 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 992 list->destructor_data = &testingAllocator;
universe@679 993 list->advanced_destructor = (cx_destructor_func2) cxFree;
universe@679 994 cxListAdd(list, item);
universe@790 995 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 996 cxListDestroy(list);
universe@790 997 CX_TEST_ASSERT(testingAllocator.verify());
universe@679 998 }
universe@679 999
universe@704 1000 TEST(EmptyList, Size) {
universe@704 1001 auto list = cxEmptyList;
universe@704 1002
universe@704 1003 EXPECT_EQ(list->size, 0);
universe@704 1004 EXPECT_EQ(cxListSize(list), 0);
universe@704 1005 }
universe@704 1006
universe@704 1007 TEST(EmptyList, Iterator) {
universe@704 1008 auto list = cxEmptyList;
universe@704 1009
universe@704 1010 auto it1 = cxListIterator(list);
universe@704 1011 auto it2 = cxListBackwardsIterator(list);
universe@704 1012 auto it3 = cxListMutIterator(list);
universe@704 1013 auto it4 = cxListMutBackwardsIterator(list);
universe@704 1014
universe@790 1015 CX_TEST_ASSERT(!cxIteratorValid(it1));
universe@790 1016 CX_TEST_ASSERT(!cxIteratorValid(it2));
universe@790 1017 CX_TEST_ASSERT(!cxIteratorValid(it3));
universe@790 1018 CX_TEST_ASSERT(!cxIteratorValid(it4));
universe@704 1019
universe@704 1020 int c = 0;
universe@704 1021 cx_foreach(void*, data, it1) c++;
universe@704 1022 cx_foreach(void*, data, it2) c++;
universe@704 1023 cx_foreach(void*, data, it3) c++;
universe@704 1024 cx_foreach(void*, data, it4) c++;
universe@704 1025 EXPECT_EQ(c, 0);
universe@704 1026 }
universe@704 1027
universe@704 1028 TEST(EmptyList, NoOps) {
universe@704 1029 auto list = cxEmptyList;
universe@704 1030
universe@704 1031 ASSERT_NO_FATAL_FAILURE(cxListSort(list));
universe@704 1032 ASSERT_NO_FATAL_FAILURE(cxListClear(list));
universe@704 1033 ASSERT_NO_FATAL_FAILURE(cxListDestroy(list));
universe@704 1034 }
universe@704 1035
universe@704 1036 TEST(EmptyList, At) {
universe@704 1037 auto list = cxEmptyList;
universe@704 1038
universe@790 1039 EXPECT_EQ(cxListAt(list, 0), NULL);
universe@790 1040 EXPECT_EQ(cxListAt(list, 1), NULL);
universe@704 1041 }
universe@704 1042
universe@704 1043 TEST(EmptyList, Find) {
universe@704 1044 auto list = cxEmptyList;
universe@704 1045
universe@704 1046 int x = 42, y = 1337;
universe@704 1047
universe@704 1048 EXPECT_LT(cxListFind(list, &x), 0);
universe@704 1049 EXPECT_LT(cxListFind(list, &y), 0);
universe@704 1050 }
universe@704 1051
universe@704 1052 TEST(EmptyList, Compare) {
universe@704 1053 auto empty = cxEmptyList;
universe@704 1054
universe@704 1055 auto ll = cxLinkedListCreateSimple(sizeof(int));
universe@704 1056 auto al = cxArrayListCreateSimple(sizeof(int), 8);
universe@704 1057
universe@704 1058 int x = 5;
universe@704 1059
universe@704 1060 EXPECT_EQ(cxListCompare(empty, cxEmptyList), 0);
universe@704 1061 EXPECT_EQ(cxListCompare(ll, cxEmptyList), 0);
universe@704 1062 EXPECT_EQ(cxListCompare(al, cxEmptyList), 0);
universe@704 1063 EXPECT_EQ(cxListCompare(cxEmptyList, ll), 0);
universe@704 1064 EXPECT_EQ(cxListCompare(cxEmptyList, al), 0);
universe@704 1065
universe@704 1066 cxListAdd(ll, &x);
universe@704 1067 cxListAdd(al, &x);
universe@704 1068
universe@704 1069 EXPECT_GT(cxListCompare(ll, cxEmptyList), 0);
universe@704 1070 EXPECT_GT(cxListCompare(al, cxEmptyList), 0);
universe@704 1071 EXPECT_LT(cxListCompare(cxEmptyList, ll), 0);
universe@704 1072 EXPECT_LT(cxListCompare(cxEmptyList, al), 0);
universe@704 1073
universe@704 1074 cxListDestroy(ll);
universe@704 1075 cxListDestroy(al);
universe@704 1076 }

mercurial