tests/test_list.cpp

Tue, 09 Jan 2024 21:25:08 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 09 Jan 2024 21:25:08 +0100
changeset 800
1274e46b3013
parent 798
7644da6e2d35
child 801
04aa3913c0e3
permissions
-rw-r--r--

migrate cxEmptyList 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@662 484
universe@517 485 TEST_F(LinkedList, cxListAdd) {
universe@641 486 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@517 487 verifyAdd(list, false);
universe@488 488 }
universe@488 489
universe@641 490 TEST_F(PointerLinkedList, cxListAdd) {
universe@667 491 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS));
universe@641 492 verifyAdd(list, true);
universe@641 493 }
universe@641 494
universe@606 495 TEST_F(ArrayList, cxListAdd) {
universe@641 496 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
universe@606 497 verifyAdd(list, false);
universe@606 498 }
universe@606 499
universe@679 500 TEST_F(PointerArrayList, cxListAdd) {
universe@679 501 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 8));
universe@679 502 verifyAdd(list, true);
universe@679 503 }
universe@679 504
universe@517 505 TEST_F(LinkedList, cxListInsert) {
universe@602 506 verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@459 507 }
universe@459 508
universe@641 509 TEST_F(PointerLinkedList, cxListInsert) {
universe@667 510 verifyInsert(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@641 511 }
universe@641 512
universe@606 513 TEST_F(ArrayList, cxListInsert) {
universe@606 514 verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 2)));
universe@606 515 }
universe@606 516
universe@679 517 TEST_F(PointerArrayList, cxListInsert) {
universe@679 518 verifyInsert(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 2)));
universe@679 519 }
universe@679 520
universe@638 521 TEST_F(LinkedList, cxListInsertArray) {
universe@638 522 verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@638 523 }
universe@638 524
universe@641 525 TEST_F(PointerLinkedList, cxListInsertArray) {
universe@667 526 verifyInsertArray(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)), true);
universe@641 527 }
universe@641 528
universe@638 529 TEST_F(ArrayList, cxListInsertArray) {
universe@638 530 verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4)));
universe@638 531 }
universe@638 532
universe@679 533 TEST_F(PointerArrayList, cxListInsertArray) {
universe@679 534 verifyInsertArray(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 4)), true);
universe@679 535 }
universe@679 536
universe@517 537 TEST_F(LinkedList, cxListRemove) {
universe@517 538 verifyRemove(linkedListFromTestData());
universe@498 539 }
universe@498 540
universe@641 541 TEST_F(PointerLinkedList, cxListRemove) {
universe@641 542 verifyRemove(pointerLinkedListFromTestData());
universe@641 543 }
universe@641 544
universe@606 545 TEST_F(ArrayList, cxListRemove) {
universe@606 546 verifyRemove(arrayListFromTestData());
universe@606 547 }
universe@606 548
universe@679 549 TEST_F(PointerArrayList, cxListRemove) {
universe@679 550 verifyRemove(pointerArrayListFromTestData());
universe@679 551 }
universe@679 552
universe@764 553 TEST_F(LinkedList, cxListFindRemove) {
universe@764 554 verifyFindRemove(linkedListFromTestData());
universe@764 555 }
universe@764 556
universe@764 557 TEST_F(PointerLinkedList, cxListFindRemove) {
universe@764 558 verifyFindRemove(pointerLinkedListFromTestData());
universe@764 559 }
universe@764 560
universe@764 561 TEST_F(ArrayList, cxListFindRemove) {
universe@764 562 verifyFindRemove(arrayListFromTestData());
universe@764 563 }
universe@764 564
universe@764 565 TEST_F(PointerArrayList, cxListFindRemove) {
universe@764 566 verifyFindRemove(pointerArrayListFromTestData());
universe@764 567 }
universe@764 568
universe@666 569 TEST_F(LinkedList, cxListClear) {
universe@672 570 verifyClear(linkedListFromTestData());
universe@666 571 }
universe@666 572
universe@666 573 TEST_F(PointerLinkedList, cxListClear) {
universe@672 574 verifyClear(pointerLinkedListFromTestData());
universe@666 575 }
universe@666 576
universe@666 577 TEST_F(ArrayList, cxListClear) {
universe@672 578 verifyClear(arrayListFromTestData());
universe@666 579 }
universe@666 580
universe@679 581 TEST_F(PointerArrayList, cxListClear) {
universe@679 582 verifyClear(pointerArrayListFromTestData());
universe@679 583 }
universe@679 584
universe@647 585 TEST_F(LinkedList, cxListSwap) {
universe@647 586 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@647 587 }
universe@647 588
universe@647 589 TEST_F(PointerLinkedList, cxListSwap) {
universe@667 590 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@647 591 }
universe@647 592
universe@647 593 TEST_F(ArrayList, cxListSwap) {
universe@647 594 verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 16)));
universe@647 595 }
universe@647 596
universe@679 597 TEST_F(PointerArrayList, cxListSwap) {
universe@679 598 verifySwap(autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 16)));
universe@679 599 }
universe@679 600
universe@647 601 TEST_F(LinkedList, cxListSwapNoSBO) {
universe@647 602 CX_DISABLE_LINKED_LIST_SWAP_SBO = true;
universe@647 603 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int))));
universe@647 604 CX_DISABLE_LINKED_LIST_SWAP_SBO = false;
universe@647 605 }
universe@647 606
universe@647 607 TEST_F(PointerLinkedList, cxListSwapNoSBO) {
universe@647 608 CX_DISABLE_LINKED_LIST_SWAP_SBO = true;
universe@667 609 verifySwap(autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS)));
universe@647 610 CX_DISABLE_LINKED_LIST_SWAP_SBO = false;
universe@647 611 }
universe@647 612
universe@517 613 TEST_F(LinkedList, cxListAt) {
universe@517 614 verifyAt(linkedListFromTestData());
universe@509 615 }
universe@509 616
universe@641 617 TEST_F(PointerLinkedList, cxListAt) {
universe@641 618 verifyAt(pointerLinkedListFromTestData());
universe@641 619 }
universe@641 620
universe@606 621 TEST_F(ArrayList, cxListAt) {
universe@606 622 verifyAt(arrayListFromTestData());
universe@606 623 }
universe@606 624
universe@679 625 TEST_F(PointerArrayList, cxListAt) {
universe@679 626 verifyAt(pointerArrayListFromTestData());
universe@679 627 }
universe@679 628
universe@517 629 TEST_F(LinkedList, cxListFind) {
universe@517 630 verifyFind(linkedListFromTestData());
universe@509 631 }
universe@509 632
universe@641 633 TEST_F(PointerLinkedList, cxListFind) {
universe@641 634 verifyFind(pointerLinkedListFromTestData());
universe@641 635 }
universe@641 636
universe@606 637 TEST_F(ArrayList, cxListFind) {
universe@606 638 verifyFind(arrayListFromTestData());
universe@606 639 }
universe@606 640
universe@679 641 TEST_F(PointerArrayList, cxListFind) {
universe@679 642 verifyFind(pointerArrayListFromTestData());
universe@679 643 }
universe@679 644
universe@517 645 TEST_F(LinkedList, cxListSort) {
universe@517 646 verifySort(linkedListFromTestData());
universe@498 647 }
universe@498 648
universe@641 649 TEST_F(PointerLinkedList, cxListSort) {
universe@641 650 verifySort(pointerLinkedListFromTestData());
universe@641 651 }
universe@641 652
universe@606 653 TEST_F(ArrayList, cxListSort) {
universe@606 654 verifySort(arrayListFromTestData());
universe@606 655 }
universe@606 656
universe@679 657 TEST_F(PointerArrayList, cxListSort) {
universe@679 658 verifySort(pointerArrayListFromTestData());
universe@679 659 }
universe@679 660
universe@517 661 TEST_F(LinkedList, Iterator) {
universe@517 662 verifyIterator(linkedListFromTestData());
universe@509 663 }
universe@498 664
universe@641 665 TEST_F(PointerLinkedList, Iterator) {
universe@641 666 verifyIterator(pointerLinkedListFromTestData());
universe@641 667 }
universe@641 668
universe@606 669 TEST_F(ArrayList, Iterator) {
universe@606 670 verifyIterator(arrayListFromTestData());
universe@606 671 }
universe@606 672
universe@679 673 TEST_F(PointerArrayList, Iterator) {
universe@679 674 verifyIterator(pointerArrayListFromTestData());
universe@679 675 }
universe@679 676
universe@517 677 TEST_F(LinkedList, InsertViaIterator) {
universe@517 678 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@629 679 CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@629 680 cxListAddArray(list, fivenums, 5);
universe@517 681 verifyInsertViaIterator(list);
universe@459 682 }
universe@459 683
universe@641 684 TEST_F(PointerLinkedList, InsertViaIterator) {
universe@641 685 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@667 686 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS));
universe@641 687 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@641 688 cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
universe@641 689 verifyInsertViaIterator(list);
universe@641 690 }
universe@641 691
universe@606 692 TEST_F(ArrayList, InsertViaIterator) {
universe@606 693 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@667 694 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 4));
universe@629 695 cxListAddArray(list, fivenums, 5);
universe@606 696 verifyInsertViaIterator(list);
universe@606 697 }
universe@606 698
universe@679 699 TEST_F(PointerArrayList, InsertViaIterator) {
universe@679 700 int fivenums[] = {0, 1, 2, 3, 4, 5};
universe@679 701 auto list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, CX_STORE_POINTERS, 4));
universe@679 702 // note: cannot use cxListAddArray() because we don't have a list of pointers
universe@679 703 cx_for_n(i, 5) cxListAdd(list, &fivenums[i]);
universe@679 704 verifyInsertViaIterator(list);
universe@679 705 }
universe@679 706
universe@521 707 TEST_F(LinkedList, cxListReverse) {
universe@521 708 verifyReverse(linkedListFromTestData());
universe@521 709 }
universe@521 710
universe@641 711 TEST_F(PointerLinkedList, cxListReverse) {
universe@641 712 verifyReverse(pointerLinkedListFromTestData());
universe@641 713 }
universe@641 714
universe@606 715 TEST_F(ArrayList, cxListReverse) {
universe@606 716 verifyReverse(arrayListFromTestData());
universe@606 717 }
universe@606 718
universe@679 719 TEST_F(PointerArrayList, cxListReverse) {
universe@679 720 verifyReverse(pointerArrayListFromTestData());
universe@679 721 }
universe@679 722
universe@521 723 TEST_F(LinkedList, cxListCompare) {
universe@521 724 auto left = linkedListFromTestData();
universe@521 725 auto right = linkedListFromTestData();
universe@521 726 verifyCompare(left, right);
universe@521 727 }
universe@521 728
universe@641 729 TEST_F(LinkedList, cxListCompareWithPtrList) {
universe@641 730 auto left = linkedListFromTestData();
universe@641 731 auto right = pointerLinkedListFromTestData();
universe@641 732 verifyCompare(left, right);
universe@641 733 }
universe@641 734
universe@606 735 TEST_F(LinkedList, cxListCompareWithArrayList) {
universe@606 736 auto left = linkedListFromTestData();
universe@606 737 auto right = arrayListFromTestData();
universe@606 738 verifyCompare(left, right);
universe@606 739 }
universe@606 740
universe@679 741 TEST_F(LinkedList, cxListCompareWithPtrArrayList) {
universe@679 742 auto left = linkedListFromTestData();
universe@679 743 auto right = pointerArrayListFromTestData();
universe@679 744 verifyCompare(left, right);
universe@679 745 }
universe@679 746
universe@641 747 TEST_F(PointerLinkedList, cxListCompare) {
universe@641 748 auto left = pointerLinkedListFromTestData();
universe@641 749 auto right = pointerLinkedListFromTestData();
universe@641 750 verifyCompare(left, right);
universe@641 751 }
universe@641 752
universe@641 753 TEST_F(PointerLinkedList, cxListCompareWithNormalList) {
universe@641 754 auto left = pointerLinkedListFromTestData();
universe@641 755 auto right = linkedListFromTestData();
universe@641 756 verifyCompare(left, right);
universe@641 757 }
universe@641 758
universe@641 759 TEST_F(PointerLinkedList, cxListCompareWithArrayList) {
universe@641 760 auto left = pointerLinkedListFromTestData();
universe@641 761 auto right = arrayListFromTestData();
universe@641 762 verifyCompare(left, right);
universe@641 763 }
universe@641 764
universe@679 765 TEST_F(PointerLinkedList, cxListCompareWithPtrArrayList) {
universe@679 766 auto left = pointerLinkedListFromTestData();
universe@679 767 auto right = pointerArrayListFromTestData();
universe@679 768 verifyCompare(left, right);
universe@679 769 }
universe@679 770
universe@606 771 TEST_F(ArrayList, cxListCompare) {
universe@606 772 auto left = arrayListFromTestData();
universe@606 773 auto right = arrayListFromTestData();
universe@606 774 verifyCompare(left, right);
universe@606 775 }
universe@606 776
universe@641 777 TEST_F(ArrayList, cxListCompareWithPtrList) {
universe@641 778 auto left = arrayListFromTestData();
universe@641 779 auto right = pointerLinkedListFromTestData();
universe@641 780 verifyCompare(left, right);
universe@641 781 }
universe@641 782
universe@641 783 TEST_F(ArrayList, cxListCompareWithNormalList) {
universe@606 784 auto left = arrayListFromTestData();
universe@606 785 auto right = linkedListFromTestData();
universe@606 786 verifyCompare(left, right);
universe@606 787 }
universe@641 788
universe@679 789 TEST_F(ArrayList, cxListCompareWithPtrArrayList) {
universe@679 790 auto left = arrayListFromTestData();
universe@679 791 auto right = pointerArrayListFromTestData();
universe@679 792 verifyCompare(left, right);
universe@679 793 }
universe@679 794
universe@679 795 TEST_F(PointerArrayList, cxListCompare) {
universe@679 796 auto left = pointerArrayListFromTestData();
universe@679 797 auto right = pointerArrayListFromTestData();
universe@679 798 verifyCompare(left, right);
universe@679 799 }
universe@679 800
universe@679 801 TEST_F(PointerArrayList, cxListCompareWithPtrList) {
universe@679 802 auto left = pointerArrayListFromTestData();
universe@679 803 auto right = pointerLinkedListFromTestData();
universe@679 804 verifyCompare(left, right);
universe@679 805 }
universe@679 806
universe@679 807 TEST_F(PointerArrayList, cxListCompareWithNormalList) {
universe@679 808 auto left = pointerArrayListFromTestData();
universe@679 809 auto right = linkedListFromTestData();
universe@679 810 verifyCompare(left, right);
universe@679 811 }
universe@679 812
universe@679 813 TEST_F(PointerArrayList, cxListCompareWithNormalArrayList) {
universe@679 814 auto left = pointerArrayListFromTestData();
universe@679 815 auto right = arrayListFromTestData();
universe@679 816 verifyCompare(left, right);
universe@679 817 }
universe@679 818
universe@672 819 TEST_F(LinkedList, SimpleDestructor) {
universe@672 820 verifySimpleDestructor(linkedListFromTestData());
universe@672 821 }
universe@672 822
universe@672 823 TEST_F(PointerLinkedList, SimpleDestructor) {
universe@672 824 verifySimpleDestructor(pointerLinkedListFromTestData());
universe@672 825 }
universe@672 826
universe@672 827 TEST_F(ArrayList, SimpleDestructor) {
universe@672 828 verifySimpleDestructor(arrayListFromTestData());
universe@672 829 }
universe@672 830
universe@679 831 TEST_F(PointerArrayList, SimpleDestructor) {
universe@679 832 verifySimpleDestructor(pointerArrayListFromTestData());
universe@679 833 }
universe@679 834
universe@672 835 TEST_F(LinkedList, AdvancedDestructor) {
universe@672 836 verifyAdvancedDestructor(linkedListFromTestData());
universe@672 837 }
universe@672 838
universe@672 839 TEST_F(PointerLinkedList, AdvancedDestructor) {
universe@672 840 verifyAdvancedDestructor(pointerLinkedListFromTestData());
universe@672 841 }
universe@672 842
universe@672 843 TEST_F(ArrayList, AdvancedDestructor) {
universe@672 844 verifyAdvancedDestructor(arrayListFromTestData());
universe@672 845 }
universe@672 846
universe@679 847 TEST_F(PointerArrayList, AdvancedDestructor) {
universe@679 848 verifyAdvancedDestructor(pointerArrayListFromTestData());
universe@679 849 }
universe@679 850
universe@800 851 TEST_F(PointerLinkedList, cxListStorePointers) {
universe@800 852 auto list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, 47));
universe@800 853 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 854 cxListStorePointers(list);
universe@800 855 EXPECT_EQ(list->item_size, sizeof(void *));
universe@800 856 CX_TEST_ASSERT(list->cl != NULL);
universe@800 857 CX_TEST_ASSERT(list->climpl != NULL);
universe@800 858 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@800 859 cxListStoreObjects(list);
universe@800 860 CX_TEST_ASSERT(list->cl != NULL);
universe@800 861 EXPECT_EQ(list->climpl, NULL);
universe@800 862 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 863 }
universe@800 864
universe@800 865 TEST_F(LinkedList, cxLinkedListCreate) {
universe@800 866 CxList *list = autofree(cxLinkedListCreate(&testingAllocator, cx_cmp_int, sizeof(int)));
universe@800 867 ASSERT_NE(list, NULL);
universe@800 868 EXPECT_EQ(list->item_size, sizeof(int));
universe@800 869 EXPECT_EQ(list->simple_destructor, NULL);
universe@800 870 EXPECT_EQ(list->advanced_destructor, NULL);
universe@800 871 EXPECT_EQ(list->destructor_data, NULL);
universe@800 872 EXPECT_EQ(cxListSize(list), 0);
universe@800 873 EXPECT_EQ(list->allocator, &testingAllocator);
universe@800 874 EXPECT_EQ(list->cmpfunc, cx_cmp_int);
universe@800 875 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 876 }
universe@800 877
universe@800 878 TEST_F(LinkedList, cxLinkedListCreateSimple) {
universe@800 879 CxList *list = autofree(cxLinkedListCreateSimple(sizeof(int)));
universe@800 880 ASSERT_NE(list, NULL);
universe@800 881 EXPECT_EQ(list->item_size, sizeof(int));
universe@800 882 EXPECT_EQ(list->cmpfunc, NULL);
universe@800 883 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@800 884 EXPECT_EQ(list->simple_destructor, NULL);
universe@800 885 EXPECT_EQ(list->advanced_destructor, NULL);
universe@800 886 EXPECT_EQ(list->destructor_data, NULL);
universe@800 887 EXPECT_EQ(cxListSize(list), 0);
universe@800 888 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 889 }
universe@800 890
universe@800 891 TEST_F(PointerLinkedList, cxLinkedListCreateSimpleForPointers) {
universe@800 892 CxList *list = autofree(cxLinkedListCreateSimple(CX_STORE_POINTERS));
universe@800 893 ASSERT_NE(list, NULL);
universe@800 894 EXPECT_EQ(list->item_size, sizeof(void *));
universe@800 895 EXPECT_EQ(list->cmpfunc, cx_cmp_ptr);
universe@800 896 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@800 897 EXPECT_EQ(list->simple_destructor, NULL);
universe@800 898 EXPECT_EQ(list->advanced_destructor, NULL);
universe@800 899 EXPECT_EQ(list->destructor_data, NULL);
universe@800 900 EXPECT_EQ(cxListSize(list), 0);
universe@800 901 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@800 902 }
universe@800 903
universe@800 904 TEST_F(ArrayList, cxArrayListCreate) {
universe@800 905 CxList *list = autofree(cxArrayListCreate(&testingAllocator, cx_cmp_int, sizeof(int), 8));
universe@800 906 ASSERT_NE(list, NULL);
universe@800 907 EXPECT_EQ(list->item_size, sizeof(int));
universe@800 908 EXPECT_EQ(list->simple_destructor, NULL);
universe@800 909 EXPECT_EQ(list->advanced_destructor, NULL);
universe@800 910 EXPECT_EQ(list->destructor_data, NULL);
universe@800 911 EXPECT_EQ(cxListSize(list), 0);
universe@800 912 EXPECT_EQ(list->allocator, &testingAllocator);
universe@800 913 EXPECT_EQ(list->cmpfunc, cx_cmp_int);
universe@800 914 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 915 }
universe@800 916
universe@800 917 TEST_F(ArrayList, cxArrayListCreateSimple) {
universe@800 918 CxList *list = autofree(cxArrayListCreateSimple(sizeof(int), 8));
universe@800 919 ASSERT_NE(list, NULL);
universe@800 920 EXPECT_EQ(list->cmpfunc, NULL);
universe@800 921 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@800 922 EXPECT_EQ(list->item_size, sizeof(int));
universe@800 923 EXPECT_EQ(list->simple_destructor, NULL);
universe@800 924 EXPECT_EQ(list->advanced_destructor, NULL);
universe@800 925 EXPECT_EQ(list->destructor_data, NULL);
universe@800 926 EXPECT_EQ(cxListSize(list), 0);
universe@800 927 CX_TEST_ASSERT(!cxListIsStoringPointers(list));
universe@800 928 }
universe@800 929
universe@800 930 TEST_F(PointerArrayList, cxArrayListCreateSimpleForPointers) {
universe@800 931 CxList *list = autofree(cxArrayListCreateSimple(CX_STORE_POINTERS, 8));
universe@800 932 ASSERT_NE(list, NULL);
universe@800 933 EXPECT_EQ(list->cmpfunc, cx_cmp_ptr);
universe@800 934 EXPECT_EQ(list->allocator, cxDefaultAllocator);
universe@800 935 EXPECT_EQ(list->item_size, sizeof(void *));
universe@800 936 CX_TEST_ASSERT(cxListIsStoringPointers(list));
universe@800 937 }
universe@800 938
universe@672 939 TEST_F(PointerLinkedList, DestroyNoDestructor) {
universe@641 940 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@667 941 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@641 942 cxListAdd(list, item);
universe@790 943 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 944 cxListDestroy(list);
universe@790 945 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 946 cxFree(&testingAllocator, item);
universe@790 947 CX_TEST_ASSERT(testingAllocator.verify());
universe@641 948 }
universe@641 949
universe@672 950 TEST_F(PointerLinkedList, DestroySimpleDestructor) {
universe@641 951 int item = 0;
universe@667 952 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@641 953 list->simple_destructor = [](void *elem) { *(int *) elem = 42; };
universe@641 954 cxListAdd(list, &item);
universe@641 955 cxListDestroy(list);
universe@641 956 EXPECT_EQ(item, 42);
universe@641 957 }
universe@641 958
universe@672 959 TEST_F(PointerLinkedList, DestroyAdvancedDestructor) {
universe@641 960 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@667 961 auto list = cxLinkedListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS);
universe@677 962 list->destructor_data = &testingAllocator;
universe@677 963 list->advanced_destructor = (cx_destructor_func2) cxFree;
universe@641 964 cxListAdd(list, item);
universe@790 965 CX_TEST_ASSERT(!testingAllocator.verify());
universe@641 966 cxListDestroy(list);
universe@790 967 CX_TEST_ASSERT(testingAllocator.verify());
universe@641 968 }
universe@679 969
universe@679 970 TEST_F(PointerArrayList, DestroyNoDestructor) {
universe@679 971 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@679 972 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 973 cxListAdd(list, item);
universe@790 974 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 975 cxListDestroy(list);
universe@790 976 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 977 cxFree(&testingAllocator, item);
universe@790 978 CX_TEST_ASSERT(testingAllocator.verify());
universe@679 979 }
universe@679 980
universe@679 981 TEST_F(PointerArrayList, DestroySimpleDestructor) {
universe@679 982 int item = 0;
universe@679 983 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 984 list->simple_destructor = [](void *elem) { *(int *) elem = 42; };
universe@679 985 cxListAdd(list, &item);
universe@679 986 cxListDestroy(list);
universe@679 987 EXPECT_EQ(item, 42);
universe@679 988 }
universe@679 989
universe@679 990 TEST_F(PointerArrayList, DestroyAdvancedDestructor) {
universe@679 991 void *item = cxMalloc(&testingAllocator, sizeof(int));
universe@679 992 auto list = cxArrayListCreate(cxDefaultAllocator, cx_cmp_int, CX_STORE_POINTERS, 4);
universe@679 993 list->destructor_data = &testingAllocator;
universe@679 994 list->advanced_destructor = (cx_destructor_func2) cxFree;
universe@679 995 cxListAdd(list, item);
universe@790 996 CX_TEST_ASSERT(!testingAllocator.verify());
universe@679 997 cxListDestroy(list);
universe@790 998 CX_TEST_ASSERT(testingAllocator.verify());
universe@679 999 }
universe@679 1000

mercurial