Added SILC Thread Queue API
[silc.git] / lib / silcutil / tests / test_silclist.c
1 /* SilcList tests */
2
3 #include "silc.h"
4
5 struct foo {
6   int i;
7   struct foo *next;
8   struct foo *prev;
9 };
10
11 int main(int argc, char **argv)
12 {
13   SilcBool success = FALSE;
14   SilcList list;
15   struct foo *f, *f1, *f2, *f3, *f4;
16
17   if (argc > 1 && !strcmp(argv[1], "-d")) {
18     silc_log_debug(TRUE);
19     silc_log_debug_hexdump(TRUE);
20     silc_log_set_debug_string("*list*,*errno*");
21   }
22
23   silc_list_init_prev(list, struct foo, next, prev);
24   f1 = silc_calloc(1, sizeof(*f1));
25   if (!f1)
26     goto err;
27   f1->i = 1;
28   f2 = silc_calloc(1, sizeof(*f2));
29   if (!f2)
30     goto err;
31   f2->i = 2;
32   f3 = silc_calloc(1, sizeof(*f3));
33   if (!f3)
34     goto err;
35   f3->i = 3;
36   f4 = silc_calloc(1, sizeof(*f4));
37   if (!f4)
38     goto err;
39   f4->i = 4;
40
41   SILC_LOG_DEBUG(("Add one entry"));
42   silc_list_add(list, f1);
43   silc_list_start(list);
44   while ((f = silc_list_get(list)) != SILC_LIST_END) {
45     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
46                    f->prev));
47   }
48   SILC_LOG_DEBUG(("Delete the entry"));
49   silc_list_del(list, f1);  
50   silc_list_start(list);
51   while ((f = silc_list_get(list)) != SILC_LIST_END)
52     goto err;
53   SILC_LOG_DEBUG(("head=%p", list.head));
54   SILC_LOG_DEBUG(("Re-add the entry"));
55   silc_list_add(list, f1);
56   silc_list_start(list);
57   while ((f = silc_list_get(list)) != SILC_LIST_END) {
58     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
59                    f->prev));
60   }
61   SILC_LOG_DEBUG(("Delete the entry"));
62   silc_list_del(list, f1);  
63   silc_list_start(list);
64   while ((f = silc_list_get(list)) != SILC_LIST_END)
65     goto err;
66
67   SILC_LOG_DEBUG(("insert f4=%p at head"));
68   silc_list_insert(list, NULL, f4);
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
75   SILC_LOG_DEBUG(("Deleting f4=%p", f4));
76   silc_list_del(list, f4);
77
78   SILC_LOG_DEBUG(("Add f1, f2, f3"));
79   silc_list_add(list, f1);
80   silc_list_add(list, f2);
81   silc_list_add(list, f3);
82
83   SILC_LOG_DEBUG(("f1=%p", f1));
84   SILC_LOG_DEBUG(("f2=%p", f2));
85   SILC_LOG_DEBUG(("f3=%p", f3));
86
87   silc_list_start(list);
88   while ((f = silc_list_get(list)) != SILC_LIST_END) {
89     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
90                    f->prev));
91   }
92
93   SILC_LOG_DEBUG(("insert f4=%p between f1=%p and f2=%p", f4, f1, f2));
94   silc_list_insert(list, f1, 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(("insert f4=%p between f3=%p and tail", f4, f3));
105   silc_list_insert(list, f3, f4);
106   silc_list_start(list);
107   while ((f = silc_list_get(list)) != SILC_LIST_END) {
108     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
109                    f->prev));
110   }
111
112   SILC_LOG_DEBUG(("Deleting f4=%p", f4));
113   silc_list_del(list, f4);
114
115   SILC_LOG_DEBUG(("insert f4=%p at head"));
116   silc_list_insert(list, NULL, 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_list_start(list);
124   silc_list_del(list, f1);
125   while ((f = silc_list_get(list)) != SILC_LIST_END) {
126     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
127                    f->prev));
128   }
129   silc_list_del(list, f3);
130   while ((f = silc_list_get(list)) != SILC_LIST_END) {
131     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
132                    f->prev));
133   }
134   silc_list_del(list, f2);
135   while ((f = silc_list_get(list)) != SILC_LIST_END) {
136     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
137                    f->prev));
138   }
139
140   silc_list_add(list, f1);
141   silc_list_add(list, f2);
142   silc_list_add(list, f3);
143
144   silc_list_start(list);
145   while ((f = silc_list_get(list)) != SILC_LIST_END) {
146     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
147                    f->prev));
148   }
149
150   silc_list_del(list, f2);
151
152   silc_list_start(list);
153   while ((f = silc_list_get(list)) != SILC_LIST_END) {
154     SILC_LOG_DEBUG(("entry %d, %p, next=%p, prev=%p", f->i, f, f->next, 
155                    f->prev));
156   }
157
158   success = TRUE;
159
160  err:
161   SILC_LOG_DEBUG(("Testing was %s", success ? "SUCCESS" : "FAILURE"));
162   fprintf(stderr, "Testing was %s\n", success ? "SUCCESS" : "FAILURE");
163
164   return success;
165 }