Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_array.c, revision 1.1.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>