test/test_list.c

Tue, 05 Oct 2021 13:03:45 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 05 Oct 2021 13:03:45 +0200
changeset 466
28bc3e10ac28
parent 460
e075009b33b7
child 468
75ae1dccd101
permissions
-rw-r--r--

add special linked list implementation for storing pointers

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@411 30 #include "test_config.h"
universe@422 31 #include "util_allocator.h"
universe@398 32
universe@412 33 int cmp_int(int const *l, int const *r) {
universe@412 34 int left = *l, right = *r;
universe@412 35 return left == right ? 0 : (left < right ? -1 : 1);
universe@412 36 }
universe@412 37
universe@438 38 void test_linked_list_at(void) {
universe@438 39 struct node {
universe@438 40 void *next;
universe@438 41 void *prev;
universe@438 42 };
universe@438 43 const ptrdiff_t loc_prev = offsetof(struct node, prev);
universe@438 44 const ptrdiff_t loc_next = offsetof(struct node, next);
universe@438 45
universe@438 46 struct node a, b, c, d;
universe@438 47 a.prev = NULL;
universe@438 48 a.next = &b;
universe@438 49 b.prev = &a;
universe@438 50 b.next = &c;
universe@438 51 c.prev = &b;
universe@438 52 c.next = &d;
universe@438 53 d.prev = &c;
universe@438 54 d.next = NULL;
universe@438 55
universe@449 56 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 0), &a)
universe@449 57 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 1), &b)
universe@449 58 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 2), &c)
universe@449 59 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 3), &d)
universe@449 60 CU_ASSERT_PTR_NULL(cx_linked_list_at(&a, 0, loc_next, 4))
universe@438 61
universe@449 62 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_prev, 0), &a)
universe@449 63 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 1), &b)
universe@449 64 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 2), &c)
universe@449 65 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 3), &d)
universe@449 66 CU_ASSERT_PTR_NULL(cx_linked_list_at(&b, 1, loc_next, 4))
universe@438 67
universe@449 68 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&d, 3, loc_prev, 0), &a)
universe@449 69 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&d, 3, loc_prev, 1), &b)
universe@438 70 }
universe@438 71
olaf@444 72 void test_linked_list_add(void) {
olaf@442 73 struct node {
olaf@442 74 void *prev;
olaf@442 75 void *next;
olaf@442 76 };
universe@449 77
olaf@442 78 struct node nodes[4];
universe@449 79
olaf@442 80 // test with begin, end / prev, next
universe@449 81 memset(nodes, 0, 4 * sizeof(struct node));
olaf@442 82 void *begin = NULL;
olaf@442 83 void *end = NULL;
universe@449 84
olaf@442 85 ptrdiff_t loc_prev = offsetof(struct node, prev);
olaf@442 86 ptrdiff_t loc_next = offsetof(struct node, next);
universe@449 87
universe@453 88 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]);
universe@449 89 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 90 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@449 91 CU_ASSERT_PTR_EQUAL(nodes[0].prev, NULL)
universe@449 92 CU_ASSERT_PTR_EQUAL(nodes[0].next, NULL)
universe@449 93
universe@453 94 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]);
universe@449 95 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 96 CU_ASSERT_PTR_EQUAL(end, &nodes[1])
universe@449 97 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 98 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0])
universe@449 99
olaf@442 100 // test with begin only / prev, next
universe@449 101 memset(nodes, 0, 4 * sizeof(struct node));
olaf@442 102 begin = NULL;
olaf@442 103 end = NULL;
universe@449 104
universe@453 105 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[0]);
universe@449 106 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@453 107 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[1]);
universe@449 108 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 109 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 110 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0])
universe@449 111
universe@453 112 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[2]);
universe@449 113 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2])
universe@449 114 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1])
universe@449 115
olaf@442 116 // test with begin, end / next
universe@449 117 memset(nodes, 0, 4 * sizeof(struct node));
olaf@442 118 begin = NULL;
olaf@442 119 end = NULL;
universe@449 120
universe@453 121 cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[0]);
universe@449 122 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 123 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@453 124 cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[1]);
universe@449 125 CU_ASSERT_PTR_EQUAL(end, &nodes[1])
universe@449 126 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 127 CU_ASSERT_PTR_NULL(nodes[1].prev)
olaf@442 128 }
olaf@442 129
universe@456 130 void test_linked_list_last(void) {
universe@456 131 CU_ASSERT_PTR_NULL(cx_linked_list_last(NULL, -1))
universe@456 132 CU_ASSERT_PTR_NULL(cx_linked_list_last(NULL, 0))
universe@455 133
universe@456 134 struct node {
universe@456 135 int data;
universe@456 136 void *next;
universe@456 137 };
universe@456 138 ptrdiff_t loc = offsetof(struct node, next);
universe@456 139
universe@456 140 struct node third = {3, NULL};
universe@456 141 struct node second = {2, &third};
universe@456 142 struct node first = {1, &second};
universe@456 143
universe@456 144 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(&first, loc), &third)
universe@456 145 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(&second, loc), &third)
universe@456 146 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(&third, loc), &third)
universe@456 147 }
universe@456 148
universe@456 149
universe@456 150 void test_hl_linked_list_create(void) {
universe@455 151 cxTestingAllocatorReset();
universe@455 152
universe@455 153 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@455 154
universe@455 155 CU_ASSERT_EQUAL(list->size, 0)
universe@455 156 CU_ASSERT_EQUAL(list->capacity, (size_t) -1)
universe@455 157 CU_ASSERT_PTR_EQUAL(list->allocator, cxTestingAllocator)
universe@455 158 CU_ASSERT_EQUAL(list->itemsize, sizeof(int))
universe@455 159 CU_ASSERT_PTR_EQUAL(list->cmpfunc, cmp_int)
universe@455 160
universe@455 161 cxLinkedListDestroy(list);
universe@455 162 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@455 163 }
universe@455 164
universe@459 165 void test_hl_linked_list_add(void) {
universe@459 166 cxTestingAllocatorReset();
universe@459 167
universe@459 168 int data;
universe@459 169 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 170
universe@459 171 data = 5;
universe@460 172 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 173 data = 47;
universe@460 174 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 175 data = 13;
universe@460 176 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 177
universe@459 178 CU_ASSERT_EQUAL(list->size, 3)
universe@459 179 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 180
universe@466 181 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 182 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 183 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@459 184
universe@459 185 cxLinkedListDestroy(list);
universe@459 186 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 187 }
universe@459 188
universe@459 189 void test_hl_linked_list_last(void) {
universe@459 190 cxTestingAllocatorReset();
universe@459 191
universe@459 192 int data;
universe@459 193 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 194
universe@460 195 CU_ASSERT_PTR_NULL(cxListLast(list))
universe@459 196
universe@459 197 data = 5;
universe@460 198 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@466 199 CU_ASSERT_EQUAL(*(int *) cxListLast(list), 5)
universe@459 200
universe@459 201 data = 47;
universe@460 202 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@466 203 CU_ASSERT_EQUAL(*(int *) cxListLast(list), 47)
universe@459 204
universe@459 205 cxLinkedListDestroy(list);
universe@459 206 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 207 }
universe@459 208
universe@459 209 void test_hl_linked_list_insert(void) {
universe@459 210 cxTestingAllocatorReset();
universe@459 211
universe@459 212 int data;
universe@459 213 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 214
universe@459 215 data = 5;
universe@460 216 CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &data), 0)
universe@459 217 CU_ASSERT_EQUAL(list->size, 0)
universe@460 218 CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
universe@459 219 CU_ASSERT_EQUAL(list->size, 1)
universe@459 220 data = 47;
universe@460 221 CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
universe@459 222 CU_ASSERT_EQUAL(list->size, 2)
universe@459 223 data = 13;
universe@460 224 CU_ASSERT_EQUAL(cxListInsert(list, 1, &data), 0)
universe@459 225 CU_ASSERT_EQUAL(list->size, 3)
universe@459 226 data = 42;
universe@460 227 CU_ASSERT_EQUAL(cxListInsert(list, 3, &data), 0)
universe@459 228
universe@459 229 CU_ASSERT_EQUAL(list->size, 4)
universe@459 230 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 231
universe@466 232 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 233 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 234 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 5)
universe@466 235 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 3), 42)
universe@459 236
universe@459 237 cxLinkedListDestroy(list);
universe@459 238 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 239 }
universe@459 240
universe@459 241 void test_hl_linked_list_remove(void) {
universe@459 242 cxTestingAllocatorReset();
universe@459 243
universe@459 244 int data;
universe@459 245 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 246
universe@459 247 data = 5;
universe@460 248 cxListAdd(list, &data);
universe@459 249 data = 47;
universe@460 250 cxListAdd(list, &data);
universe@459 251 data = 42;
universe@460 252 cxListAdd(list, &data);
universe@459 253 data = 13;
universe@460 254 cxListAdd(list, &data);
universe@459 255
universe@459 256 CU_ASSERT_EQUAL(list->size, 4)
universe@459 257 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 258
universe@459 259 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 4), 0)
universe@459 260
universe@459 261 CU_ASSERT_EQUAL(cxListRemove(list, 2), 0)
universe@459 262 CU_ASSERT_EQUAL(list->size, 3)
universe@459 263 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 264 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 265 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 266 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@459 267
universe@459 268 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@459 269 CU_ASSERT_EQUAL(list->size, 2)
universe@459 270 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 271 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 272 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@459 273
universe@459 274 CU_ASSERT_EQUAL(cxListRemove(list, 1), 0)
universe@459 275 CU_ASSERT_EQUAL(list->size, 1)
universe@459 276 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 277 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@459 278
universe@459 279 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@459 280 CU_ASSERT_EQUAL(list->size, 0)
universe@459 281 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 282
universe@459 283 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 0), 0)
universe@459 284
universe@459 285 cxLinkedListDestroy(list);
universe@459 286 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 287 }
universe@459 288
universe@459 289 void test_hl_linked_list_find(void) {
universe@459 290 cxTestingAllocatorReset();
universe@459 291
universe@459 292 int data, criteria;
universe@459 293 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 294
universe@459 295 data = 5;
universe@460 296 cxListAdd(list, &data);
universe@459 297 data = 47;
universe@460 298 cxListAdd(list, &data);
universe@459 299 data = 13;
universe@460 300 cxListAdd(list, &data);
universe@459 301
universe@459 302 CU_ASSERT_EQUAL(list->size, 3)
universe@459 303 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 304
universe@459 305 criteria = 5;
universe@460 306 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
universe@459 307 criteria = 47;
universe@460 308 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@459 309 criteria = 13;
universe@460 310 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
universe@459 311 criteria = 9000;
universe@460 312 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@459 313 criteria = -5;
universe@460 314 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@459 315
universe@459 316 cxLinkedListDestroy(list);
universe@459 317 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 318 }
universe@459 319
universe@466 320 void test_hl_ptr_linked_list_create(void) {
universe@466 321 cxTestingAllocatorReset();
universe@466 322
universe@466 323 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 324
universe@466 325 CU_ASSERT_EQUAL(list->size, 0)
universe@466 326 CU_ASSERT_EQUAL(list->capacity, (size_t) -1)
universe@466 327 CU_ASSERT_PTR_EQUAL(list->allocator, cxTestingAllocator)
universe@466 328 CU_ASSERT_EQUAL(list->itemsize, sizeof(void *))
universe@466 329 CU_ASSERT_PTR_EQUAL(list->cmpfunc, cmp_int)
universe@466 330
universe@466 331 cxLinkedListDestroy(list);
universe@466 332 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 333 }
universe@466 334
universe@466 335 void test_hl_ptr_linked_list_add(void) {
universe@466 336 cxTestingAllocatorReset();
universe@466 337
universe@466 338 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 339
universe@466 340 int a = 5, b = 47, c = 13;
universe@466 341
universe@466 342 CU_ASSERT_EQUAL(cxListAdd(list, &a), 0)
universe@466 343 CU_ASSERT_EQUAL(cxListAdd(list, &b), 0)
universe@466 344 CU_ASSERT_EQUAL(cxListAdd(list, &c), 0)
universe@466 345
universe@466 346 CU_ASSERT_EQUAL(list->size, 3)
universe@466 347 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 348
universe@466 349 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 350 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 351 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@466 352
universe@466 353 a = 9;
universe@466 354 b = 10;
universe@466 355 c = 11;
universe@466 356
universe@466 357 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 9)
universe@466 358 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 10)
universe@466 359 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 11)
universe@466 360
universe@466 361 cxLinkedListDestroy(list);
universe@466 362 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 363 }
universe@466 364
universe@466 365 void test_hl_ptr_linked_list_last(void) {
universe@466 366 cxTestingAllocatorReset();
universe@466 367
universe@466 368 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 369 CU_ASSERT_PTR_NULL(cxListLast(list))
universe@466 370
universe@466 371 int a = 5, b = 47;
universe@466 372
universe@466 373 CU_ASSERT_EQUAL(cxListAdd(list, &a), 0)
universe@466 374 CU_ASSERT_EQUAL(*(int *) cxListLast(list), 5)
universe@466 375 CU_ASSERT_EQUAL(cxListAdd(list, &b), 0)
universe@466 376 CU_ASSERT_EQUAL(*(int *) cxListLast(list), 47)
universe@466 377
universe@466 378 cxLinkedListDestroy(list);
universe@466 379 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 380 }
universe@466 381
universe@466 382 void test_hl_ptr_linked_list_insert(void) {
universe@466 383 cxTestingAllocatorReset();
universe@466 384
universe@466 385 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 386
universe@466 387 int a = 5, b = 47, c = 13, d = 42;
universe@466 388
universe@466 389 CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &a), 0)
universe@466 390 CU_ASSERT_EQUAL(list->size, 0)
universe@466 391 CU_ASSERT_EQUAL(cxListInsert(list, 0, &a), 0)
universe@466 392 CU_ASSERT_EQUAL(list->size, 1)
universe@466 393 CU_ASSERT_EQUAL(cxListInsert(list, 0, &b), 0)
universe@466 394 CU_ASSERT_EQUAL(list->size, 2)
universe@466 395 CU_ASSERT_EQUAL(cxListInsert(list, 1, &c), 0)
universe@466 396 CU_ASSERT_EQUAL(list->size, 3)
universe@466 397 CU_ASSERT_EQUAL(cxListInsert(list, 3, &d), 0)
universe@466 398
universe@466 399 CU_ASSERT_EQUAL(list->size, 4)
universe@466 400 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 401
universe@466 402 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 403 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 404 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 5)
universe@466 405 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 3), 42)
universe@466 406
universe@466 407 cxLinkedListDestroy(list);
universe@466 408 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 409 }
universe@466 410
universe@466 411 void test_hl_ptr_linked_list_remove(void) {
universe@466 412 cxTestingAllocatorReset();
universe@466 413
universe@466 414 int a = 5, b = 47, c = 42, d = 13;
universe@466 415 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 416
universe@466 417 cxListAdd(list, &a);
universe@466 418 cxListAdd(list, &b);
universe@466 419 cxListAdd(list, &c);
universe@466 420 cxListAdd(list, &d);
universe@466 421
universe@466 422 CU_ASSERT_EQUAL(list->size, 4)
universe@466 423 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 424
universe@466 425 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 4), 0)
universe@466 426
universe@466 427 CU_ASSERT_EQUAL(cxListRemove(list, 2), 0)
universe@466 428 CU_ASSERT_EQUAL(list->size, 3)
universe@466 429 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 430 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 431 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 432 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@466 433
universe@466 434 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@466 435 CU_ASSERT_EQUAL(list->size, 2)
universe@466 436 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 437 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 438 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 439
universe@466 440 CU_ASSERT_EQUAL(cxListRemove(list, 1), 0)
universe@466 441 CU_ASSERT_EQUAL(list->size, 1)
universe@466 442 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 443 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 444
universe@466 445 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@466 446 CU_ASSERT_EQUAL(list->size, 0)
universe@466 447 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 448
universe@466 449 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 0), 0)
universe@466 450
universe@466 451 cxLinkedListDestroy(list);
universe@466 452 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 453 }
universe@466 454
universe@466 455 void test_hl_ptr_linked_list_find(void) {
universe@466 456 cxTestingAllocatorReset();
universe@466 457
universe@466 458 int a = 5, b = 47, c = 13, criteria;
universe@466 459 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 460
universe@466 461 cxListAdd(list, &a);
universe@466 462 cxListAdd(list, &b);
universe@466 463 cxListAdd(list, &c);
universe@466 464
universe@466 465 CU_ASSERT_EQUAL(list->size, 3)
universe@466 466 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 467
universe@466 468 criteria = 5;
universe@466 469 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
universe@466 470 criteria = 47;
universe@466 471 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@466 472 criteria = 13;
universe@466 473 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
universe@466 474 criteria = 9000;
universe@466 475 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@466 476 criteria = -5;
universe@466 477 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@466 478 b = -5;
universe@466 479 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@466 480
universe@466 481 cxLinkedListDestroy(list);
universe@466 482 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 483 }
universe@466 484
universe@390 485 int main() {
universe@411 486 CU_pSuite suite = NULL;
universe@449 487
universe@411 488 if (CUE_SUCCESS != CU_initialize_registry()) {
universe@411 489 return CU_get_error();
universe@411 490 }
universe@411 491
universe@459 492 suite = CU_add_suite("low level linked list", NULL, NULL);
universe@449 493
universe@455 494 cu_add_test(suite, test_linked_list_at);
universe@455 495 cu_add_test(suite, test_linked_list_add);
universe@456 496 cu_add_test(suite, test_linked_list_last);
universe@455 497
universe@459 498 suite = CU_add_suite("high level linked list", NULL, NULL);
universe@455 499
universe@456 500 cu_add_test(suite, test_hl_linked_list_create);
universe@456 501 cu_add_test(suite, test_hl_linked_list_add);
universe@456 502 cu_add_test(suite, test_hl_linked_list_last);
universe@456 503 cu_add_test(suite, test_hl_linked_list_insert);
universe@456 504 cu_add_test(suite, test_hl_linked_list_remove);
universe@459 505 cu_add_test(suite, test_hl_linked_list_find);
universe@413 506
universe@466 507 suite = CU_add_suite("high level pointer linked list", NULL, NULL);
universe@466 508
universe@466 509 cu_add_test(suite, test_hl_ptr_linked_list_create);
universe@466 510 cu_add_test(suite, test_hl_ptr_linked_list_add);
universe@466 511 cu_add_test(suite, test_hl_ptr_linked_list_last);
universe@466 512 cu_add_test(suite, test_hl_ptr_linked_list_insert);
universe@466 513 cu_add_test(suite, test_hl_ptr_linked_list_remove);
universe@466 514 cu_add_test(suite, test_hl_ptr_linked_list_find);
universe@466 515
universe@411 516 CU_basic_set_mode(UCX_CU_BRM);
universe@411 517
universe@411 518 int exitcode;
universe@411 519 if (CU_basic_run_tests()) {
universe@411 520 exitcode = CU_get_error();
universe@411 521 } else {
universe@411 522 exitcode = CU_get_number_of_failures() == 0 ? 0 : 1;
universe@411 523 }
universe@411 524 CU_cleanup_registry();
universe@411 525 return exitcode;
universe@390 526 }

mercurial