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>