Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_array.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2014 Tobias Brunner
! 3: * HSR Hochschule fuer Technik Rapperswil
! 4: *
! 5: * Copyright (C) 2013 Martin Willi
! 6: * Copyright (C) 2013 revosec AG
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify it
! 9: * under the terms of the GNU General Public License as published by the
! 10: * Free Software Foundation; either version 2 of the License, or (at your
! 11: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 12: *
! 13: * This program is distributed in the hope that it will be useful, but
! 14: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 15: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 16: * for more details.
! 17: */
! 18:
! 19: #include "test_suite.h"
! 20:
! 21: #include <collections/array.h>
! 22:
! 23: START_TEST(test_append_ptr)
! 24: {
! 25: array_t *array;
! 26: uintptr_t x;
! 27: int i;
! 28:
! 29: array = array_create(0, 0);
! 30:
! 31: for (i = 0; i < 4; i++)
! 32: {
! 33: ck_assert_int_eq(array_count(array), 0);
! 34:
! 35: array_insert(array, ARRAY_HEAD, (void*)(uintptr_t)3);
! 36: array_insert(array, ARRAY_TAIL, (void*)(uintptr_t)4);
! 37: ck_assert_int_eq(array_count(array), 2);
! 38:
! 39: /* 3, 4 */
! 40:
! 41: ck_assert(array_get(array, ARRAY_HEAD, &x));
! 42: ck_assert_int_eq(x, 3);
! 43: ck_assert(array_get(array, 1, &x));
! 44: ck_assert_int_eq(x, 4);
! 45: ck_assert(array_get(array, ARRAY_TAIL, &x));
! 46: ck_assert_int_eq(x, 4);
! 47: ck_assert(!array_get(array, 3, &x));
! 48:
! 49: array_insert(array, ARRAY_HEAD, (void*)(uintptr_t)1);
! 50: array_insert(array, 1, (void*)(uintptr_t)2);
! 51: ck_assert_int_eq(array_count(array), 4);
! 52:
! 53: /* 1, 2, 3, 4 */
! 54:
! 55: array_insert(array, ARRAY_TAIL, (void*)(uintptr_t)5);
! 56: array_insert(array, ARRAY_HEAD, (void*)(uintptr_t)0);
! 57: ck_assert_int_eq(array_count(array), 6);
! 58:
! 59: /* 0, 1, 2, 3, 4, 5 */
! 60:
! 61: ck_assert(array_remove(array, ARRAY_TAIL, &x));
! 62: ck_assert_int_eq(x, 5);
! 63: ck_assert(array_remove(array, 4, &x));
! 64: ck_assert_int_eq(x, 4);
! 65:
! 66: if (i < 3)
! 67: {
! 68: array_compress(array);
! 69: }
! 70:
! 71: /* 0, 1, 2, 3 */
! 72:
! 73: ck_assert(array_remove(array, 1, &x));
! 74: ck_assert_int_eq(x, 1);
! 75: ck_assert(array_remove(array, ARRAY_HEAD, &x));
! 76: ck_assert_int_eq(x, 0);
! 77:
! 78: if (i < 2)
! 79: {
! 80: array_compress(array);
! 81: }
! 82:
! 83: /* 2, 3 */
! 84:
! 85: ck_assert(array_remove(array, ARRAY_TAIL, &x));
! 86: ck_assert_int_eq(x, 3);
! 87: ck_assert(array_remove(array, ARRAY_TAIL, &x));
! 88: ck_assert_int_eq(x, 2);
! 89:
! 90: if (i < 1)
! 91: {
! 92: array_compress(array);
! 93: }
! 94:
! 95: ck_assert_int_eq(array_count(array), 0);
! 96:
! 97: ck_assert(array_remove(array, ARRAY_HEAD, NULL) == FALSE);
! 98: ck_assert(array_remove(array, ARRAY_TAIL, NULL) == FALSE);
! 99: }
! 100:
! 101: array_destroy(array);
! 102: }
! 103: END_TEST
! 104:
! 105: START_TEST(test_append_obj)
! 106: {
! 107: array_t *array;
! 108: int i, x, y[6] = {0, 1, 2, 3, 4, 5};
! 109:
! 110: array = array_create(sizeof(y[0]), 0);
! 111:
! 112: for (i = 0; i < 4; i++)
! 113: {
! 114: ck_assert_int_eq(array_count(array), 0);
! 115:
! 116: array_insert(array, ARRAY_HEAD, &y[3]);
! 117: array_insert(array, ARRAY_TAIL, &y[4]);
! 118: ck_assert_int_eq(array_count(array), 2);;
! 119:
! 120: /* 3, 4 */
! 121:
! 122: ck_assert(array_get(array, ARRAY_HEAD, &x));
! 123: ck_assert_int_eq(x, 3);
! 124: ck_assert(array_get(array, 1, &x));
! 125: ck_assert_int_eq(x, 4);
! 126: ck_assert(array_get(array, ARRAY_TAIL, &x));
! 127: ck_assert_int_eq(x, 4);
! 128: ck_assert(!array_get(array, 3, &x));
! 129:
! 130: array_insert(array, ARRAY_HEAD, &y[1]);
! 131: array_insert(array, 1, &y[2]);
! 132: ck_assert_int_eq(array_count(array), 4);
! 133:
! 134: /* 1, 2, 3, 4 */
! 135:
! 136: array_insert(array, ARRAY_TAIL, &y[5]);
! 137: array_insert(array, ARRAY_HEAD, &y[0]);
! 138: ck_assert_int_eq(array_count(array), 6);
! 139:
! 140: /* 0, 1, 2, 3, 4, 5 */
! 141:
! 142: ck_assert(array_remove(array, ARRAY_TAIL, &x));
! 143: ck_assert_int_eq(x, 5);
! 144: ck_assert(array_remove(array, 4, &x));
! 145: ck_assert_int_eq(x, 4);
! 146:
! 147: if (i < 3)
! 148: {
! 149: array_compress(array);
! 150: }
! 151:
! 152: /* 0, 1, 2, 3 */
! 153:
! 154: ck_assert(array_remove(array, ARRAY_HEAD, &x));
! 155: ck_assert_int_eq(x, 0);
! 156: ck_assert(array_remove(array, ARRAY_HEAD, &x));
! 157: ck_assert_int_eq(x, 1);
! 158:
! 159: if (i < 2)
! 160: {
! 161: array_compress(array);
! 162: }
! 163:
! 164: /* 2, 3 */
! 165:
! 166: ck_assert(array_remove(array, ARRAY_TAIL, &x));
! 167: ck_assert_int_eq(x, 3);
! 168: ck_assert(array_remove(array, ARRAY_HEAD, &x));
! 169: ck_assert_int_eq(x, 2);
! 170:
! 171: if (i < 1)
! 172: {
! 173: array_compress(array);
! 174: }
! 175:
! 176: ck_assert_int_eq(array_count(array), 0);
! 177:
! 178: ck_assert(array_remove(array, ARRAY_HEAD, NULL) == FALSE);
! 179: ck_assert(array_remove(array, ARRAY_TAIL, NULL) == FALSE);
! 180: }
! 181:
! 182: array_destroy(array);
! 183: }
! 184: END_TEST
! 185:
! 186: START_TEST(test_enumerate)
! 187: {
! 188: array_t *array;
! 189: int i, *x, y[6] = {0, 1, 2, 3, 4, 5};
! 190: enumerator_t *enumerator;
! 191:
! 192: array = array_create(sizeof(y[0]), 0);
! 193:
! 194: array_insert(array, ARRAY_TAIL, &y[0]);
! 195: array_insert(array, ARRAY_TAIL, &y[1]);
! 196: array_insert(array, ARRAY_TAIL, &y[2]);
! 197: array_insert(array, ARRAY_TAIL, &y[3]);
! 198: array_insert(array, ARRAY_TAIL, &y[4]);
! 199: array_insert(array, ARRAY_TAIL, &y[5]);
! 200:
! 201: ck_assert_int_eq(array_count(array), 6);
! 202:
! 203: /* 0, 1, 2, 3, 4, 5 */
! 204:
! 205: i = 0;
! 206: enumerator = array_create_enumerator(array);
! 207: while (enumerator->enumerate(enumerator, &x))
! 208: {
! 209: ck_assert_int_eq(*x, y[i]);
! 210: i++;
! 211: }
! 212: enumerator->destroy(enumerator);
! 213: ck_assert_int_eq(i, 6);
! 214:
! 215: i = 0;
! 216: enumerator = array_create_enumerator(array);
! 217: while (enumerator->enumerate(enumerator, &x))
! 218: {
! 219: ck_assert_int_eq(*x, y[i]);
! 220: if (i == 0 || i == 3 || i == 5)
! 221: {
! 222: array_remove_at(array, enumerator);
! 223: }
! 224: i++;
! 225: }
! 226: enumerator->destroy(enumerator);
! 227: ck_assert_int_eq(i, 6);
! 228: ck_assert_int_eq(array_count(array), 3);
! 229:
! 230: /* 1, 2, 4 */
! 231:
! 232: i = 0;
! 233: enumerator = array_create_enumerator(array);
! 234: while (enumerator->enumerate(enumerator, &x))
! 235: {
! 236: switch (i++)
! 237: {
! 238: case 0:
! 239: ck_assert_int_eq(*x, y[1]);
! 240: break;
! 241: case 1:
! 242: ck_assert_int_eq(*x, y[2]);
! 243: break;
! 244: case 2:
! 245: ck_assert_int_eq(*x, y[4]);
! 246: break;
! 247: default:
! 248: ck_assert(0);
! 249: }
! 250: }
! 251: enumerator->destroy(enumerator);
! 252:
! 253: array_compress(array);
! 254:
! 255: i = 0;
! 256: enumerator = array_create_enumerator(array);
! 257: while (enumerator->enumerate(enumerator, &x))
! 258: {
! 259: switch (i++)
! 260: {
! 261: case 0:
! 262: ck_assert_int_eq(*x, y[1]);
! 263: break;
! 264: case 1:
! 265: ck_assert_int_eq(*x, y[2]);
! 266: break;
! 267: case 2:
! 268: ck_assert_int_eq(*x, y[4]);
! 269: break;
! 270: default:
! 271: ck_assert(0);
! 272: }
! 273: }
! 274: enumerator->destroy(enumerator);
! 275:
! 276: array_destroy(array);
! 277: }
! 278: END_TEST
! 279:
! 280: static int comp_obj(const void *a, const void *b, void *arg)
! 281: {
! 282: ck_assert_str_eq(arg, "arg");
! 283: return *(int*)a - *(int*)b;
! 284: }
! 285:
! 286: START_TEST(test_sort_obj)
! 287: {
! 288: array_t *array;
! 289: int x[][3] = {
! 290: {1, 2, 3},
! 291: {1, 3, 2},
! 292: {2, 1, 3},
! 293: {2, 3, 1},
! 294: {3, 1, 2},
! 295: {3, 2, 1},
! 296: };
! 297: char *arg = "arg";
! 298: int i, v;
! 299:
! 300: for (i = 0; i < countof(x); i++)
! 301: {
! 302: array = array_create(sizeof(x[i][0]), 0);
! 303: array_insert(array, ARRAY_TAIL, &x[i][0]);
! 304: array_insert(array, ARRAY_TAIL, &x[i][1]);
! 305: array_insert(array, ARRAY_TAIL, &x[i][2]);
! 306:
! 307: array_sort(array, comp_obj, arg);
! 308:
! 309: ck_assert(array_get(array, 0, &v));
! 310: ck_assert_int_eq(v, 1);
! 311: ck_assert(array_get(array, 1, &v));
! 312: ck_assert_int_eq(v, 2);
! 313: ck_assert(array_get(array, 2, &v));
! 314: ck_assert_int_eq(v, 3);
! 315:
! 316: array_destroy(array);
! 317: }
! 318: }
! 319: END_TEST
! 320:
! 321: static int comp_ptr(const void *a, const void *b, void *arg)
! 322: {
! 323: ck_assert_str_eq(arg, "arg");
! 324: return strcmp(a, b);
! 325: }
! 326:
! 327: START_TEST(test_sort_ptr)
! 328: {
! 329: array_t *array;
! 330: char *x[][3] = {
! 331: {"a", "b", "c"},
! 332: {"a", "c", "b"},
! 333: {"b", "a", "c"},
! 334: {"b", "c", "a"},
! 335: {"c", "a", "b"},
! 336: {"c", "b", "a"},
! 337: };
! 338: char *v, *arg = "arg";
! 339: int i;
! 340:
! 341: for (i = 0; i < countof(x); i++)
! 342: {
! 343: array = array_create(0, 0);
! 344: array_insert(array, ARRAY_TAIL, x[i][0]);
! 345: array_insert(array, ARRAY_TAIL, x[i][1]);
! 346: array_insert(array, ARRAY_TAIL, x[i][2]);
! 347:
! 348: array_sort(array, comp_ptr, arg);
! 349:
! 350: ck_assert(array_get(array, 0, &v));
! 351: ck_assert_str_eq(v, "a");
! 352: ck_assert(array_get(array, 1, &v));
! 353: ck_assert_str_eq(v, "b");
! 354: ck_assert(array_get(array, 2, &v));
! 355: ck_assert_str_eq(v, "c");
! 356:
! 357: array_destroy(array);
! 358: }
! 359: }
! 360: END_TEST
! 361:
! 362: static int comp_search_obj(const void *a, const void *b)
! 363: {
! 364: return *(int*)a - *(int*)b;
! 365: }
! 366:
! 367: START_TEST(test_bsearch_obj)
! 368: {
! 369: array_t *array;
! 370: int x[] = { 3, 2, 1 };
! 371: int k, v;
! 372:
! 373: array = array_create(sizeof(x[0]), 0);
! 374: array_insert(array, ARRAY_TAIL, &x[0]);
! 375: array_insert(array, ARRAY_TAIL, &x[1]);
! 376: array_insert(array, ARRAY_TAIL, &x[2]);
! 377:
! 378: array_sort(array, (void*)comp_search_obj, NULL);
! 379:
! 380: k = 0;
! 381: ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), -1);
! 382: for (k = 1; k < 4; k++)
! 383: {
! 384: ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), k-1);
! 385: ck_assert_int_eq(v, k);
! 386: }
! 387: k = 4;
! 388: ck_assert_int_eq(array_bsearch(array, &k, comp_search_obj, &v), -1);
! 389: array_destroy(array);
! 390: }
! 391: END_TEST
! 392:
! 393: static int comp_search_ptr(const void *a, const void *b)
! 394: {
! 395: return strcmp(a, b);
! 396: }
! 397:
! 398: START_TEST(test_bsearch_ptr)
! 399: {
! 400: array_t *array;
! 401: char *x[] = {"c", "b", "a"};
! 402: char *v;
! 403:
! 404: array = array_create(0, 0);
! 405: array_insert(array, ARRAY_TAIL, x[0]);
! 406: array_insert(array, ARRAY_TAIL, x[1]);
! 407: array_insert(array, ARRAY_TAIL, x[2]);
! 408:
! 409: array_sort(array, (void*)comp_search_ptr, NULL);
! 410:
! 411: ck_assert_int_eq(array_bsearch(array, "abc", comp_search_ptr, &v), -1);
! 412: ck_assert_int_eq(array_bsearch(array, "a", comp_search_ptr, &v), 0);
! 413: ck_assert_str_eq(v, "a");
! 414: ck_assert_int_eq(array_bsearch(array, "b", comp_search_ptr, &v), 1);
! 415: ck_assert_str_eq(v, "b");
! 416: ck_assert_int_eq(array_bsearch(array, "c", comp_search_ptr, &v), 2);
! 417: ck_assert_str_eq(v, "c");
! 418:
! 419: array_destroy(array);
! 420: }
! 421: END_TEST
! 422:
! 423: static void invoke(void *data, int idx, void *user)
! 424: {
! 425: int *y = user, *x = data;
! 426:
! 427: ck_assert(idx < 3);
! 428:
! 429: ck_assert_int_eq(y[idx], *x);
! 430: y[idx] = 0;
! 431: }
! 432:
! 433: START_TEST(test_invoke)
! 434: {
! 435: array_t *array;
! 436: int y[] = {1, 2, 3};
! 437:
! 438: array = array_create(sizeof(y[0]), 0);
! 439:
! 440: array_insert(array, ARRAY_TAIL, &y[0]);
! 441: array_insert(array, ARRAY_TAIL, &y[1]);
! 442: array_insert(array, ARRAY_TAIL, &y[2]);
! 443:
! 444: array_invoke(array, invoke, y);
! 445:
! 446: ck_assert_int_eq(y[0], 0);
! 447: ck_assert_int_eq(y[0], 0);
! 448: ck_assert_int_eq(y[0], 0);
! 449:
! 450: array_destroy(array);
! 451: }
! 452: END_TEST
! 453:
! 454: typedef struct obj_t obj_t;
! 455:
! 456: struct obj_t {
! 457: void (*fun)(obj_t *obj);
! 458: int x;
! 459: int *counter;
! 460: };
! 461:
! 462: static void fun(obj_t *obj)
! 463: {
! 464: ck_assert(obj->x == (*obj->counter)++);
! 465: }
! 466:
! 467: START_TEST(test_invoke_offset)
! 468: {
! 469: array_t *array;
! 470: obj_t objs[5];
! 471: int i, counter = 0;
! 472:
! 473: array = array_create(0, 0);
! 474:
! 475: for (i = 0; i < countof(objs); i++)
! 476: {
! 477: objs[i].x = i;
! 478: objs[i].counter = &counter;
! 479: objs[i].fun = fun;
! 480:
! 481: array_insert(array, ARRAY_TAIL, &objs[i]);
! 482: }
! 483:
! 484: ck_assert_int_eq(countof(objs), array_count(array));
! 485:
! 486: array_invoke_offset(array, offsetof(obj_t, fun));
! 487:
! 488: ck_assert_int_eq(counter, countof(objs));
! 489:
! 490: array_destroy(array);
! 491: }
! 492: END_TEST
! 493:
! 494: START_TEST(test_insert_create)
! 495: {
! 496: array_t *array = NULL;
! 497: uintptr_t x;
! 498:
! 499: array_insert_create(&array, ARRAY_TAIL, (void*)(uintptr_t)1);
! 500: array_insert_create(&array, ARRAY_TAIL, (void*)(uintptr_t)2);
! 501: ck_assert(array != NULL);
! 502:
! 503: ck_assert(array_get(array, ARRAY_HEAD, &x));
! 504: ck_assert_int_eq(x, 1);
! 505: ck_assert(array_get(array, ARRAY_TAIL, &x));
! 506: ck_assert_int_eq(x, 2);
! 507:
! 508: array_destroy(array);
! 509: }
! 510: END_TEST
! 511:
! 512: START_TEST(test_insert_create_value)
! 513: {
! 514: array_t *array = NULL;
! 515: uint16_t v;
! 516:
! 517: v = 1;
! 518: array_insert_create_value(&array, sizeof(v), ARRAY_TAIL, &v);
! 519: v = 2;
! 520: array_insert_create_value(&array, sizeof(v), ARRAY_TAIL, &v);
! 521: ck_assert(array != NULL);
! 522:
! 523: ck_assert(array_get(array, ARRAY_HEAD, &v));
! 524: ck_assert_int_eq(v, 1);
! 525: ck_assert(array_get(array, ARRAY_TAIL, &v));
! 526: ck_assert_int_eq(v, 2);
! 527:
! 528: array_destroy(array);
! 529: }
! 530: END_TEST
! 531:
! 532: Suite *array_suite_create()
! 533: {
! 534: Suite *s;
! 535: TCase *tc;
! 536:
! 537: s = suite_create("array");
! 538:
! 539: tc = tcase_create("add/get/remove ptr");
! 540: tcase_add_test(tc, test_append_ptr);
! 541: suite_add_tcase(s, tc);
! 542:
! 543: tc = tcase_create("add/get/remove obj");
! 544: tcase_add_test(tc, test_append_obj);
! 545: suite_add_tcase(s, tc);
! 546:
! 547: tc = tcase_create("enumerate");
! 548: tcase_add_test(tc, test_enumerate);
! 549: suite_add_tcase(s, tc);
! 550:
! 551: tc = tcase_create("sort");
! 552: tcase_add_test(tc, test_sort_obj);
! 553: tcase_add_test(tc, test_sort_ptr);
! 554: suite_add_tcase(s, tc);
! 555:
! 556: tc = tcase_create("bsearch");
! 557: tcase_add_test(tc, test_bsearch_obj);
! 558: tcase_add_test(tc, test_bsearch_ptr);
! 559: suite_add_tcase(s, tc);
! 560:
! 561: tc = tcase_create("invoke");
! 562: tcase_add_test(tc, test_invoke);
! 563: suite_add_tcase(s, tc);
! 564:
! 565: tc = tcase_create("invoke offset");
! 566: tcase_add_test(tc, test_invoke_offset);
! 567: suite_add_tcase(s, tc);
! 568:
! 569: tc = tcase_create("insert create");
! 570: tcase_add_test(tc, test_insert_create);
! 571: tcase_add_test(tc, test_insert_create_value);
! 572: suite_add_tcase(s, tc);
! 573:
! 574: return s;
! 575: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>