86de91e78a5c79e2a3afe4dcf17113e26142fcd2
[runtime.git] / lib / silcutil / tests / test_silclist.c
1 /* SilcList tests */
2
3 #include "silcruntime.h"
4
5 struct foo {
6   int i;
7   struct foo *next;
8   struct foo *prev;
9 };
10
11 static int compare(void *e1, void *e2, void *context)
12 {
13   struct foo *ee1 = e1, *ee2 = e2;
14   SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", ee1->i, ee1, ee1->next,
15                    ee1->prev));
16   SILC_LOG_DEBUG(("> entry %d, %p, next=%p, prev=%p", ee2->i, ee2, ee2->next,
17                    ee2->prev));
18   return ee1->i - ee2->i;
19 }
20
21 int main(int argc, char **argv)
22 {
23   SilcBool success = FALSE;
24   SilcList list;
25   struct foo *f, *f1, *f2, *f3, *f4, *f5, *f6, *f7;
26
27   if (argc > 1 && !strcmp(argv[1], "-d")) {
28     silc_log_debug(TRUE);
29     silc_log_debug_hexdump(TRUE);
30     silc_log_set_debug_string("*list*,*errno*");
31   }
32
33   silc_list_init_prev(list, struct foo, next, prev);
34   f1 = silc_calloc(1, sizeof(*f1));
35   if (!f1)
36     goto err;
37   f1->i = 1;
38   f2 = silc_calloc(1, sizeof(*f2));
39   if (!f2)
40     goto err;
41   f2->i = 2;
42   f3 = silc_calloc(1, sizeof(*f3));
43   if (!f3)
44     goto err;
45   f3->i = 3;
46   f4 = silc_calloc(1, sizeof(*f4));
47   if (!f4)
48     goto err;
49   f4->i = 4;
50   f5 = silc_calloc(1, sizeof(*f4));
51   if (!f5)
52     goto err;
53   f5->i = 5;
54   f6 = silc_calloc(1, sizeof(*f4));
55   if (!f6)
56     goto err;
57   f6->i = 6;
58   f7 = silc_calloc(1, sizeof(*f4));
59   if (!f7)
60     goto err;
61   f7->i = 7;
62
63   SILC_LOG_DEBUG(("Add one entry"));
64   silc_list_add(list, f1);
65   silc_list_start(list);
66   while ((f = silc_list_get(list)) != SILC_LIST_END) {
67     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
68                    f->prev));
69   }
70   SILC_LOG_DEBUG(("Delete the entry"));
71   silc_list_del(list, f1);
72   silc_list_start(list);
73   while ((f = silc_list_get(list)) != SILC_LIST_END)
74     goto err;
75   SILC_LOG_DEBUG(("head=%p", list.head));
76   SILC_LOG_DEBUG(("Re-add the entry"));
77   silc_list_add(list, f1);
78   silc_list_start(list);
79   while ((f = silc_list_get(list)) != SILC_LIST_END) {
80     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
81                    f->prev));
82   }
83   SILC_LOG_DEBUG(("Delete the entry"));
84   silc_list_del(list, f1);
85   silc_list_start(list);
86   while ((f = silc_list_get(list)) != SILC_LIST_END)
87     goto err;
88
89   SILC_LOG_DEBUG(("insert f4=%p at head"));
90   silc_list_insert(list, NULL, f4);
91   silc_list_start(list);
92   while ((f = silc_list_get(list)) != SILC_LIST_END) {
93     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
94                    f->prev));
95   }
96
97   SILC_LOG_DEBUG(("Deleting f4=%p", f4));
98   silc_list_del(list, f4);
99
100   SILC_LOG_DEBUG(("Add f1, f2, f3"));
101   silc_list_add(list, f1);
102   silc_list_add(list, f2);
103   silc_list_add(list, f3);
104
105   SILC_LOG_DEBUG(("f1=%p", f1));
106   SILC_LOG_DEBUG(("f2=%p", f2));
107   SILC_LOG_DEBUG(("f3=%p", f3));
108
109   silc_list_start(list);
110   while ((f = silc_list_get(list)) != SILC_LIST_END) {
111     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
112                    f->prev));
113   }
114
115   SILC_LOG_DEBUG(("insert f4=%p between f1=%p and f2=%p", f4, f1, f2));
116   silc_list_insert(list, f1, f4);
117   silc_list_start(list);
118   while ((f = silc_list_get(list)) != SILC_LIST_END) {
119     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
120                    f->prev));
121   }
122
123   SILC_LOG_DEBUG(("Deleting f4=%p", f4));
124   silc_list_del(list, f4);
125
126   SILC_LOG_DEBUG(("insert f4=%p between f3=%p and tail", f4, f3));
127   silc_list_insert(list, f3, f4);
128   silc_list_start(list);
129   while ((f = silc_list_get(list)) != SILC_LIST_END) {
130     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
131                    f->prev));
132   }
133
134   SILC_LOG_DEBUG(("Deleting f4=%p", f4));
135   silc_list_del(list, f4);
136
137   SILC_LOG_DEBUG(("insert f4=%p at head"));
138   silc_list_insert(list, NULL, f4);
139   silc_list_start(list);
140   while ((f = silc_list_get(list)) != SILC_LIST_END) {
141     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
142                    f->prev));
143   }
144
145   silc_list_start(list);
146   silc_list_del(list, f1);
147   while ((f = silc_list_get(list)) != SILC_LIST_END) {
148     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
149                    f->prev));
150   }
151   silc_list_del(list, f3);
152   while ((f = silc_list_get(list)) != SILC_LIST_END) {
153     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
154                    f->prev));
155   }
156   silc_list_del(list, f2);
157   while ((f = silc_list_get(list)) != SILC_LIST_END) {
158     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
159                    f->prev));
160   }
161
162   silc_list_add(list, f1);
163   silc_list_add(list, f2);
164   silc_list_add(list, f3);
165
166   silc_list_start(list);
167   while ((f = silc_list_get(list)) != SILC_LIST_END) {
168     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
169                    f->prev));
170   }
171
172   silc_list_del(list, f2);
173
174   silc_list_start(list);
175   while ((f = silc_list_get(list)) != SILC_LIST_END) {
176     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
177                    f->prev));
178   }
179
180   while ((f = silc_list_pop(list)) != SILC_LIST_END) {
181     SILC_LOG_DEBUG(("POPPED entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
182                    f->prev));
183   }
184   if (silc_list_count(list))
185     goto err;
186
187   /* Sort */
188   silc_list_init_prev(list, struct foo, next, prev);
189   silc_list_add(list, f2);
190   silc_list_add(list, f7);
191   silc_list_add(list, f4);
192   silc_list_add(list, f6);
193   silc_list_add(list, f5);
194   silc_list_add(list, f1);
195   silc_list_add(list, f3);
196
197   SILC_LOG_DEBUG(("Unsorted list"));
198   silc_list_start(list);
199   while ((f = silc_list_get(list)) != SILC_LIST_END)
200     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
201                    f->prev));
202
203   SILC_LOG_DEBUG(("Sorting"));  
204   silc_list_sort(list, compare, NULL);
205
206   SILC_LOG_DEBUG(("Sorted list"));
207   silc_list_start(list);
208   while ((f = silc_list_get(list)) != SILC_LIST_END)
209     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next,
210                    f->prev));
211
212   success = TRUE;
213
214  err:
215   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
216   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
217
218   return !success;
219 }