test/array_tests.c

Mon, 30 Dec 2019 09:52:07 +0100

author
Mike Becker <universe@uap-core.de>
date
Mon, 30 Dec 2019 09:52:07 +0100
branch
feature/array
changeset 387
7e0f19fe23ff
parent 357
0f5732f0dc00
child 366
41a7cef34c19
permissions
-rw-r--r--

closes array branch towards ucx 2.1 release

olaf@9 1 /*
universe@103 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@103 3 *
universe@334 4 * Copyright 2019 Mike Becker, Olaf Wintermann All rights reserved.
universe@103 5 *
universe@103 6 * Redistribution and use in source and binary forms, with or without
universe@103 7 * modification, are permitted provided that the following conditions are met:
universe@103 8 *
universe@103 9 * 1. Redistributions of source code must retain the above copyright
universe@103 10 * notice, this list of conditions and the following disclaimer.
universe@103 11 *
universe@103 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@103 13 * notice, this list of conditions and the following disclaimer in the
universe@103 14 * documentation and/or other materials provided with the distribution.
universe@103 15 *
universe@103 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@103 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@103 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@103 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@103 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@103 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@103 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@103 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@103 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@103 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@103 26 * POSSIBILITY OF SUCH DAMAGE.
olaf@9 27 */
olaf@9 28
universe@334 29 #include "array_tests.h"
universe@251 30 #include <ucx/utils.h>
olaf@9 31
universe@356 32 UCX_TEST(test_ucx_array_destroy) {
universe@356 33 UcxArray array;
universe@356 34 ucx_array_init(&array, 16, sizeof(int));
universe@334 35
universe@334 36 UCX_TEST_BEGIN
universe@353 37 ucx_array_destroy(&array);
universe@356 38 UCX_TEST_ASSERT(array.data == NULL, "data pointer not NULL after destroy");
universe@356 39 UCX_TEST_ASSERT(array.size == 0, "size not zero after destroy");
universe@356 40 UCX_TEST_ASSERT(array.capacity == 0, "capacity not zero after destroy");
universe@334 41 UCX_TEST_ASSERT(array.allocator == ucx_default_allocator(),
universe@356 42 "allocator corrupted during destroy");
universe@334 43 UCX_TEST_END
universe@334 44 }
universe@334 45
universe@334 46 UCX_TEST(test_ucx_array_new) {
universe@356 47 UcxArray* array = ucx_array_new(16, 47);
universe@334 48
universe@334 49 UCX_TEST_BEGIN
universe@356 50 UCX_TEST_ASSERT(array->data, "no memory allocated");
universe@356 51 UCX_TEST_ASSERT(array->size == 0, "size not initially zero");
universe@356 52 UCX_TEST_ASSERT(array->capacity == 16, "capacity not as requested");
universe@356 53 UCX_TEST_ASSERT(array->elemsize == 47, "element size not as requested");
universe@356 54 UCX_TEST_ASSERT(array->allocator == ucx_default_allocator(),
universe@334 55 "array not using the default allocator");
universe@334 56 UCX_TEST_END
universe@356 57 ucx_array_free(array);
universe@334 58 }
universe@334 59
universe@354 60 UCX_TEST(test_ucx_array_append_from) {
universe@356 61 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@342 62 int *elements;
universe@334 63
universe@334 64 int x = 42;
universe@356 65 ucx_array_append_from(array, &x, 1);
universe@33 66 UCX_TEST_BEGIN
universe@27 67
universe@356 68 elements = array->data;
universe@342 69 UCX_TEST_ASSERT(elements[0] == 42, "failed");
universe@27 70
universe@354 71 int y[2] = {13, 37};
universe@356 72 ucx_array_append_from(array, y, 2);
universe@27 73
universe@356 74 elements = array->data;
universe@356 75 UCX_TEST_ASSERT(array->size == 3, "incorrect size after append");
universe@342 76 UCX_TEST_ASSERT(elements[1] == 13, "failed");
universe@354 77 UCX_TEST_ASSERT(elements[2] == 37, "failed");
universe@342 78 UCX_TEST_ASSERT(elements[0] == 42,
universe@334 79 "append corrupted previously inserted data");
universe@334 80
universe@356 81 ucx_array_append_from(array, NULL, 2);
universe@334 82
universe@356 83 elements = array->data;
universe@356 84 UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL append");
universe@354 85 UCX_TEST_ASSERT(elements[3] == 0, "element is not zeroed");
universe@354 86 UCX_TEST_ASSERT(elements[4] == 0, "element is not zeroed");
universe@342 87 UCX_TEST_ASSERT(elements[0] == 42,
universe@334 88 "NULL append corrupted previously inserted data");
universe@342 89 UCX_TEST_ASSERT(elements[1] == 13,
universe@334 90 "NULL append corrupted previously inserted data");
universe@354 91 UCX_TEST_ASSERT(elements[2] == 37,
universe@354 92 "NULL append corrupted previously inserted data");
universe@354 93
universe@354 94 UCX_TEST_END
universe@354 95
universe@356 96 ucx_array_free(array);
universe@354 97 }
universe@354 98
universe@354 99 UCX_TEST(test_ucx_array_prepend_from) {
universe@354 100 int *elems;
universe@356 101 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@354 102
universe@354 103 int x = 42;
universe@356 104 ucx_array_prepend_from(array, &x, 1);
universe@354 105 UCX_TEST_BEGIN
universe@354 106
universe@356 107 elems = array->data;
universe@354 108 UCX_TEST_ASSERT(elems[0] == 42, "failed");
universe@354 109
universe@354 110 int y[2] = {13, 37};
universe@356 111 ucx_array_prepend_from(array, y, 2);
universe@354 112
universe@356 113 elems = array->data;
universe@356 114 UCX_TEST_ASSERT(array->size == 3, "incorrect size after prepend");
universe@354 115 UCX_TEST_ASSERT(elems[0] == 13, "failed");
universe@354 116 UCX_TEST_ASSERT(elems[1] == 37, "failed");
universe@354 117 UCX_TEST_ASSERT(elems[2] == 42,
universe@354 118 "prepend corrupted previously inserted data");
universe@354 119
universe@356 120 ucx_array_prepend_from(array, NULL, 2);
universe@354 121
universe@356 122 elems = array->data;
universe@356 123 UCX_TEST_ASSERT(array->size == 5, "incorrect size after NULL prepend");
universe@354 124 UCX_TEST_ASSERT(elems[0] == 0, "element is not zeroed");
universe@354 125 UCX_TEST_ASSERT(elems[1] == 0, "element is not zeroed");
universe@354 126 UCX_TEST_ASSERT(elems[2] == 13,
universe@354 127 "NULL prepend corrupted previously inserted data");
universe@354 128 UCX_TEST_ASSERT(elems[3] == 37,
universe@354 129 "NULL prepend corrupted previously inserted data");
universe@354 130 UCX_TEST_ASSERT(elems[4] == 42,
universe@354 131 "NULL prepend corrupted previously inserted data");
universe@354 132
universe@354 133 UCX_TEST_END
universe@354 134
universe@356 135 ucx_array_free(array);
universe@354 136 }
universe@354 137
universe@354 138 UCX_TEST(test_ucx_array_set_from) {
universe@354 139 int *elems;
universe@356 140 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@354 141
universe@354 142 int x = 42;
universe@354 143
universe@354 144 UCX_TEST_BEGIN
universe@354 145
universe@356 146 ucx_array_set_from(array, 7, &x, 1);
universe@354 147
universe@356 148 elems = array->data;
universe@354 149 UCX_TEST_ASSERT(elems[7] == 42, "failed");
universe@356 150 UCX_TEST_ASSERT(array->size >= 8, "array not resized on set");
universe@356 151 UCX_TEST_ASSERT(array->capacity == 16, "capacity changed unnecessarily");
universe@354 152
universe@354 153 int y[2] = {13, 37};
universe@356 154 ucx_array_set_from(array, 27, y, 2);
universe@354 155
universe@356 156 elems = array->data;
universe@354 157 UCX_TEST_ASSERT(elems[27] == 13, "failed");
universe@354 158 UCX_TEST_ASSERT(elems[28] == 37, "failed");
universe@356 159 UCX_TEST_ASSERT(array->size == 29, "array not resized on set");
universe@356 160 UCX_TEST_ASSERT(array->capacity == 32, "capacity not grown");
universe@354 161
universe@356 162 ucx_array_set_from(array, 7, NULL, 2);
universe@354 163
universe@356 164 elems = array->data;
universe@354 165 UCX_TEST_ASSERT(elems[7] == 0, "not zeroed on NULL set");
universe@354 166 UCX_TEST_ASSERT(elems[8] == 0, "not zeroed on NULL set");
universe@354 167
universe@354 168 UCX_TEST_END
universe@354 169
universe@356 170 ucx_array_free(array);
universe@354 171 }
universe@354 172
universe@354 173 UCX_TEST(test_ucx_array_append) {
universe@356 174 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@354 175 int *elements;
universe@354 176
universe@356 177 ucx_array_append(array, 42);
universe@354 178 UCX_TEST_BEGIN
universe@354 179
universe@356 180 elements = array->data;
universe@354 181 UCX_TEST_ASSERT(elements[0] == 42, "failed");
universe@354 182
universe@356 183 ucx_array_append(array, 13);
universe@356 184 ucx_array_append(array, 37);
universe@354 185
universe@356 186 elements = array->data;
universe@356 187 UCX_TEST_ASSERT(array->size == 3, "incorrect size after append");
universe@354 188 UCX_TEST_ASSERT(elements[1] == 13, "failed");
universe@354 189 UCX_TEST_ASSERT(elements[2] == 37, "failed");
universe@354 190 UCX_TEST_ASSERT(elements[0] == 42,
universe@354 191 "append corrupted previously inserted data");
universe@334 192
universe@33 193 UCX_TEST_END
universe@27 194
universe@356 195 ucx_array_destroy(array);
universe@24 196 }
universe@24 197
universe@334 198 UCX_TEST(test_ucx_array_prepend) {
universe@342 199 int *elems;
universe@356 200 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@334 201
universe@356 202 ucx_array_prepend(array, 42);
universe@33 203 UCX_TEST_BEGIN
universe@27 204
universe@356 205 elems = array->data;
universe@342 206 UCX_TEST_ASSERT(elems[0] == 42, "failed");
universe@334 207
universe@356 208 ucx_array_prepend(array, 37);
universe@356 209 ucx_array_prepend(array, 13);
universe@334 210
universe@356 211 elems = array->data;
universe@356 212 UCX_TEST_ASSERT(array->size == 3, "incorrect size after prepend");
universe@342 213 UCX_TEST_ASSERT(elems[0] == 13, "failed");
universe@354 214 UCX_TEST_ASSERT(elems[1] == 37, "failed");
universe@354 215 UCX_TEST_ASSERT(elems[2] == 42,
universe@334 216 "prepend corrupted previously inserted data");
universe@334 217
universe@33 218 UCX_TEST_END
universe@334 219
universe@356 220 ucx_array_free(array);
universe@18 221 }
universe@18 222
universe@337 223 UCX_TEST(test_ucx_array_set) {
universe@342 224 int *elems;
universe@356 225 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@337 226
universe@337 227 UCX_TEST_BEGIN
universe@337 228
universe@356 229 ucx_array_set(array, 7, 42);
universe@342 230
universe@356 231 elems = array->data;
universe@342 232 UCX_TEST_ASSERT(elems[7] == 42, "failed");
universe@356 233 UCX_TEST_ASSERT(array->size == 8, "array not resized on set");
universe@356 234 UCX_TEST_ASSERT(array->capacity == 16, "capacity changed unnecessarily");
universe@337 235
universe@356 236 ucx_array_set(array, 27, 13);
universe@356 237 ucx_array_set(array, 28, 37);
universe@337 238
universe@356 239 elems = array->data;
universe@342 240 UCX_TEST_ASSERT(elems[27] == 13, "failed");
universe@354 241 UCX_TEST_ASSERT(elems[28] == 37, "failed");
universe@356 242 UCX_TEST_ASSERT(array->size == 29, "array not resized on set");
universe@356 243 UCX_TEST_ASSERT(array->capacity == 32, "capacity not grown");
universe@354 244
universe@337 245 UCX_TEST_END
universe@337 246
universe@356 247 ucx_array_free(array);
universe@337 248 }
universe@337 249
universe@334 250 UCX_TEST(test_ucx_array_equals) {
universe@356 251 UcxArray *a1 = ucx_array_new(16, sizeof(int32_t));
universe@356 252 UcxArray *a2 = ucx_array_new(16, sizeof(int32_t));
universe@356 253 UcxArray *a3 = ucx_array_new(16, sizeof(int64_t));
universe@356 254 UcxArray *a4 = ucx_array_new(16, sizeof(int32_t));
universe@27 255
universe@350 256 int32_t *intelems;
universe@350 257 int64_t *longintelems;
universe@342 258
universe@356 259 a1->size = 5;
universe@356 260 intelems = a1->data;
universe@342 261 intelems[0] = 47;
universe@342 262 intelems[1] = 11;
universe@342 263 intelems[2] = 0;
universe@342 264 intelems[3] = 8;
universe@342 265 intelems[4] = 15;
universe@356 266 a2->size = 5;
universe@356 267 intelems = a2->data;
universe@342 268 intelems[0] = 47;
universe@342 269 intelems[1] = 11;
universe@342 270 intelems[2] = 0;
universe@342 271 intelems[3] = 8;
universe@342 272 intelems[4] = 15;
universe@356 273 a3->size = 5;
universe@356 274 longintelems = a3->data;
universe@342 275 longintelems[0] = 47;
universe@342 276 longintelems[1] = 11;
universe@342 277 longintelems[2] = 0;
universe@342 278 longintelems[3] = 8;
universe@342 279 longintelems[4] = 15;
universe@356 280 a4->size = 5;
universe@356 281 intelems = a4->data;
universe@342 282 intelems[0] = 47;
universe@342 283 intelems[1] = 11;
universe@342 284 intelems[2] = -6;
universe@342 285 intelems[3] = 8;
universe@342 286 intelems[4] = 15;
universe@27 287
universe@123 288 UCX_TEST_BEGIN
universe@123 289
universe@350 290 UCX_TEST_ASSERT(ucx_array_equals(a1, a2, ucx_cmp_int32, NULL), "failed");
universe@350 291 UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, ucx_cmp_int32, NULL), "failed");
universe@350 292 UCX_TEST_ASSERT(!ucx_array_equals(a4, a1, ucx_cmp_int32, NULL), "failed");
universe@350 293 UCX_TEST_ASSERT(!ucx_array_equals(a1, a3, ucx_cmp_int64, NULL),
universe@336 294 "comparing arrays of different element size shall fail");
universe@350 295 UCX_TEST_ASSERT(!ucx_array_equals(a3, a1, ucx_cmp_int64, NULL),
universe@336 296 "comparing arrays of different element size shall fail");
universe@334 297
universe@336 298 UCX_TEST_ASSERT(ucx_array_equals(a1, a2, NULL, NULL),
universe@334 299 "compare using memcmp() failed");
universe@336 300 UCX_TEST_ASSERT(!ucx_array_equals(a1, a4, NULL, NULL),
universe@334 301 "compare using memcmp() failed");
universe@27 302
universe@33 303 UCX_TEST_END
universe@356 304 ucx_array_free(a1);
universe@356 305 ucx_array_free(a2);
universe@356 306 ucx_array_free(a3);
universe@356 307 ucx_array_free(a4);
olaf@9 308 }
olaf@11 309
universe@334 310 UCX_TEST(test_ucx_array_concat) {
universe@356 311 UcxArray *a1 = ucx_array_new(16, sizeof(int));
universe@356 312 UcxArray *a2 = ucx_array_new(16, sizeof(int));
universe@342 313 int *elems;
universe@334 314
universe@356 315 a1->size = 2;
universe@356 316 elems = a1->data;
universe@342 317 elems[0] = 47;
universe@342 318 elems[1] = 11;
universe@356 319 a2->size = 3;
universe@356 320 elems = a2->data;
universe@342 321 elems[0] = 0;
universe@342 322 elems[1] = 8;
universe@342 323 elems[2] = 15;
universe@27 324
universe@123 325 UCX_TEST_BEGIN
universe@123 326
universe@356 327 UCX_TEST_ASSERT(!ucx_array_concat(a1, a2), "failed");
universe@356 328 UCX_TEST_ASSERT(a1->size == 5, "failed");
universe@356 329 elems = a1->data;
universe@342 330 UCX_TEST_ASSERT(elems[0] == 47, "failed");
universe@342 331 UCX_TEST_ASSERT(elems[1] == 11, "failed");
universe@342 332 UCX_TEST_ASSERT(elems[2] == 0, "failed");
universe@342 333 UCX_TEST_ASSERT(elems[3] == 8, "failed");
universe@342 334 UCX_TEST_ASSERT(elems[4] == 15, "failed");
universe@27 335
universe@356 336 a1->elemsize *= 2;
universe@356 337 UCX_TEST_ASSERT(ucx_array_concat(a1, a2),
universe@334 338 "arrays of different element size must not be concatenated");
universe@356 339 UCX_TEST_ASSERT(a1->size == 5,
universe@334 340 "arrays of different element size must not be concatenated");
universe@27 341
universe@33 342 UCX_TEST_END
universe@356 343 ucx_array_free(a1);
universe@356 344 ucx_array_free(a2);
universe@27 345 }
universe@27 346
universe@344 347 UCX_TEST(test_ucx_array_at) {
universe@356 348 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@344 349
universe@354 350 int x[3] = {42, 13, 5};
universe@356 351 ucx_array_append_from(array, x, 3);
universe@344 352
universe@344 353 UCX_TEST_BEGIN
universe@344 354
universe@344 355 UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 13, "failed");
universe@344 356 *(int*)ucx_array_at(array, 1) = 80;
universe@344 357 UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 1) == 80, "assignment failed");
universe@344 358
universe@344 359 UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 0) == 42, "corrupted data");
universe@344 360 UCX_TEST_ASSERT(*(int*)ucx_array_at(array, 2) == 5, "corrupted data");
universe@344 361
universe@344 362 UCX_TEST_END
universe@344 363
universe@356 364 ucx_array_free(array);
universe@344 365 }
universe@344 366
universe@334 367 UCX_TEST(test_ucx_array_find) {
universe@356 368 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@342 369 int *elems;
universe@334 370
universe@356 371 array->size = 5;
universe@356 372 elems = array->data;
universe@342 373 elems[0] = 47;
universe@342 374 elems[1] = 11;
universe@342 375 elems[2] = 0;
universe@342 376 elems[3] = 8;
universe@342 377 elems[4] = 15;
universe@334 378
universe@334 379 int x = 8;
universe@334 380 int y = 90;
universe@27 381
universe@123 382 UCX_TEST_BEGIN
universe@123 383
universe@334 384 UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,ucx_cmp_int,NULL) == 3,
universe@334 385 "doesn't find element");
universe@334 386 UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,ucx_cmp_int,NULL) == 5,
universe@334 387 "finds non-existing element");
universe@27 388
universe@334 389 UCX_TEST_ASSERT(ucx_array_find(array,(void*)&x,NULL,NULL) == 3,
universe@334 390 "failed using memcmp()");
universe@334 391 UCX_TEST_ASSERT(ucx_array_find(array,(void*)&y,NULL,NULL) == 5,
universe@334 392 "failed using memcmp()");
universe@27 393
universe@33 394 UCX_TEST_END
universe@356 395 ucx_array_free(array);
universe@27 396 }
universe@27 397
universe@334 398 UCX_TEST(test_ucx_array_contains) {
universe@356 399 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@342 400 int *elems;
universe@334 401
universe@356 402 array->size = 5;
universe@356 403 elems = array->data;
universe@342 404 elems[0] = 47;
universe@342 405 elems[1] = 11;
universe@342 406 elems[2] = 0;
universe@342 407 elems[3] = 8;
universe@342 408 elems[4] = 15;
universe@334 409
universe@334 410 int x = 8;
universe@334 411 int y = 90;
universe@123 412
universe@123 413 UCX_TEST_BEGIN
universe@123 414
universe@334 415 UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,ucx_cmp_int,NULL),
universe@334 416 "false negative");
universe@334 417 UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,ucx_cmp_int,NULL),
universe@334 418 "false positive");
universe@123 419
universe@334 420 UCX_TEST_ASSERT(ucx_array_contains(array,(void*)&x,NULL,NULL),
universe@334 421 "false negative using memcmp()");
universe@334 422 UCX_TEST_ASSERT(!ucx_array_contains(array,(void*)&y,NULL,NULL),
universe@334 423 "false positive using memcmp()");
universe@123 424
universe@123 425 UCX_TEST_END
universe@356 426 ucx_array_free(array);
universe@123 427 }
universe@123 428
universe@334 429 UCX_TEST(test_ucx_array_remove) {
universe@356 430 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@342 431 int *elems;
universe@334 432
universe@356 433 array->size = 5;
universe@356 434 elems = array->data;
universe@342 435 elems[0] = 47;
universe@342 436 elems[1] = 11;
universe@342 437 elems[2] = 0;
universe@342 438 elems[3] = 8;
universe@342 439 elems[4] = 15;
universe@334 440
universe@334 441 UCX_TEST_BEGIN
universe@334 442
universe@356 443 ucx_array_remove(array, 2);
universe@356 444 elems = array->data;
universe@334 445 UCX_TEST_ASSERT(
universe@342 446 elems[0] == 47 &&
universe@342 447 elems[1] == 11 &&
universe@342 448 elems[2] == 8 &&
universe@342 449 elems[3] == 15,
universe@334 450 "wrong contents after remove");
universe@356 451 UCX_TEST_ASSERT(array->size == 4, "wrong size after remove");
universe@334 452
universe@356 453 ucx_array_remove_fast(array, 1);
universe@356 454 elems = array->data;
universe@334 455 UCX_TEST_ASSERT(
universe@342 456 elems[0] == 47 &&
universe@342 457 elems[1] == 15 &&
universe@342 458 elems[2] == 8,
universe@334 459 "wrong contents after fast remove");
universe@356 460 UCX_TEST_ASSERT(array->size == 3, "wrong size after fast remove");
universe@334 461
universe@334 462 UCX_TEST_END
universe@356 463 ucx_array_free(array);
universe@334 464 }
universe@334 465
universe@334 466 UCX_TEST(test_ucx_array_clone) {
universe@356 467 UcxArray array;
universe@356 468 UcxArray copy;
universe@356 469 ucx_array_init(&array, 16, sizeof(int));
universe@357 470 ucx_array_init(&copy, 4, 2*sizeof(double));
universe@342 471 int *elems;
universe@334 472
universe@334 473 array.size = 5;
universe@342 474 elems = array.data;
universe@342 475 elems[0] = 47;
universe@342 476 elems[1] = 11;
universe@342 477 elems[2] = 0;
universe@342 478 elems[3] = 8;
universe@342 479 elems[4] = 15;
universe@334 480
universe@356 481 ucx_array_clone(&copy, &array);
universe@334 482 UCX_TEST_BEGIN
universe@334 483
universe@334 484 UCX_TEST_ASSERT(array.data != copy.data, "no true copy");
universe@334 485 UCX_TEST_ASSERT(array.size == copy.size, "size mismatch");
universe@334 486 UCX_TEST_ASSERT(array.capacity == copy.capacity, "capacity mismatch");
universe@334 487 UCX_TEST_ASSERT(array.elemsize == copy.elemsize, "element size mismatch");
universe@334 488 UCX_TEST_ASSERT(array.allocator == copy.allocator, "allocator mismatch");
universe@356 489 UCX_TEST_ASSERT(ucx_array_equals(&array, &copy, ucx_cmp_int, NULL),
universe@356 490 "contents do not match after clone");
universe@334 491
universe@334 492 UCX_TEST_END
universe@334 493
universe@353 494 ucx_array_destroy(&array);
universe@353 495 ucx_array_destroy(&copy);
universe@334 496 }
universe@334 497
universe@342 498 static int ucx_cmp_int_reverse(const void* x, const void* y, void* data) {
universe@342 499 return -ucx_cmp_int(x,y,data);
universe@342 500 }
universe@342 501
universe@334 502 UCX_TEST(test_ucx_array_sort) {
universe@342 503 int *elems;
universe@342 504
universe@356 505 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@356 506 array->size = 5;
universe@356 507 elems = array->data;
universe@342 508 elems[0] = 47;
universe@342 509 elems[1] = 11;
universe@342 510 elems[2] = 0;
universe@342 511 elems[3] = 8;
universe@342 512 elems[4] = 15;
universe@334 513
universe@356 514 UcxArray *expected = ucx_array_new(16, sizeof(int));
universe@356 515 expected->size = 5;
universe@356 516 elems = expected->data;
universe@342 517 elems[0] = 0;
universe@342 518 elems[1] = 8;
universe@342 519 elems[2] = 11;
universe@342 520 elems[3] = 15;
universe@342 521 elems[4] = 47;
universe@342 522
universe@356 523 UcxArray *expectedrev = ucx_array_new(16, sizeof(int));
universe@356 524 expectedrev->size = 5;
universe@356 525 elems = expectedrev->data;
universe@342 526 elems[0] = 47;
universe@342 527 elems[1] = 15;
universe@342 528 elems[2] = 11;
universe@342 529 elems[3] = 8;
universe@342 530 elems[4] = 0;
universe@334 531
universe@334 532
universe@334 533 UCX_TEST_BEGIN
universe@356 534 void* original_ptr = array->data;
universe@336 535 ucx_array_sort(array, ucx_cmp_int, NULL);
universe@336 536 UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL), "failed");
universe@356 537 UCX_TEST_ASSERT(array->size == 5, "size corrupted");
universe@356 538 UCX_TEST_ASSERT(array->data == original_ptr, "shall not reallocate");
universe@342 539
universe@342 540 ucx_array_sort(array, ucx_cmp_int_reverse, NULL);
universe@342 541 UCX_TEST_ASSERT(ucx_array_equals(array, expectedrev, NULL, NULL), "failed");
universe@342 542
universe@356 543 ucx_array_reserve(array, 32);
universe@356 544 ucx_array_reserve(expected, 32);
universe@356 545 array->size = expected->size = 32;
universe@336 546 for (size_t i = 0 ; i < 32 ; i++) {
universe@356 547 ((int*)array->data)[i]= ((i%2==0)?-1:1) * ((int) i);
universe@356 548 ((int*)expected->data)[i] = (-30+2*i) - (i > 15 ? 1 : 0);
universe@336 549 }
universe@336 550
universe@342 551 /* dummy third argument to trigger a possible fallback for qsort_s */
universe@356 552 ucx_array_sort(array, ucx_cmp_int, array->data);
universe@336 553 UCX_TEST_ASSERT(ucx_array_equals(array, expected, NULL, NULL),
universe@336 554 "failed for bigger arrays");
universe@334 555 UCX_TEST_END
universe@334 556
universe@356 557 ucx_array_free(expectedrev);
universe@356 558 ucx_array_free(expected);
universe@356 559 ucx_array_free(array);
universe@334 560 }
universe@334 561
universe@334 562 UCX_TEST(test_ucx_array_autogrow) {
universe@342 563 int *elems;
universe@356 564 UcxArray *array = ucx_array_new(4, sizeof(int));
universe@356 565 array->size = 3;
universe@356 566 elems = array->data;
universe@342 567 elems[0] = 47;
universe@342 568 elems[1] = 11;
universe@334 569 int x = 5;
universe@123 570
universe@123 571 UCX_TEST_BEGIN
universe@334 572
universe@356 573 void* oldptr = array->data;
universe@123 574
universe@356 575 ucx_array_append(array, 5);
universe@356 576 UCX_TEST_ASSERT(array->capacity == 4 && array->data == oldptr,
universe@334 577 "array should not grow too early");
universe@356 578 ucx_array_append(array, 5);
universe@356 579 elems = array->data;
universe@356 580 UCX_TEST_ASSERT(array->capacity == 8, "array did not grow");
universe@356 581 UCX_TEST_ASSERT(array->size == 5, "incorrect size after grow");
universe@342 582 UCX_TEST_ASSERT(elems[3] == 5 && elems[4] == 5, "corrupt data");
universe@172 583
universe@123 584 UCX_TEST_END
universe@356 585 ucx_array_free(array);
universe@123 586 }
universe@123 587
universe@334 588 UCX_TEST(test_ucx_array_shrink) {
universe@356 589 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@356 590 array->size = 4;
universe@90 591
universe@123 592 UCX_TEST_BEGIN
universe@356 593 UCX_TEST_ASSERT(!ucx_array_shrink(array), "failed");
universe@356 594 UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after shrink");
universe@334 595 UCX_TEST_END
universe@356 596 ucx_array_free(array);
universe@334 597 }
universe@334 598
universe@334 599 UCX_TEST(test_ucx_array_resize) {
universe@356 600 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@356 601 array->size = 8;
universe@123 602
universe@334 603 UCX_TEST_BEGIN
universe@334 604
universe@356 605 UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
universe@356 606 UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after resize");
universe@356 607 UCX_TEST_ASSERT(array->size == 8, "incorrect size after resize");
universe@334 608
universe@356 609 UCX_TEST_ASSERT(!ucx_array_resize(array, 4), "failed");
universe@356 610 UCX_TEST_ASSERT(array->capacity == 4, "incorrect capacity after resize");
universe@356 611 UCX_TEST_ASSERT(array->size == 4, "incorrect size after resize");
universe@90 612
universe@90 613 UCX_TEST_END
universe@356 614 ucx_array_free(array);
universe@90 615 }
universe@90 616
universe@334 617 UCX_TEST(test_ucx_array_reserve) {
universe@356 618 UcxArray *array = ucx_array_new(16, sizeof(int));
universe@27 619
universe@123 620 UCX_TEST_BEGIN
universe@334 621
universe@356 622 UCX_TEST_ASSERT(!ucx_array_reserve(array, 4), "failed");
universe@356 623 UCX_TEST_ASSERT(array->capacity == 16, "reserve shall not shrink");
universe@334 624
universe@356 625 UCX_TEST_ASSERT(!ucx_array_resize(array, 32), "failed");
universe@356 626 UCX_TEST_ASSERT(array->capacity == 32, "incorrect capacity after reserve");
olaf@162 627
universe@33 628 UCX_TEST_END
universe@356 629 ucx_array_free(array);
universe@27 630 }
universe@355 631
universe@355 632 UCX_TEST(test_ucx_array_util_set) {
universe@355 633 size_t capacity = 16;
universe@355 634 int* array = malloc(sizeof(int)*capacity);
universe@355 635
universe@355 636 UCX_TEST_BEGIN
universe@355 637
universe@355 638 UCX_ARRAY_UTIL_SET(&array, &capacity, 7, 42);
universe@355 639
universe@355 640 UCX_TEST_ASSERT(array[7] == 42, "failed");
universe@355 641 UCX_TEST_ASSERT(capacity == 16, "capacity changed unnecessarily");
universe@355 642
universe@355 643 UCX_ARRAY_UTIL_SET(&array, &capacity, 37, 13);
universe@355 644 UCX_ARRAY_UTIL_SET(&array, &capacity, 38, 37);
universe@355 645
universe@355 646 UCX_TEST_ASSERT(array[37] == 13, "failed");
universe@355 647 UCX_TEST_ASSERT(array[38] == 37, "failed");
universe@355 648 UCX_TEST_ASSERT(capacity == 64, "capacity not grown");
universe@355 649
universe@355 650 UCX_TEST_END
universe@355 651
universe@355 652 free(array);
universe@355 653 }

mercurial