test/test_list.c

Tue, 28 Dec 2021 17:49:52 +0100

author
Mike Becker <universe@uap-core.de>
date
Tue, 28 Dec 2021 17:49:52 +0100
changeset 491
6d538177f746
parent 489
af6be1e123aa
child 492
188942a7308b
permissions
-rw-r--r--

fix missing cleanup in test_hl_linked_list_from_array

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@486 33 int cmp_int(
universe@486 34 int const *l,
universe@486 35 int const *r
universe@486 36 ) {
universe@412 37 int left = *l, right = *r;
universe@412 38 return left == right ? 0 : (left < right ? -1 : 1);
universe@412 39 }
universe@412 40
universe@486 41 struct node {
universe@486 42 struct node *next;
universe@486 43 struct node *prev;
universe@486 44 int data;
universe@486 45 };
universe@486 46
universe@486 47 #define nd(name) name = {0}
universe@486 48
universe@486 49 const ptrdiff_t loc_prev = offsetof(struct node, prev);
universe@486 50 const ptrdiff_t loc_next = offsetof(struct node, next);
universe@486 51 const ptrdiff_t loc_data = offsetof(struct node, data);
universe@486 52
universe@486 53 struct node *create_test_data(
universe@486 54 size_t n,
universe@489 55 int const data[]
universe@486 56 ) {
universe@486 57 if (n == 0) return NULL;
universe@486 58 struct node *begin = calloc(1, sizeof(struct node));
universe@486 59 struct node *prev = begin;
universe@486 60 if (data) begin->data = data[0];
universe@486 61 for (size_t i = 1; i < n; i++) {
universe@486 62 struct node *node = calloc(1, sizeof(struct node));
universe@486 63 if (data) node->data = data[i];
universe@486 64 cx_linked_list_link(prev, node, loc_prev, loc_next);
universe@486 65 prev = node;
universe@486 66 }
universe@486 67 return begin;
universe@486 68 }
universe@486 69
universe@486 70 void destroy_test_data(struct node *begin) {
universe@486 71 struct node *node = begin;
universe@486 72 while (node) {
universe@486 73 struct node *next = node->next;
universe@486 74 free(node);
universe@486 75 node = next;
universe@486 76 }
universe@486 77 }
universe@486 78
universe@482 79 void test_linked_list_link_unlink(void) {
universe@482 80
universe@486 81 struct node nd(a), nd(b), nd(c);
universe@482 82
universe@482 83 cx_linked_list_link(&a, &b, loc_prev, loc_next);
universe@482 84 CU_ASSERT_PTR_NULL(a.prev)
universe@482 85 CU_ASSERT_PTR_EQUAL(a.next, &b)
universe@482 86 CU_ASSERT_PTR_EQUAL(b.prev, &a)
universe@482 87 CU_ASSERT_PTR_NULL(b.next)
universe@482 88
universe@482 89 cx_linked_list_unlink(&a, &b, loc_prev, loc_next);
universe@482 90 CU_ASSERT_PTR_NULL(a.prev)
universe@482 91 CU_ASSERT_PTR_NULL(a.next)
universe@482 92 CU_ASSERT_PTR_NULL(b.prev)
universe@482 93 CU_ASSERT_PTR_NULL(b.next)
universe@482 94
universe@482 95 cx_linked_list_link(&b, &c, loc_prev, loc_next);
universe@482 96 cx_linked_list_link(&a, &b, loc_prev, loc_next);
universe@482 97 cx_linked_list_unlink(&b, &c, loc_prev, loc_next);
universe@482 98 CU_ASSERT_PTR_NULL(a.prev)
universe@482 99 CU_ASSERT_PTR_EQUAL(a.next, &b)
universe@482 100 CU_ASSERT_PTR_EQUAL(b.prev, &a)
universe@482 101 CU_ASSERT_PTR_NULL(b.next)
universe@482 102 CU_ASSERT_PTR_NULL(c.prev)
universe@482 103 CU_ASSERT_PTR_NULL(c.next)
universe@482 104 }
universe@482 105
universe@438 106 void test_linked_list_at(void) {
universe@486 107 struct node nd(a), nd(b), nd(c), nd(d);
universe@486 108 cx_linked_list_link(&a, &b, loc_prev, loc_next);
universe@486 109 cx_linked_list_link(&b, &c, loc_prev, loc_next);
universe@486 110 cx_linked_list_link(&c, &d, loc_prev, loc_next);
universe@438 111
universe@449 112 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 0), &a)
universe@449 113 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 1), &b)
universe@449 114 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 2), &c)
universe@449 115 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&a, 0, loc_next, 3), &d)
universe@449 116 CU_ASSERT_PTR_NULL(cx_linked_list_at(&a, 0, loc_next, 4))
universe@438 117
universe@449 118 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_prev, 0), &a)
universe@449 119 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 1), &b)
universe@449 120 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 2), &c)
universe@449 121 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&b, 1, loc_next, 3), &d)
universe@449 122 CU_ASSERT_PTR_NULL(cx_linked_list_at(&b, 1, loc_next, 4))
universe@438 123
universe@449 124 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&d, 3, loc_prev, 0), &a)
universe@449 125 CU_ASSERT_PTR_EQUAL(cx_linked_list_at(&d, 3, loc_prev, 1), &b)
universe@438 126 }
universe@438 127
universe@487 128 void test_linked_list_find(void) {
universe@487 129 int data[] = {2, 4, 6, 8};
universe@487 130 void *list = create_test_data(4, data);
universe@487 131 int s;
universe@487 132
universe@487 133 s = 2;
universe@487 134 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 135 false, (CxListComparator) cmp_int, &s), 0)
universe@487 136 s = 4;
universe@487 137 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 138 false, (CxListComparator) cmp_int, &s), 1)
universe@487 139 s = 6;
universe@487 140 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 141 false, (CxListComparator) cmp_int, &s), 2)
universe@487 142 s = 8;
universe@487 143 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 144 false, (CxListComparator) cmp_int, &s), 3)
universe@487 145 s = 10;
universe@487 146 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 147 false, (CxListComparator) cmp_int, &s), 4)
universe@487 148 s = -2;
universe@487 149 CU_ASSERT_EQUAL(cx_linked_list_find(list, loc_next, loc_data,
universe@487 150 false, (CxListComparator) cmp_int, &s), 4)
universe@487 151 }
universe@487 152
universe@486 153 void test_linked_list_compare(void) {
universe@486 154 int a[] = {2, 4, 6, 8};
universe@486 155 int b[] = {2, 4, 6};
universe@486 156 int c[] = {2, 4, 6, 9};
universe@486 157
universe@486 158 void *la = create_test_data(4, a);
universe@486 159 void *lb = create_test_data(3, b);
universe@486 160 void *lc = create_test_data(4, c);
universe@486 161
universe@486 162 CU_ASSERT_TRUE(0 < cx_linked_list_compare(la, lb, loc_next, loc_data,
universe@487 163 false, (CxListComparator) cmp_int)
universe@486 164 )
universe@486 165 CU_ASSERT_TRUE(0 > cx_linked_list_compare(lb, la, loc_next, loc_data,
universe@487 166 false, (CxListComparator) cmp_int)
universe@486 167 )
universe@486 168 CU_ASSERT_TRUE(0 < cx_linked_list_compare(lc, la, loc_next, loc_data,
universe@487 169 false, (CxListComparator) cmp_int)
universe@486 170 )
universe@486 171 CU_ASSERT_TRUE(0 > cx_linked_list_compare(la, lc, loc_next, loc_data,
universe@487 172 false, (CxListComparator) cmp_int)
universe@486 173 )
universe@486 174 CU_ASSERT_TRUE(0 == cx_linked_list_compare(la, la, loc_next, loc_data,
universe@487 175 false, (CxListComparator) cmp_int)
universe@486 176 )
universe@486 177
universe@486 178 destroy_test_data(la);
universe@486 179 destroy_test_data(lb);
universe@486 180 destroy_test_data(lc);
universe@486 181 }
universe@486 182
olaf@444 183 void test_linked_list_add(void) {
olaf@442 184 struct node nodes[4];
universe@486 185 void *begin, *end;
universe@449 186
olaf@442 187 // test with begin, end / prev, next
universe@449 188 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 189 begin = end = NULL;
universe@449 190
universe@453 191 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[0]);
universe@449 192 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 193 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 194 CU_ASSERT_PTR_NULL(nodes[0].prev)
universe@475 195 CU_ASSERT_PTR_NULL(nodes[0].next)
universe@449 196
universe@453 197 cx_linked_list_add(&begin, &end, loc_prev, loc_next, &nodes[1]);
universe@449 198 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 199 CU_ASSERT_PTR_EQUAL(end, &nodes[1])
universe@449 200 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 201 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0])
universe@449 202
olaf@442 203 // test with begin only / prev, next
universe@449 204 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 205 begin = end = NULL;
universe@449 206
universe@453 207 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[0]);
universe@449 208 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@453 209 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[1]);
universe@449 210 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 211 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 212 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0])
universe@449 213
universe@453 214 cx_linked_list_add(&begin, NULL, loc_prev, loc_next, &nodes[2]);
universe@449 215 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2])
universe@449 216 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1])
universe@449 217
universe@475 218 // test with end only / prev, next
universe@475 219 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 220 begin = end = NULL;
universe@475 221
universe@475 222 cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[0]);
universe@475 223 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 224 cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[1]);
universe@475 225 CU_ASSERT_PTR_EQUAL(end, &nodes[1])
universe@475 226 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@475 227 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[0])
universe@475 228
universe@475 229 cx_linked_list_add(NULL, &end, loc_prev, loc_next, &nodes[2]);
universe@475 230 CU_ASSERT_PTR_EQUAL(end, &nodes[2])
universe@475 231 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[2])
universe@475 232 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[1])
universe@475 233
olaf@442 234 // test with begin, end / next
universe@449 235 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 236 begin = end = NULL;
universe@449 237
universe@453 238 cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[0]);
universe@449 239 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@449 240 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@453 241 cx_linked_list_add(&begin, &end, -1, loc_next, &nodes[1]);
universe@449 242 CU_ASSERT_PTR_EQUAL(end, &nodes[1])
universe@449 243 CU_ASSERT_PTR_EQUAL(nodes[0].next, &nodes[1])
universe@449 244 CU_ASSERT_PTR_NULL(nodes[1].prev)
olaf@442 245 }
olaf@442 246
universe@475 247 void test_linked_list_prepend(void) {
universe@475 248 struct node nodes[4];
universe@486 249 void *begin, *end;
universe@475 250
universe@475 251 // test with begin, end / prev, next
universe@475 252 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 253 begin = end = NULL;
universe@475 254
universe@475 255 cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[0]);
universe@475 256 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@475 257 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 258 CU_ASSERT_PTR_NULL(nodes[0].prev)
universe@475 259 CU_ASSERT_PTR_NULL(nodes[0].next)
universe@475 260
universe@475 261 cx_linked_list_prepend(&begin, &end, loc_prev, loc_next, &nodes[1]);
universe@475 262 CU_ASSERT_PTR_EQUAL(begin, &nodes[1])
universe@475 263 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 264 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0])
universe@475 265 CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1])
universe@475 266
universe@475 267 // test with begin only / prev, next
universe@475 268 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 269 begin = end = NULL;
universe@475 270
universe@475 271 cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[0]);
universe@475 272 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@475 273 cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[1]);
universe@475 274 CU_ASSERT_PTR_EQUAL(begin, &nodes[1])
universe@475 275 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0])
universe@475 276 CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1])
universe@475 277
universe@475 278 cx_linked_list_prepend(&begin, NULL, loc_prev, loc_next, &nodes[2]);
universe@475 279 CU_ASSERT_PTR_EQUAL(begin, &nodes[2])
universe@475 280 CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1])
universe@475 281 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[2])
universe@475 282
universe@475 283 // test with end only / prev, next
universe@475 284 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 285 begin = end = NULL;
universe@475 286
universe@475 287 cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[0]);
universe@475 288 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 289 cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[1]);
universe@475 290 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 291 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0])
universe@475 292 CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[1])
universe@475 293
universe@475 294 cx_linked_list_prepend(NULL, &end, loc_prev, loc_next, &nodes[2]);
universe@475 295 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 296 CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1])
universe@475 297 CU_ASSERT_PTR_EQUAL(nodes[1].prev, &nodes[2])
universe@475 298
universe@475 299 // test with begin, end / next
universe@475 300 memset(nodes, 0, 4 * sizeof(struct node));
universe@486 301 begin = end = NULL;
universe@475 302
universe@475 303 cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[0]);
universe@475 304 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@475 305 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 306 cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[1]);
universe@475 307 cx_linked_list_prepend(&begin, &end, -1, loc_next, &nodes[2]);
universe@475 308 CU_ASSERT_PTR_EQUAL(begin, &nodes[2])
universe@475 309 CU_ASSERT_PTR_EQUAL(end, &nodes[0])
universe@475 310 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[0])
universe@475 311 CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[1])
universe@475 312 CU_ASSERT_PTR_NULL(nodes[1].prev)
universe@475 313 CU_ASSERT_PTR_NULL(nodes[0].prev)
universe@475 314 }
universe@475 315
universe@482 316 void test_linked_list_insert(void) {
universe@482 317 struct node nodes[4];
universe@482 318 void *begin, *end;
universe@482 319
universe@482 320 // insert mid list
universe@482 321 memset(nodes, 0, 4 * sizeof(struct node));
universe@482 322 begin = &nodes[0];
universe@482 323 end = &nodes[2];
universe@482 324
universe@482 325 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 326 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 327
universe@482 328 cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3]);
universe@482 329 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@482 330 CU_ASSERT_PTR_EQUAL(end, &nodes[2])
universe@482 331 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[3])
universe@482 332 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[3])
universe@482 333 CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[1])
universe@482 334 CU_ASSERT_PTR_EQUAL(nodes[3].next, &nodes[2])
universe@482 335
universe@482 336 // insert end
universe@482 337 memset(nodes, 0, 4 * sizeof(struct node));
universe@482 338 begin = &nodes[0];
universe@482 339 end = &nodes[2];
universe@482 340
universe@482 341 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 342 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 343
universe@482 344 cx_linked_list_insert(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3]);
universe@482 345 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@482 346 CU_ASSERT_PTR_EQUAL(end, &nodes[3])
universe@482 347 CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[3])
universe@482 348 CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[2])
universe@482 349 CU_ASSERT_PTR_NULL(nodes[3].next)
universe@482 350
universe@482 351 // insert begin
universe@482 352 memset(nodes, 0, 4 * sizeof(struct node));
universe@482 353 begin = &nodes[0];
universe@482 354 end = &nodes[2];
universe@482 355
universe@482 356 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 357 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 358
universe@482 359 cx_linked_list_insert(&begin, &end, loc_prev, loc_next, NULL, &nodes[3]);
universe@482 360 CU_ASSERT_PTR_EQUAL(begin, &nodes[3])
universe@482 361 CU_ASSERT_PTR_EQUAL(end, &nodes[2])
universe@482 362 CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[3])
universe@482 363 CU_ASSERT_PTR_NULL(nodes[3].prev)
universe@482 364 CU_ASSERT_PTR_EQUAL(nodes[3].next, &nodes[0])
universe@482 365 }
universe@482 366
universe@482 367 void test_linked_list_insert_chain(void) {
universe@482 368 struct node nodes[5];
universe@482 369 void *begin, *end;
universe@482 370
universe@482 371 // insert mid list
universe@482 372 memset(nodes, 0, 5 * sizeof(struct node));
universe@482 373 begin = &nodes[0];
universe@482 374 end = &nodes[2];
universe@482 375
universe@482 376 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 377 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 378 cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
universe@482 379
universe@482 380 cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[1], &nodes[3], NULL);
universe@482 381 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@482 382 CU_ASSERT_PTR_EQUAL(end, &nodes[2])
universe@482 383 CU_ASSERT_PTR_EQUAL(nodes[1].next, &nodes[3])
universe@482 384 CU_ASSERT_PTR_EQUAL(nodes[2].prev, &nodes[4])
universe@482 385 CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[1])
universe@482 386 CU_ASSERT_PTR_EQUAL(nodes[4].next, &nodes[2])
universe@482 387
universe@482 388 // insert end
universe@482 389 memset(nodes, 0, 5 * sizeof(struct node));
universe@482 390 begin = &nodes[0];
universe@482 391 end = &nodes[2];
universe@482 392
universe@482 393 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 394 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 395 cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
universe@482 396
universe@482 397 cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, &nodes[2], &nodes[3], NULL);
universe@482 398 CU_ASSERT_PTR_EQUAL(begin, &nodes[0])
universe@482 399 CU_ASSERT_PTR_EQUAL(end, &nodes[4])
universe@482 400 CU_ASSERT_PTR_EQUAL(nodes[2].next, &nodes[3])
universe@482 401 CU_ASSERT_PTR_EQUAL(nodes[3].prev, &nodes[2])
universe@482 402 CU_ASSERT_PTR_NULL(nodes[4].next)
universe@482 403
universe@482 404 // insert begin
universe@482 405 memset(nodes, 0, 5 * sizeof(struct node));
universe@482 406 begin = &nodes[0];
universe@482 407 end = &nodes[2];
universe@482 408
universe@482 409 cx_linked_list_link(&nodes[0], &nodes[1], loc_prev, loc_next);
universe@482 410 cx_linked_list_link(&nodes[1], &nodes[2], loc_prev, loc_next);
universe@482 411 cx_linked_list_link(&nodes[3], &nodes[4], loc_prev, loc_next);
universe@482 412
universe@482 413 cx_linked_list_insert_chain(&begin, &end, loc_prev, loc_next, NULL, &nodes[3], NULL);
universe@482 414 CU_ASSERT_PTR_EQUAL(begin, &nodes[3])
universe@482 415 CU_ASSERT_PTR_EQUAL(end, &nodes[2])
universe@482 416 CU_ASSERT_PTR_EQUAL(nodes[0].prev, &nodes[4])
universe@482 417 CU_ASSERT_PTR_NULL(nodes[3].prev)
universe@482 418 CU_ASSERT_PTR_EQUAL(nodes[4].next, &nodes[0])
universe@482 419 }
universe@482 420
universe@475 421 void test_linked_list_first(void) {
universe@486 422 struct node *begin = create_test_data(3, NULL);
universe@486 423 CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin, loc_prev), begin)
universe@486 424 CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin->next, loc_prev), begin)
universe@486 425 CU_ASSERT_PTR_EQUAL(cx_linked_list_first(begin->next->next, loc_prev), begin)
universe@486 426 destroy_test_data(begin);
universe@475 427 }
universe@475 428
universe@456 429 void test_linked_list_last(void) {
universe@486 430 struct node *begin = create_test_data(3, NULL);
universe@486 431 struct node *end = begin->next->next;
universe@486 432 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin, loc_next), end)
universe@486 433 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin->next, loc_next), end)
universe@486 434 CU_ASSERT_PTR_EQUAL(cx_linked_list_last(begin->next->next, loc_next), end)
universe@486 435 destroy_test_data(begin);
universe@456 436 }
universe@456 437
universe@473 438 void test_linked_list_prev(void) {
universe@486 439 struct node *begin = create_test_data(3, NULL);
universe@486 440 CU_ASSERT_PTR_NULL(cx_linked_list_prev(begin, loc_next, begin))
universe@486 441 CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(begin, loc_next, begin->next), begin)
universe@486 442 CU_ASSERT_PTR_EQUAL(cx_linked_list_prev(begin, loc_next, begin->next->next), begin->next)
universe@486 443 destroy_test_data(begin);
universe@473 444 }
universe@473 445
universe@473 446 void test_linked_list_remove(void) {
universe@486 447 void *begin, *end;
universe@473 448
universe@486 449 int data[] = {2, 4, 6};
universe@486 450 begin = create_test_data(3, data);
universe@486 451 struct node *first = begin;
universe@486 452 struct node *second = first->next;
universe@486 453 struct node *third = second->next;
universe@486 454 end = third;
universe@473 455
universe@486 456 cx_linked_list_remove(&begin, &end, loc_prev, loc_next, second);
universe@486 457 CU_ASSERT_PTR_EQUAL(begin, first)
universe@486 458 CU_ASSERT_PTR_EQUAL(end, third)
universe@486 459 CU_ASSERT_PTR_NULL(first->prev)
universe@486 460 CU_ASSERT_PTR_EQUAL(first->next, third)
universe@486 461 CU_ASSERT_PTR_EQUAL(third->prev, first)
universe@486 462 CU_ASSERT_PTR_NULL(third->next)
universe@473 463
universe@486 464 cx_linked_list_remove(&begin, &end, loc_prev, loc_next, third);
universe@486 465 CU_ASSERT_PTR_EQUAL(begin, first)
universe@486 466 CU_ASSERT_PTR_EQUAL(end, first)
universe@486 467 CU_ASSERT_PTR_NULL(first->prev)
universe@486 468 CU_ASSERT_PTR_NULL(first->next)
universe@473 469
universe@486 470 cx_linked_list_remove(&begin, &end, loc_prev, loc_next, first);
universe@473 471 CU_ASSERT_PTR_NULL(begin)
universe@473 472 CU_ASSERT_PTR_NULL(end)
universe@486 473
universe@486 474 free(first);
universe@486 475 free(second);
universe@486 476 free(third);
universe@473 477 }
universe@473 478
universe@468 479 void test_linked_list_size(void) {
universe@486 480 struct node *list;
universe@468 481
universe@486 482 CU_ASSERT_PTR_EQUAL(cx_linked_list_size(NULL, loc_next), 0)
universe@468 483
universe@486 484 list = create_test_data(5, NULL);
universe@486 485 CU_ASSERT_EQUAL(cx_linked_list_size(list, loc_next), 5)
universe@486 486 destroy_test_data(list);
universe@486 487
universe@486 488 list = create_test_data(13, NULL);
universe@486 489 CU_ASSERT_EQUAL(cx_linked_list_size(list, loc_next), 13)
universe@486 490 destroy_test_data(list);
universe@468 491 }
universe@468 492
universe@468 493 void test_linked_list_sort(void) {
universe@468 494 int expected[] = {
universe@468 495 14, 30, 151, 163, 227, 300, 315, 317, 363, 398, 417, 424, 438, 446, 508, 555, 605, 713, 716, 759, 761, 880,
universe@468 496 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 1707, 1734, 1771, 1874, 1894,
universe@468 497 1976, 2079, 2124, 2130, 2135, 2266, 2338, 2358, 2430, 2500, 2540, 2542, 2546, 2711, 2733, 2754, 2764, 2797,
universe@468 498 2888, 2900, 3020, 3053, 3109, 3244, 3275, 3302, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 3675, 3677,
universe@468 499 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681,
universe@468 500 4785, 4791, 4801, 4859, 4903, 4973
universe@468 501 };
universe@468 502 int scrambled[] = {
universe@468 503 759, 716, 880, 761, 2358, 2542, 2500, 2540, 2546, 2711, 2430, 1707, 1874, 1771, 1894, 1734, 1976, 2079,
universe@468 504 2124, 2130, 2135, 2266, 2338, 2733, 2754, 2764, 2797, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 2888,
universe@468 505 2900, 3020, 3053, 3109, 3244, 3275, 3302, 438, 446, 508, 555, 605, 713, 14, 30, 151, 163, 227, 300,
universe@468 506 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 315, 317, 363, 398, 417, 424,
universe@468 507 3675, 3677, 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4785, 4791, 4801, 4859, 4903, 4973,
universe@468 508 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
universe@468 509 };
universe@468 510
universe@486 511 void *begin = create_test_data(100, scrambled);
universe@486 512 void *end = cx_linked_list_last(begin, loc_next);
universe@468 513
universe@486 514 cx_linked_list_sort(&begin, &end, loc_prev, loc_next, loc_data,
universe@487 515 false, (CxListComparator) cmp_int);
universe@468 516
universe@468 517 struct node *check = begin;
universe@468 518 struct node *check_last = NULL;
universe@486 519 CU_ASSERT_PTR_NULL(check->prev)
universe@486 520 CU_ASSERT_EQUAL(check->data, expected[0])
universe@473 521 for (int i = 0; i < 100; i++) {
universe@468 522 CU_ASSERT_EQUAL(check->data, expected[i])
universe@468 523 CU_ASSERT_PTR_EQUAL(check->prev, check_last)
universe@468 524 if (i < 99) {
universe@468 525 CU_ASSERT_PTR_NOT_NULL(check->next)
universe@468 526 }
universe@468 527 check_last = check;
universe@468 528 check = check->next;
universe@468 529 }
universe@468 530 CU_ASSERT_PTR_NULL(check)
universe@486 531 CU_ASSERT_PTR_EQUAL(end, check_last)
universe@486 532
universe@486 533 destroy_test_data(begin);
universe@468 534 }
universe@468 535
universe@473 536 void test_linked_list_reverse(void) {
universe@486 537 void *begin, *end;
universe@473 538
universe@486 539 int data[] = {2, 4, 6, 8};
universe@486 540 int reversed[] = {8, 6, 4, 2};
universe@473 541
universe@486 542 void *list = create_test_data(4, data);
universe@486 543 void *expected = create_test_data(4, reversed);
universe@473 544
universe@486 545 begin = list;
universe@486 546 end = cx_linked_list_last(list, loc_next);
universe@473 547
universe@486 548 cx_linked_list_reverse(&begin, &end, loc_prev, loc_next);
universe@486 549 CU_ASSERT_PTR_EQUAL(end, list)
universe@486 550 CU_ASSERT_PTR_EQUAL(begin, cx_linked_list_first(end, loc_prev))
universe@486 551 CU_ASSERT_TRUE(0 == cx_linked_list_compare(begin, expected, loc_next, loc_data,
universe@486 552 0, (CxListComparator) cmp_int))
universe@473 553
universe@486 554 destroy_test_data(begin);
universe@486 555 destroy_test_data(expected);
universe@473 556 }
universe@456 557
universe@456 558 void test_hl_linked_list_create(void) {
universe@455 559 cxTestingAllocatorReset();
universe@455 560
universe@455 561 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@455 562
universe@455 563 CU_ASSERT_EQUAL(list->size, 0)
universe@455 564 CU_ASSERT_EQUAL(list->capacity, (size_t) -1)
universe@455 565 CU_ASSERT_PTR_EQUAL(list->allocator, cxTestingAllocator)
universe@455 566 CU_ASSERT_EQUAL(list->itemsize, sizeof(int))
universe@455 567 CU_ASSERT_PTR_EQUAL(list->cmpfunc, cmp_int)
universe@455 568
universe@455 569 cxLinkedListDestroy(list);
universe@455 570 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@455 571 }
universe@455 572
universe@488 573 void test_hl_linked_list_from_array(void) {
universe@488 574 cxTestingAllocatorReset();
universe@488 575
universe@488 576 int data[] = {2, 4, 5, 7, 10, 15};
universe@488 577
universe@488 578 CxList expected = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@488 579 for (int i = 0; i < 5; i++) cxListAdd(expected, &data[i]);
universe@488 580
universe@488 581 CxList list = cxLinkedListFromArray(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int), 5, data);
universe@488 582
universe@488 583 CU_ASSERT_TRUE(0 == cxListCompare(list, expected))
universe@491 584
universe@491 585 cxLinkedListDestroy(list);
universe@491 586 cxLinkedListDestroy(expected);
universe@491 587 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@488 588 }
universe@488 589
universe@459 590 void test_hl_linked_list_add(void) {
universe@459 591 cxTestingAllocatorReset();
universe@459 592
universe@459 593 int data;
universe@459 594 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 595
universe@459 596 data = 5;
universe@460 597 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 598 data = 47;
universe@460 599 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 600 data = 13;
universe@460 601 CU_ASSERT_EQUAL(cxListAdd(list, &data), 0)
universe@459 602
universe@459 603 CU_ASSERT_EQUAL(list->size, 3)
universe@459 604 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 605
universe@466 606 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 607 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 608 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@459 609
universe@459 610 cxLinkedListDestroy(list);
universe@459 611 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 612 }
universe@459 613
universe@459 614 void test_hl_linked_list_insert(void) {
universe@459 615 cxTestingAllocatorReset();
universe@459 616
universe@459 617 int data;
universe@459 618 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 619
universe@459 620 data = 5;
universe@460 621 CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &data), 0)
universe@459 622 CU_ASSERT_EQUAL(list->size, 0)
universe@460 623 CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
universe@459 624 CU_ASSERT_EQUAL(list->size, 1)
universe@459 625 data = 47;
universe@460 626 CU_ASSERT_EQUAL(cxListInsert(list, 0, &data), 0)
universe@459 627 CU_ASSERT_EQUAL(list->size, 2)
universe@459 628 data = 13;
universe@460 629 CU_ASSERT_EQUAL(cxListInsert(list, 1, &data), 0)
universe@459 630 CU_ASSERT_EQUAL(list->size, 3)
universe@459 631 data = 42;
universe@460 632 CU_ASSERT_EQUAL(cxListInsert(list, 3, &data), 0)
universe@459 633
universe@459 634 CU_ASSERT_EQUAL(list->size, 4)
universe@459 635 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 636
universe@466 637 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 638 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 639 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 5)
universe@466 640 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 3), 42)
universe@459 641
universe@459 642 cxLinkedListDestroy(list);
universe@459 643 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 644 }
universe@459 645
universe@459 646 void test_hl_linked_list_remove(void) {
universe@459 647 cxTestingAllocatorReset();
universe@459 648
universe@459 649 int data;
universe@459 650 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 651
universe@459 652 data = 5;
universe@460 653 cxListAdd(list, &data);
universe@459 654 data = 47;
universe@460 655 cxListAdd(list, &data);
universe@459 656 data = 42;
universe@460 657 cxListAdd(list, &data);
universe@459 658 data = 13;
universe@460 659 cxListAdd(list, &data);
universe@459 660
universe@459 661 CU_ASSERT_EQUAL(list->size, 4)
universe@459 662 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 663
universe@459 664 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 4), 0)
universe@459 665
universe@459 666 CU_ASSERT_EQUAL(cxListRemove(list, 2), 0)
universe@459 667 CU_ASSERT_EQUAL(list->size, 3)
universe@459 668 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 669 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 670 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 671 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@459 672
universe@459 673 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@459 674 CU_ASSERT_EQUAL(list->size, 2)
universe@459 675 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 676 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 677 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@459 678
universe@459 679 CU_ASSERT_EQUAL(cxListRemove(list, 1), 0)
universe@459 680 CU_ASSERT_EQUAL(list->size, 1)
universe@459 681 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 682 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@459 683
universe@459 684 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@459 685 CU_ASSERT_EQUAL(list->size, 0)
universe@459 686 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 687
universe@459 688 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 0), 0)
universe@459 689
universe@459 690 cxLinkedListDestroy(list);
universe@459 691 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 692 }
universe@459 693
universe@479 694 void test_hl_linked_list_at(void) {
universe@479 695 cxTestingAllocatorReset();
universe@479 696
universe@479 697 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@479 698
universe@479 699 int data;
universe@479 700 data = 5;
universe@479 701 cxListAdd(list, &data);
universe@479 702 data = 47;
universe@479 703 cxListAdd(list, &data);
universe@479 704 data = 13;
universe@479 705 cxListAdd(list, &data);
universe@479 706
universe@479 707 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 0), 5)
universe@479 708 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 1), 47)
universe@479 709 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 2), 13)
universe@479 710 CU_ASSERT_PTR_NULL(cxListAt(list, 3))
universe@479 711
universe@479 712 cxLinkedListDestroy(list);
universe@479 713 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@479 714 }
universe@479 715
universe@459 716 void test_hl_linked_list_find(void) {
universe@459 717 cxTestingAllocatorReset();
universe@459 718
universe@459 719 int data, criteria;
universe@459 720 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@459 721
universe@459 722 data = 5;
universe@460 723 cxListAdd(list, &data);
universe@459 724 data = 47;
universe@460 725 cxListAdd(list, &data);
universe@459 726 data = 13;
universe@460 727 cxListAdd(list, &data);
universe@459 728
universe@459 729 CU_ASSERT_EQUAL(list->size, 3)
universe@459 730 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@459 731
universe@459 732 criteria = 5;
universe@460 733 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
universe@459 734 criteria = 47;
universe@460 735 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@459 736 criteria = 13;
universe@460 737 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
universe@459 738 criteria = 9000;
universe@460 739 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@459 740 criteria = -5;
universe@460 741 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@459 742
universe@459 743 cxLinkedListDestroy(list);
universe@459 744 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@459 745 }
universe@459 746
universe@469 747 void test_hl_linked_list_sort(void) {
universe@469 748 int expected[] = {
universe@469 749 14, 30, 151, 163, 227, 300, 315, 317, 363, 398, 417, 424, 438, 446, 508, 555, 605, 713, 716, 759, 761, 880,
universe@469 750 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 1707, 1734, 1771, 1874, 1894,
universe@469 751 1976, 2079, 2124, 2130, 2135, 2266, 2338, 2358, 2430, 2500, 2540, 2542, 2546, 2711, 2733, 2754, 2764, 2797,
universe@469 752 2888, 2900, 3020, 3053, 3109, 3244, 3275, 3302, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 3675, 3677,
universe@469 753 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681,
universe@469 754 4785, 4791, 4801, 4859, 4903, 4973
universe@469 755 };
universe@469 756 int scrambled[] = {
universe@469 757 759, 716, 880, 761, 2358, 2542, 2500, 2540, 2546, 2711, 2430, 1707, 1874, 1771, 1894, 1734, 1976, 2079,
universe@469 758 2124, 2130, 2135, 2266, 2338, 2733, 2754, 2764, 2797, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 2888,
universe@469 759 2900, 3020, 3053, 3109, 3244, 3275, 3302, 438, 446, 508, 555, 605, 713, 14, 30, 151, 163, 227, 300,
universe@469 760 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 315, 317, 363, 398, 417, 424,
universe@469 761 3675, 3677, 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4785, 4791, 4801, 4859, 4903, 4973,
universe@469 762 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
universe@469 763 };
universe@469 764
universe@469 765 cxTestingAllocatorReset();
universe@469 766
universe@469 767 CxList list = cxLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int, sizeof(int));
universe@469 768
universe@473 769 for (int i = 0; i < 100; i++) {
universe@469 770 cxListAdd(list, &scrambled[i]);
universe@469 771 }
universe@469 772
universe@469 773 cxListSort(list);
universe@469 774
universe@473 775 for (int i = 0; i < 100; i++) {
universe@473 776 CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expected[i])
universe@469 777 }
universe@469 778
universe@469 779 cxLinkedListDestroy(list);
universe@469 780 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@469 781 }
universe@469 782
universe@466 783 void test_hl_ptr_linked_list_create(void) {
universe@466 784 cxTestingAllocatorReset();
universe@466 785
universe@466 786 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 787
universe@466 788 CU_ASSERT_EQUAL(list->size, 0)
universe@466 789 CU_ASSERT_EQUAL(list->capacity, (size_t) -1)
universe@466 790 CU_ASSERT_PTR_EQUAL(list->allocator, cxTestingAllocator)
universe@466 791 CU_ASSERT_EQUAL(list->itemsize, sizeof(void *))
universe@466 792 CU_ASSERT_PTR_EQUAL(list->cmpfunc, cmp_int)
universe@466 793
universe@466 794 cxLinkedListDestroy(list);
universe@466 795 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 796 }
universe@466 797
universe@466 798 void test_hl_ptr_linked_list_add(void) {
universe@466 799 cxTestingAllocatorReset();
universe@466 800
universe@466 801 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 802
universe@466 803 int a = 5, b = 47, c = 13;
universe@466 804
universe@466 805 CU_ASSERT_EQUAL(cxListAdd(list, &a), 0)
universe@466 806 CU_ASSERT_EQUAL(cxListAdd(list, &b), 0)
universe@466 807 CU_ASSERT_EQUAL(cxListAdd(list, &c), 0)
universe@466 808
universe@466 809 CU_ASSERT_EQUAL(list->size, 3)
universe@466 810 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 811
universe@466 812 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 813 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 814 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@466 815
universe@466 816 a = 9;
universe@466 817 b = 10;
universe@466 818 c = 11;
universe@466 819
universe@466 820 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 9)
universe@466 821 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 10)
universe@466 822 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 11)
universe@466 823
universe@466 824 cxLinkedListDestroy(list);
universe@466 825 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 826 }
universe@466 827
universe@466 828 void test_hl_ptr_linked_list_insert(void) {
universe@466 829 cxTestingAllocatorReset();
universe@466 830
universe@466 831 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 832
universe@466 833 int a = 5, b = 47, c = 13, d = 42;
universe@466 834
universe@466 835 CU_ASSERT_NOT_EQUAL(cxListInsert(list, 1, &a), 0)
universe@466 836 CU_ASSERT_EQUAL(list->size, 0)
universe@466 837 CU_ASSERT_EQUAL(cxListInsert(list, 0, &a), 0)
universe@466 838 CU_ASSERT_EQUAL(list->size, 1)
universe@466 839 CU_ASSERT_EQUAL(cxListInsert(list, 0, &b), 0)
universe@466 840 CU_ASSERT_EQUAL(list->size, 2)
universe@466 841 CU_ASSERT_EQUAL(cxListInsert(list, 1, &c), 0)
universe@466 842 CU_ASSERT_EQUAL(list->size, 3)
universe@466 843 CU_ASSERT_EQUAL(cxListInsert(list, 3, &d), 0)
universe@466 844
universe@466 845 CU_ASSERT_EQUAL(list->size, 4)
universe@466 846 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 847
universe@466 848 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 849 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 850 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 5)
universe@466 851 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 3), 42)
universe@466 852
universe@466 853 cxLinkedListDestroy(list);
universe@466 854 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 855 }
universe@466 856
universe@466 857 void test_hl_ptr_linked_list_remove(void) {
universe@466 858 cxTestingAllocatorReset();
universe@466 859
universe@466 860 int a = 5, b = 47, c = 42, d = 13;
universe@466 861 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 862
universe@466 863 cxListAdd(list, &a);
universe@466 864 cxListAdd(list, &b);
universe@466 865 cxListAdd(list, &c);
universe@466 866 cxListAdd(list, &d);
universe@466 867
universe@466 868 CU_ASSERT_EQUAL(list->size, 4)
universe@466 869 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 870
universe@466 871 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 4), 0)
universe@466 872
universe@466 873 CU_ASSERT_EQUAL(cxListRemove(list, 2), 0)
universe@466 874 CU_ASSERT_EQUAL(list->size, 3)
universe@466 875 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 876 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 5)
universe@466 877 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 47)
universe@466 878 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 2), 13)
universe@466 879
universe@466 880 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@466 881 CU_ASSERT_EQUAL(list->size, 2)
universe@466 882 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 883 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 884 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 1), 13)
universe@466 885
universe@466 886 CU_ASSERT_EQUAL(cxListRemove(list, 1), 0)
universe@466 887 CU_ASSERT_EQUAL(list->size, 1)
universe@466 888 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 889 CU_ASSERT_EQUAL(*(int *) cxListAt(list, 0), 47)
universe@466 890
universe@466 891 CU_ASSERT_EQUAL(cxListRemove(list, 0), 0)
universe@466 892 CU_ASSERT_EQUAL(list->size, 0)
universe@466 893 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 894
universe@466 895 CU_ASSERT_NOT_EQUAL(cxListRemove(list, 0), 0)
universe@466 896
universe@466 897 cxLinkedListDestroy(list);
universe@466 898 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 899 }
universe@466 900
universe@479 901 void test_hl_ptr_linked_list_at(void) {
universe@479 902 cxTestingAllocatorReset();
universe@479 903
universe@479 904 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@479 905
universe@479 906 int a = 5, b = 47, c = 13;
universe@479 907 cxListAdd(list, &a);
universe@479 908 cxListAdd(list, &b);
universe@479 909 cxListAdd(list, &c);
universe@479 910
universe@479 911 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 0), 5)
universe@479 912 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 1), 47)
universe@479 913 CU_ASSERT_EQUAL(*(int*)cxListAt(list, 2), 13)
universe@479 914 CU_ASSERT_PTR_NULL(cxListAt(list, 3))
universe@479 915
universe@479 916 cxLinkedListDestroy(list);
universe@479 917 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@479 918 }
universe@479 919
universe@466 920 void test_hl_ptr_linked_list_find(void) {
universe@466 921 cxTestingAllocatorReset();
universe@466 922
universe@466 923 int a = 5, b = 47, c = 13, criteria;
universe@466 924 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@466 925
universe@466 926 cxListAdd(list, &a);
universe@466 927 cxListAdd(list, &b);
universe@466 928 cxListAdd(list, &c);
universe@466 929
universe@466 930 CU_ASSERT_EQUAL(list->size, 3)
universe@466 931 CU_ASSERT_TRUE(list->capacity >= list->size)
universe@466 932
universe@466 933 criteria = 5;
universe@466 934 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 0)
universe@466 935 criteria = 47;
universe@466 936 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@466 937 criteria = 13;
universe@466 938 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 2)
universe@466 939 criteria = 9000;
universe@466 940 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@466 941 criteria = -5;
universe@466 942 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 3)
universe@466 943 b = -5;
universe@466 944 CU_ASSERT_EQUAL(cxListFind(list, &criteria), 1)
universe@466 945
universe@466 946 cxLinkedListDestroy(list);
universe@466 947 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@466 948 }
universe@466 949
universe@469 950 void test_hl_ptr_linked_list_sort(void) {
universe@469 951 int expected[] = {
universe@469 952 14, 30, 151, 163, 227, 300, 315, 317, 363, 398, 417, 424, 438, 446, 508, 555, 605, 713, 716, 759, 761, 880,
universe@469 953 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 1707, 1734, 1771, 1874, 1894,
universe@469 954 1976, 2079, 2124, 2130, 2135, 2266, 2338, 2358, 2430, 2500, 2540, 2542, 2546, 2711, 2733, 2754, 2764, 2797,
universe@469 955 2888, 2900, 3020, 3053, 3109, 3244, 3275, 3302, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 3675, 3677,
universe@469 956 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681,
universe@469 957 4785, 4791, 4801, 4859, 4903, 4973
universe@469 958 };
universe@469 959 int scrambled[] = {
universe@469 960 759, 716, 880, 761, 2358, 2542, 2500, 2540, 2546, 2711, 2430, 1707, 1874, 1771, 1894, 1734, 1976, 2079,
universe@469 961 2124, 2130, 2135, 2266, 2338, 2733, 2754, 2764, 2797, 3362, 3363, 3364, 3441, 3515, 3539, 3579, 3655, 2888,
universe@469 962 2900, 3020, 3053, 3109, 3244, 3275, 3302, 438, 446, 508, 555, 605, 713, 14, 30, 151, 163, 227, 300,
universe@469 963 894, 1034, 1077, 1191, 1231, 1264, 1297, 1409, 1423, 1511, 1544, 1659, 1686, 315, 317, 363, 398, 417, 424,
universe@469 964 3675, 3677, 3718, 3724, 3757, 3866, 3896, 3906, 3941, 3984, 3994, 4785, 4791, 4801, 4859, 4903, 4973,
universe@469 965 4016, 4085, 4121, 4254, 4319, 4366, 4459, 4514, 4681
universe@469 966 };
universe@469 967
universe@469 968 cxTestingAllocatorReset();
universe@469 969
universe@469 970 CxList list = cxPointerLinkedListCreate(cxTestingAllocator, (CxListComparator) cmp_int);
universe@469 971
universe@473 972 for (int i = 0; i < 100; i++) {
universe@469 973 cxListAdd(list, &scrambled[i]);
universe@469 974 }
universe@469 975
universe@469 976 cxListSort(list);
universe@469 977
universe@473 978 for (int i = 0; i < 100; i++) {
universe@473 979 CU_ASSERT_EQUAL(*(int *) cxListAt(list, i), expected[i])
universe@469 980 }
universe@469 981
universe@469 982 cxLinkedListDestroy(list);
universe@469 983 CU_ASSERT_TRUE(cxTestingAllocatorVerify())
universe@469 984 }
universe@469 985
universe@390 986 int main() {
universe@411 987 CU_pSuite suite = NULL;
universe@449 988
universe@411 989 if (CUE_SUCCESS != CU_initialize_registry()) {
universe@411 990 return CU_get_error();
universe@411 991 }
universe@411 992
universe@459 993 suite = CU_add_suite("low level linked list", NULL, NULL);
universe@449 994
universe@482 995 cu_add_test(suite, test_linked_list_link_unlink);
universe@455 996 cu_add_test(suite, test_linked_list_at);
universe@487 997 cu_add_test(suite, test_linked_list_find);
universe@486 998 cu_add_test(suite, test_linked_list_compare);
universe@475 999 cu_add_test(suite, test_linked_list_prepend);
universe@455 1000 cu_add_test(suite, test_linked_list_add);
universe@482 1001 cu_add_test(suite, test_linked_list_insert);
universe@482 1002 cu_add_test(suite, test_linked_list_insert_chain);
universe@475 1003 cu_add_test(suite, test_linked_list_first);
universe@456 1004 cu_add_test(suite, test_linked_list_last);
universe@473 1005 cu_add_test(suite, test_linked_list_prev);
universe@473 1006 cu_add_test(suite, test_linked_list_remove);
universe@468 1007 cu_add_test(suite, test_linked_list_size);
universe@468 1008 cu_add_test(suite, test_linked_list_sort);
universe@473 1009 cu_add_test(suite, test_linked_list_reverse);
universe@455 1010
universe@459 1011 suite = CU_add_suite("high level linked list", NULL, NULL);
universe@455 1012
universe@456 1013 cu_add_test(suite, test_hl_linked_list_create);
universe@488 1014 cu_add_test(suite, test_hl_linked_list_from_array);
universe@456 1015 cu_add_test(suite, test_hl_linked_list_add);
universe@456 1016 cu_add_test(suite, test_hl_linked_list_insert);
universe@456 1017 cu_add_test(suite, test_hl_linked_list_remove);
universe@479 1018 cu_add_test(suite, test_hl_linked_list_at);
universe@459 1019 cu_add_test(suite, test_hl_linked_list_find);
universe@469 1020 cu_add_test(suite, test_hl_linked_list_sort);
universe@413 1021
universe@466 1022 suite = CU_add_suite("high level pointer linked list", NULL, NULL);
universe@466 1023
universe@466 1024 cu_add_test(suite, test_hl_ptr_linked_list_create);
universe@466 1025 cu_add_test(suite, test_hl_ptr_linked_list_add);
universe@466 1026 cu_add_test(suite, test_hl_ptr_linked_list_insert);
universe@466 1027 cu_add_test(suite, test_hl_ptr_linked_list_remove);
universe@479 1028 cu_add_test(suite, test_hl_ptr_linked_list_at);
universe@466 1029 cu_add_test(suite, test_hl_ptr_linked_list_find);
universe@469 1030 cu_add_test(suite, test_hl_ptr_linked_list_sort);
universe@466 1031
universe@411 1032 CU_basic_set_mode(UCX_CU_BRM);
universe@411 1033
universe@411 1034 int exitcode;
universe@411 1035 if (CU_basic_run_tests()) {
universe@411 1036 exitcode = CU_get_error();
universe@411 1037 } else {
universe@411 1038 exitcode = CU_get_number_of_failures() == 0 ? 0 : 1;
universe@411 1039 }
universe@411 1040 CU_cleanup_registry();
universe@411 1041 return exitcode;
universe@390 1042 }

mercurial