Annotation of embedaddon/bird2/lib/lists_test.c, revision 1.1.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>