1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "list.h"
4 #include "util.h"
5
main(int argc,const char * argv[])6 int main(int argc, const char *argv[]) {
7 size_t i;
8 typedef struct list_item {
9 LIST_FIELDS(struct list_item, item);
10 } list_item;
11 LIST_HEAD(list_item, head);
12 LIST_HEAD(list_item, head2);
13 list_item items[4];
14
15 LIST_HEAD_INIT(head);
16 LIST_HEAD_INIT(head2);
17 assert_se(head == NULL);
18 assert_se(head2 == NULL);
19
20 for (i = 0; i < ELEMENTSOF(items); i++) {
21 LIST_INIT(item, &items[i]);
22 assert_se(LIST_JUST_US(item, &items[i]));
23 LIST_PREPEND(item, head, &items[i]);
24 }
25
26 i = 0;
27 LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
28 i++;
29 assert_se(cursor != &items[2]);
30 }
31 assert_se(i == ELEMENTSOF(items)-1);
32
33 i = 0;
34 LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
35 i++;
36 assert_se(cursor != &items[0]);
37 }
38 assert_se(i == ELEMENTSOF(items)-1);
39
40 i = 0;
41 LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
42 i++;
43 assert_se(cursor != &items[3]);
44 }
45 assert_se(i == ELEMENTSOF(items)-1);
46
47 assert_se(!LIST_JUST_US(item, head));
48
49 assert_se(items[0].item_next == NULL);
50 assert_se(items[1].item_next == &items[0]);
51 assert_se(items[2].item_next == &items[1]);
52 assert_se(items[3].item_next == &items[2]);
53
54 assert_se(items[0].item_prev == &items[1]);
55 assert_se(items[1].item_prev == &items[2]);
56 assert_se(items[2].item_prev == &items[3]);
57 assert_se(items[3].item_prev == NULL);
58
59 list_item *cursor;
60 LIST_FIND_HEAD(item, &items[0], cursor);
61 assert_se(cursor == &items[3]);
62
63 LIST_FIND_TAIL(item, &items[3], cursor);
64 assert_se(cursor == &items[0]);
65
66 LIST_REMOVE(item, head, &items[1]);
67 assert_se(LIST_JUST_US(item, &items[1]));
68
69 assert_se(items[0].item_next == NULL);
70 assert_se(items[2].item_next == &items[0]);
71 assert_se(items[3].item_next == &items[2]);
72
73 assert_se(items[0].item_prev == &items[2]);
74 assert_se(items[2].item_prev == &items[3]);
75 assert_se(items[3].item_prev == NULL);
76
77 LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
78 assert_se(items[0].item_next == NULL);
79 assert_se(items[2].item_next == &items[0]);
80 assert_se(items[1].item_next == &items[2]);
81 assert_se(items[3].item_next == &items[1]);
82
83 assert_se(items[0].item_prev == &items[2]);
84 assert_se(items[2].item_prev == &items[1]);
85 assert_se(items[1].item_prev == &items[3]);
86 assert_se(items[3].item_prev == NULL);
87
88 LIST_REMOVE(item, head, &items[1]);
89 assert_se(LIST_JUST_US(item, &items[1]));
90
91 assert_se(items[0].item_next == NULL);
92 assert_se(items[2].item_next == &items[0]);
93 assert_se(items[3].item_next == &items[2]);
94
95 assert_se(items[0].item_prev == &items[2]);
96 assert_se(items[2].item_prev == &items[3]);
97 assert_se(items[3].item_prev == NULL);
98
99 LIST_INSERT_BEFORE(item, head, &items[2], &items[1]);
100 assert_se(items[0].item_next == NULL);
101 assert_se(items[2].item_next == &items[0]);
102 assert_se(items[1].item_next == &items[2]);
103 assert_se(items[3].item_next == &items[1]);
104
105 assert_se(items[0].item_prev == &items[2]);
106 assert_se(items[2].item_prev == &items[1]);
107 assert_se(items[1].item_prev == &items[3]);
108 assert_se(items[3].item_prev == NULL);
109
110 LIST_REMOVE(item, head, &items[0]);
111 assert_se(LIST_JUST_US(item, &items[0]));
112
113 assert_se(items[2].item_next == NULL);
114 assert_se(items[1].item_next == &items[2]);
115 assert_se(items[3].item_next == &items[1]);
116
117 assert_se(items[2].item_prev == &items[1]);
118 assert_se(items[1].item_prev == &items[3]);
119 assert_se(items[3].item_prev == NULL);
120
121 LIST_INSERT_BEFORE(item, head, &items[3], &items[0]);
122 assert_se(items[2].item_next == NULL);
123 assert_se(items[1].item_next == &items[2]);
124 assert_se(items[3].item_next == &items[1]);
125 assert_se(items[0].item_next == &items[3]);
126
127 assert_se(items[2].item_prev == &items[1]);
128 assert_se(items[1].item_prev == &items[3]);
129 assert_se(items[3].item_prev == &items[0]);
130 assert_se(items[0].item_prev == NULL);
131 assert_se(head == &items[0]);
132
133 LIST_REMOVE(item, head, &items[0]);
134 assert_se(LIST_JUST_US(item, &items[0]));
135
136 assert_se(items[2].item_next == NULL);
137 assert_se(items[1].item_next == &items[2]);
138 assert_se(items[3].item_next == &items[1]);
139
140 assert_se(items[2].item_prev == &items[1]);
141 assert_se(items[1].item_prev == &items[3]);
142 assert_se(items[3].item_prev == NULL);
143
144 LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
145 assert_se(items[0].item_next == NULL);
146 assert_se(items[2].item_next == &items[0]);
147 assert_se(items[1].item_next == &items[2]);
148 assert_se(items[3].item_next == &items[1]);
149
150 assert_se(items[0].item_prev == &items[2]);
151 assert_se(items[2].item_prev == &items[1]);
152 assert_se(items[1].item_prev == &items[3]);
153 assert_se(items[3].item_prev == NULL);
154
155 LIST_REMOVE(item, head, &items[0]);
156 assert_se(LIST_JUST_US(item, &items[0]));
157
158 assert_se(items[2].item_next == NULL);
159 assert_se(items[1].item_next == &items[2]);
160 assert_se(items[3].item_next == &items[1]);
161
162 assert_se(items[2].item_prev == &items[1]);
163 assert_se(items[1].item_prev == &items[3]);
164 assert_se(items[3].item_prev == NULL);
165
166 LIST_REMOVE(item, head, &items[1]);
167 assert_se(LIST_JUST_US(item, &items[1]));
168
169 assert_se(items[2].item_next == NULL);
170 assert_se(items[3].item_next == &items[2]);
171
172 assert_se(items[2].item_prev == &items[3]);
173 assert_se(items[3].item_prev == NULL);
174
175 LIST_REMOVE(item, head, &items[2]);
176 assert_se(LIST_JUST_US(item, &items[2]));
177 assert_se(LIST_JUST_US(item, head));
178
179 LIST_REMOVE(item, head, &items[3]);
180 assert_se(LIST_JUST_US(item, &items[3]));
181
182 assert_se(head == NULL);
183
184 for (i = 0; i < ELEMENTSOF(items); i++) {
185 assert_se(LIST_JUST_US(item, &items[i]));
186 LIST_APPEND(item, head, &items[i]);
187 }
188
189 assert_se(!LIST_JUST_US(item, head));
190
191 assert_se(items[0].item_next == &items[1]);
192 assert_se(items[1].item_next == &items[2]);
193 assert_se(items[2].item_next == &items[3]);
194 assert_se(items[3].item_next == NULL);
195
196 assert_se(items[0].item_prev == NULL);
197 assert_se(items[1].item_prev == &items[0]);
198 assert_se(items[2].item_prev == &items[1]);
199 assert_se(items[3].item_prev == &items[2]);
200
201 for (i = 0; i < ELEMENTSOF(items); i++)
202 LIST_REMOVE(item, head, &items[i]);
203
204 assert_se(head == NULL);
205
206 for (i = 0; i < ELEMENTSOF(items) / 2; i++) {
207 LIST_INIT(item, &items[i]);
208 assert_se(LIST_JUST_US(item, &items[i]));
209 LIST_PREPEND(item, head, &items[i]);
210 }
211
212 for (i = ELEMENTSOF(items) / 2; i < ELEMENTSOF(items); i++) {
213 LIST_INIT(item, &items[i]);
214 assert_se(LIST_JUST_US(item, &items[i]));
215 LIST_PREPEND(item, head2, &items[i]);
216 }
217
218 assert_se(items[0].item_next == NULL);
219 assert_se(items[1].item_next == &items[0]);
220 assert_se(items[2].item_next == NULL);
221 assert_se(items[3].item_next == &items[2]);
222
223 assert_se(items[0].item_prev == &items[1]);
224 assert_se(items[1].item_prev == NULL);
225 assert_se(items[2].item_prev == &items[3]);
226 assert_se(items[3].item_prev == NULL);
227
228 LIST_JOIN(item, head2, head);
229 assert_se(head == NULL);
230
231 assert_se(items[0].item_next == NULL);
232 assert_se(items[1].item_next == &items[0]);
233 assert_se(items[2].item_next == &items[1]);
234 assert_se(items[3].item_next == &items[2]);
235
236 assert_se(items[0].item_prev == &items[1]);
237 assert_se(items[1].item_prev == &items[2]);
238 assert_se(items[2].item_prev == &items[3]);
239 assert_se(items[3].item_prev == NULL);
240
241 LIST_JOIN(item, head, head2);
242 assert_se(head2 == NULL);
243 assert_se(!LIST_IS_EMPTY(head));
244
245 for (i = 0; i < ELEMENTSOF(items); i++)
246 LIST_REMOVE(item, head, &items[i]);
247
248 assert_se(head == NULL);
249
250 LIST_PREPEND(item, head, items + 0);
251 LIST_PREPEND(item, head, items + 1);
252 LIST_PREPEND(item, head, items + 2);
253
254 assert_se(LIST_POP(item, head) == items + 2);
255 assert_se(LIST_POP(item, head) == items + 1);
256 assert_se(LIST_POP(item, head) == items + 0);
257 assert_se(LIST_POP(item, head) == NULL);
258
259 return 0;
260 }
261