test/array_tests.c

Tue, 24 Sep 2019 20:16:00 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 24 Sep 2019 20:16:00 +0200
branch
feature/array
changeset 355
d315a068235a
parent 354
7fd13b9f8f60
child 356
77efe51c6c9a
permissions
-rw-r--r--

adds array utility functions for user defined arrays

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

mercurial