Annotation of embedaddon/bird2/lib/lists_test.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     BIRD Library -- Linked Lists Tests
        !             3:  *
        !             4:  *     (c) 2015 CZ.NIC z.s.p.o.
        !             5:  *
        !             6:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !             7:  */
        !             8: 
        !             9: #include "test/birdtest.h"
        !            10: #include "lib/lists.h"
        !            11: 
        !            12: #define MAX_NUM 1000
        !            13: 
        !            14: static node nodes[MAX_NUM];
        !            15: static list l;
        !            16: 
        !            17: static void
        !            18: show_list(void)
        !            19: {
        !            20:   bt_debug("\n");
        !            21:   bt_debug("list.null is at %p and point to %p\n", &l.null, l.null);
        !            22:   bt_debug("list.head is at %p and point to %p\n", &l.head, l.head);
        !            23:   bt_debug("list.tail is at %p and point to %p\n", &l.tail, l.tail);
        !            24: 
        !            25:   int i;
        !            26:   for (i = 0; i < MAX_NUM; i++)
        !            27:   {
        !            28:     bt_debug("n[%3i] is at %p\n", i, &nodes[i]);
        !            29:     bt_debug("  prev is at %p and point to %p\n", &(nodes[i].prev), nodes[i].prev);
        !            30:     bt_debug("  next is at %p and point to %p\n", &(nodes[i].next), nodes[i].next);
        !            31:   }
        !            32: }
        !            33: 
        !            34: static int
        !            35: is_filled_list_well_linked(void)
        !            36: {
        !            37:   int i;
        !            38:   bt_assert(l.head == &nodes[0]);
        !            39:   bt_assert(l.tail == &nodes[MAX_NUM-1]);
        !            40:   bt_assert((void *) nodes[0].prev == (void *) &l.head);
        !            41:   bt_assert((void *) nodes[MAX_NUM-1].next == (void *) &l.null);
        !            42: 
        !            43:   for (i = 0; i < MAX_NUM; i++)
        !            44:   {
        !            45:     if (i < (MAX_NUM-1))
        !            46:       bt_assert(nodes[i].next == &nodes[i+1]);
        !            47: 
        !            48:     if (i > 0)
        !            49:       bt_assert(nodes[i].prev == &nodes[i-1]);
        !            50:   }
        !            51: 
        !            52:   return 1;
        !            53: }
        !            54: 
        !            55: static int
        !            56: is_empty_list_well_unlinked(void)
        !            57: {
        !            58:   int i;
        !            59: 
        !            60:   bt_assert(l.head == NODE &l.null);
        !            61:   bt_assert(l.tail == NODE &l.head);
        !            62:   bt_assert(EMPTY_LIST(l));
        !            63: 
        !            64:   for (i = 0; i < MAX_NUM; i++)
        !            65:   {
        !            66:     bt_assert(nodes[i].next == NULL);
        !            67:     bt_assert(nodes[i].prev == NULL);
        !            68:   }
        !            69: 
        !            70:   return 1;
        !            71: }
        !            72: 
        !            73: static void
        !            74: init_list__(list *l, struct node nodes[])
        !            75: {
        !            76:   init_list(l);
        !            77: 
        !            78:   int i;
        !            79:   for (i = 0; i < MAX_NUM; i++)
        !            80:   {
        !            81:     nodes[i].next = NULL;
        !            82:     nodes[i].prev = NULL;
        !            83:   }
        !            84: }
        !            85: 
        !            86: static void
        !            87: init_list_(void)
        !            88: {
        !            89:   init_list__(&l, (node *) nodes);
        !            90: }
        !            91: 
        !            92: static int
        !            93: t_add_tail(void)
        !            94: {
        !            95:   int i;
        !            96: 
        !            97:   init_list_();
        !            98:   for (i = 0; i < MAX_NUM; i++)
        !            99:   {
        !           100:     add_tail(&l, &nodes[i]);
        !           101:     bt_debug(".");
        !           102:     bt_assert(l.tail == &nodes[i]);
        !           103:     bt_assert(l.head == &nodes[0]);
        !           104:     bt_assert((void *) nodes[i].next == (void *) &l.null);
        !           105:     if (i > 0)
        !           106:     {
        !           107:       bt_assert(nodes[i-1].next == &nodes[i]);
        !           108:       bt_assert(nodes[i].prev == &nodes[i-1]);
        !           109:     }
        !           110:   }
        !           111:   show_list();
        !           112:   bt_assert(is_filled_list_well_linked());
        !           113: 
        !           114:   return 1;
        !           115: }
        !           116: 
        !           117: static int
        !           118: t_add_head(void)
        !           119: {
        !           120:   int i;
        !           121: 
        !           122:   init_list_();
        !           123:   for (i = MAX_NUM-1; i >= 0; i--)
        !           124:   {
        !           125:     add_head(&l, &nodes[i]);
        !           126:     bt_debug(".");
        !           127:     bt_assert(l.head == &nodes[i]);
        !           128:     bt_assert(l.tail == &nodes[MAX_NUM-1]);
        !           129:     if (i < MAX_NUM-1)
        !           130:     {
        !           131:       bt_assert(nodes[i+1].prev == &nodes[i]);
        !           132:       bt_assert(nodes[i].next == &nodes[i+1]);
        !           133:     }
        !           134:   }
        !           135:   show_list();
        !           136:   bt_assert(is_filled_list_well_linked());
        !           137: 
        !           138:   return 1;
        !           139: }
        !           140: 
        !           141: static void
        !           142: insert_node_(node *n, node *after)
        !           143: {
        !           144:   insert_node(n, after);
        !           145:   bt_debug(".");
        !           146: }
        !           147: 
        !           148: static int
        !           149: t_insert_node(void)
        !           150: {
        !           151:   int i;
        !           152: 
        !           153:   init_list_();
        !           154: 
        !           155:   // add first node
        !           156:   insert_node_(&nodes[0], NODE &l.head);
        !           157: 
        !           158:   // add odd nodes
        !           159:   for (i = 2; i < MAX_NUM; i+=2)
        !           160:     insert_node_(&nodes[i], &nodes[i-2]);
        !           161: 
        !           162:   // add even nodes
        !           163:   for (i = 1; i < MAX_NUM; i+=2)
        !           164:     insert_node_(&nodes[i], &nodes[i-1]);
        !           165: 
        !           166:   bt_debug("\n");
        !           167:   bt_assert(is_filled_list_well_linked());
        !           168: 
        !           169:   return 1;
        !           170: }
        !           171: 
        !           172: static void
        !           173: fill_list2(list *l, node nodes[])
        !           174: {
        !           175:   int i;
        !           176:   for (i = 0; i < MAX_NUM; i++)
        !           177:     add_tail(l, &nodes[i]);
        !           178: }
        !           179: 
        !           180: static void
        !           181: fill_list(void)
        !           182: {
        !           183:   fill_list2(&l, (node *) nodes);
        !           184: }
        !           185: 
        !           186: static int
        !           187: t_remove_node(void)
        !           188: {
        !           189:   int i;
        !           190: 
        !           191:   init_list_();
        !           192: 
        !           193:   /* Fill & Remove & Check */
        !           194:   fill_list();
        !           195:   for (i = 0; i < MAX_NUM; i++)
        !           196:     rem_node(&nodes[i]);
        !           197:   bt_assert(is_empty_list_well_unlinked());
        !           198: 
        !           199:   /* Fill & Remove the half of nodes & Check & Remove the rest nodes & Check */
        !           200:   fill_list();
        !           201:   for (i = 0; i < MAX_NUM; i+=2)
        !           202:     rem_node(&nodes[i]);
        !           203: 
        !           204:   int tail_node_index = (MAX_NUM % 2) ? MAX_NUM - 2 : MAX_NUM - 1;
        !           205:   bt_assert(l.head == &nodes[1]);
        !           206:   bt_assert(l.tail == &nodes[tail_node_index]);
        !           207:   bt_assert(nodes[tail_node_index].next == NODE &l.null);
        !           208: 
        !           209:   for (i = 1; i < MAX_NUM; i+=2)
        !           210:   {
        !           211:     if (i > 1)
        !           212:       bt_assert(nodes[i].prev == &nodes[i-2]);
        !           213:     if (i < tail_node_index)
        !           214:       bt_assert(nodes[i].next == &nodes[i+2]);
        !           215:   }
        !           216: 
        !           217:   for (i = 1; i < MAX_NUM; i+=2)
        !           218:     rem_node(&nodes[i]);
        !           219:   bt_assert(is_empty_list_well_unlinked());
        !           220: 
        !           221:   return 1;
        !           222: }
        !           223: 
        !           224: static int
        !           225: t_replace_node(void)
        !           226: {
        !           227:   node head, inside, tail;
        !           228: 
        !           229:   init_list_();
        !           230:   fill_list();
        !           231: 
        !           232:   replace_node(&nodes[0], &head);
        !           233:   bt_assert(l.head == &head);
        !           234:   bt_assert(head.prev == NODE &l.head);
        !           235:   bt_assert(head.next == &nodes[1]);
        !           236:   bt_assert(nodes[1].prev == &head);
        !           237: 
        !           238:   replace_node(&nodes[MAX_NUM/2], &inside);
        !           239:   bt_assert(nodes[MAX_NUM/2-1].next == &inside);
        !           240:   bt_assert(nodes[MAX_NUM/2+1].prev == &inside);
        !           241:   bt_assert(inside.prev == &nodes[MAX_NUM/2-1]);
        !           242:   bt_assert(inside.next == &nodes[MAX_NUM/2+1]);
        !           243: 
        !           244:   replace_node(&nodes[MAX_NUM-1], &tail);
        !           245:   bt_assert(l.tail == &tail);
        !           246:   bt_assert(tail.prev == &nodes[MAX_NUM-2]);
        !           247:   bt_assert(tail.next == NODE &l.null);
        !           248:   bt_assert(nodes[MAX_NUM-2].next == &tail);
        !           249: 
        !           250:   return 1;
        !           251: }
        !           252: 
        !           253: static int
        !           254: t_add_tail_list(void)
        !           255: {
        !           256:   node nodes2[MAX_NUM];
        !           257:   list l2;
        !           258: 
        !           259:   init_list__(&l, (node *) nodes);
        !           260:   fill_list2(&l, (node *) nodes);
        !           261: 
        !           262:   init_list__(&l2, (node *) nodes2);
        !           263:   fill_list2(&l2, (node *) nodes2);
        !           264: 
        !           265:   add_tail_list(&l, &l2);
        !           266: 
        !           267:   bt_assert(nodes[MAX_NUM-1].next == &nodes2[0]);
        !           268:   bt_assert(nodes2[0].prev == &nodes[MAX_NUM-1]);
        !           269:   bt_assert(l.tail == &nodes2[MAX_NUM-1]);
        !           270: 
        !           271:   return 1;
        !           272: }
        !           273: 
        !           274: int
        !           275: main(int argc, char *argv[])
        !           276: {
        !           277:   bt_init(argc, argv);
        !           278: 
        !           279:   bt_test_suite(t_add_tail, "Adding nodes to tail of list");
        !           280:   bt_test_suite(t_add_head, "Adding nodes to head of list");
        !           281:   bt_test_suite(t_insert_node, "Inserting nodes to list");
        !           282:   bt_test_suite(t_remove_node, "Removing nodes from list");
        !           283:   bt_test_suite(t_replace_node, "Replacing nodes in list");
        !           284:   bt_test_suite(t_add_tail_list, "At the tail of a list adding the another list");
        !           285: 
        !           286:   return bt_exit_value();
        !           287: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>