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