]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-list.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 #include "alloc-util.h"
7 int main(int argc
, const char *argv
[]) {
8 test_setup_logging(LOG_DEBUG
);
11 typedef struct list_item
{
12 LIST_FIELDS(struct list_item
, item_list
);
14 LIST_HEAD(list_item
, head
);
15 LIST_HEAD(list_item
, head2
);
19 LIST_HEAD_INIT(head2
);
20 assert_se(head
== NULL
);
21 assert_se(head2
== NULL
);
23 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
24 LIST_INIT(item_list
, &items
[i
]);
25 assert_se(LIST_JUST_US(item_list
, &items
[i
]));
26 assert_se(LIST_PREPEND(item_list
, head
, &items
[i
]) == &items
[i
]);
30 LIST_FOREACH_OTHERS(item_list
, cursor
, &items
[2]) {
32 assert_se(cursor
!= &items
[2]);
34 assert_se(i
== ELEMENTSOF(items
)-1);
37 LIST_FOREACH_OTHERS(item_list
, cursor
, &items
[0]) {
39 assert_se(cursor
!= &items
[0]);
41 assert_se(i
== ELEMENTSOF(items
)-1);
44 LIST_FOREACH_OTHERS(item_list
, cursor
, &items
[3]) {
46 assert_se(cursor
!= &items
[3]);
48 assert_se(i
== ELEMENTSOF(items
)-1);
50 assert_se(!LIST_JUST_US(item_list
, head
));
52 assert_se(items
[0].item_list_next
== NULL
);
53 assert_se(items
[1].item_list_next
== &items
[0]);
54 assert_se(items
[2].item_list_next
== &items
[1]);
55 assert_se(items
[3].item_list_next
== &items
[2]);
57 assert_se(items
[0].item_list_prev
== &items
[1]);
58 assert_se(items
[1].item_list_prev
== &items
[2]);
59 assert_se(items
[2].item_list_prev
== &items
[3]);
60 assert_se(items
[3].item_list_prev
== NULL
);
62 list_item
*cursor
= LIST_FIND_HEAD(item_list
, &items
[0]);
63 assert_se(cursor
== &items
[3]);
65 cursor
= LIST_FIND_TAIL(item_list
, &items
[3]);
66 assert_se(cursor
== &items
[0]);
68 assert_se(LIST_REMOVE(item_list
, head
, &items
[1]) == &items
[1]);
69 assert_se(LIST_JUST_US(item_list
, &items
[1]));
71 assert_se(items
[0].item_list_next
== NULL
);
72 assert_se(items
[2].item_list_next
== &items
[0]);
73 assert_se(items
[3].item_list_next
== &items
[2]);
75 assert_se(items
[0].item_list_prev
== &items
[2]);
76 assert_se(items
[2].item_list_prev
== &items
[3]);
77 assert_se(items
[3].item_list_prev
== NULL
);
79 assert_se(LIST_INSERT_AFTER(item_list
, head
, &items
[3], &items
[1]) == &items
[1]);
80 assert_se(items
[0].item_list_next
== NULL
);
81 assert_se(items
[2].item_list_next
== &items
[0]);
82 assert_se(items
[1].item_list_next
== &items
[2]);
83 assert_se(items
[3].item_list_next
== &items
[1]);
85 assert_se(items
[0].item_list_prev
== &items
[2]);
86 assert_se(items
[2].item_list_prev
== &items
[1]);
87 assert_se(items
[1].item_list_prev
== &items
[3]);
88 assert_se(items
[3].item_list_prev
== NULL
);
90 assert_se(LIST_REMOVE(item_list
, head
, &items
[1]) == &items
[1]);
91 assert_se(LIST_JUST_US(item_list
, &items
[1]));
93 assert_se(items
[0].item_list_next
== NULL
);
94 assert_se(items
[2].item_list_next
== &items
[0]);
95 assert_se(items
[3].item_list_next
== &items
[2]);
97 assert_se(items
[0].item_list_prev
== &items
[2]);
98 assert_se(items
[2].item_list_prev
== &items
[3]);
99 assert_se(items
[3].item_list_prev
== NULL
);
101 assert_se(LIST_INSERT_BEFORE(item_list
, head
, &items
[2], &items
[1]) == &items
[1]);
102 assert_se(items
[0].item_list_next
== NULL
);
103 assert_se(items
[2].item_list_next
== &items
[0]);
104 assert_se(items
[1].item_list_next
== &items
[2]);
105 assert_se(items
[3].item_list_next
== &items
[1]);
107 assert_se(items
[0].item_list_prev
== &items
[2]);
108 assert_se(items
[2].item_list_prev
== &items
[1]);
109 assert_se(items
[1].item_list_prev
== &items
[3]);
110 assert_se(items
[3].item_list_prev
== NULL
);
112 assert_se(LIST_REMOVE(item_list
, head
, &items
[0]) == &items
[0]);
113 assert_se(LIST_JUST_US(item_list
, &items
[0]));
115 assert_se(items
[2].item_list_next
== NULL
);
116 assert_se(items
[1].item_list_next
== &items
[2]);
117 assert_se(items
[3].item_list_next
== &items
[1]);
119 assert_se(items
[2].item_list_prev
== &items
[1]);
120 assert_se(items
[1].item_list_prev
== &items
[3]);
121 assert_se(items
[3].item_list_prev
== NULL
);
123 assert_se(LIST_INSERT_BEFORE(item_list
, head
, &items
[3], &items
[0]) == &items
[0]);
124 assert_se(items
[2].item_list_next
== NULL
);
125 assert_se(items
[1].item_list_next
== &items
[2]);
126 assert_se(items
[3].item_list_next
== &items
[1]);
127 assert_se(items
[0].item_list_next
== &items
[3]);
129 assert_se(items
[2].item_list_prev
== &items
[1]);
130 assert_se(items
[1].item_list_prev
== &items
[3]);
131 assert_se(items
[3].item_list_prev
== &items
[0]);
132 assert_se(items
[0].item_list_prev
== NULL
);
133 assert_se(head
== &items
[0]);
135 assert_se(LIST_REMOVE(item_list
, head
, &items
[0]) == &items
[0]);
136 assert_se(LIST_JUST_US(item_list
, &items
[0]));
138 assert_se(items
[2].item_list_next
== NULL
);
139 assert_se(items
[1].item_list_next
== &items
[2]);
140 assert_se(items
[3].item_list_next
== &items
[1]);
142 assert_se(items
[2].item_list_prev
== &items
[1]);
143 assert_se(items
[1].item_list_prev
== &items
[3]);
144 assert_se(items
[3].item_list_prev
== NULL
);
146 assert_se(LIST_INSERT_BEFORE(item_list
, head
, NULL
, &items
[0]) == &items
[0]);
147 assert_se(items
[0].item_list_next
== NULL
);
148 assert_se(items
[2].item_list_next
== &items
[0]);
149 assert_se(items
[1].item_list_next
== &items
[2]);
150 assert_se(items
[3].item_list_next
== &items
[1]);
152 assert_se(items
[0].item_list_prev
== &items
[2]);
153 assert_se(items
[2].item_list_prev
== &items
[1]);
154 assert_se(items
[1].item_list_prev
== &items
[3]);
155 assert_se(items
[3].item_list_prev
== NULL
);
157 assert_se(LIST_REMOVE(item_list
, head
, &items
[0]) == &items
[0]);
158 assert_se(LIST_JUST_US(item_list
, &items
[0]));
160 assert_se(items
[2].item_list_next
== NULL
);
161 assert_se(items
[1].item_list_next
== &items
[2]);
162 assert_se(items
[3].item_list_next
== &items
[1]);
164 assert_se(items
[2].item_list_prev
== &items
[1]);
165 assert_se(items
[1].item_list_prev
== &items
[3]);
166 assert_se(items
[3].item_list_prev
== NULL
);
168 assert_se(LIST_REMOVE(item_list
, head
, &items
[1]) == &items
[1]);
169 assert_se(LIST_JUST_US(item_list
, &items
[1]));
171 assert_se(items
[2].item_list_next
== NULL
);
172 assert_se(items
[3].item_list_next
== &items
[2]);
174 assert_se(items
[2].item_list_prev
== &items
[3]);
175 assert_se(items
[3].item_list_prev
== NULL
);
177 assert_se(LIST_REMOVE(item_list
, head
, &items
[2]) == &items
[2]);
178 assert_se(LIST_JUST_US(item_list
, &items
[2]));
179 assert_se(LIST_JUST_US(item_list
, head
));
181 assert_se(LIST_REMOVE(item_list
, head
, &items
[3]) == &items
[3]);
182 assert_se(LIST_JUST_US(item_list
, &items
[3]));
184 assert_se(head
== NULL
);
186 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
187 assert_se(LIST_JUST_US(item_list
, &items
[i
]));
188 assert_se(LIST_APPEND(item_list
, head
, &items
[i
]) == &items
[i
]);
191 assert_se(!LIST_JUST_US(item_list
, head
));
193 assert_se(items
[0].item_list_next
== &items
[1]);
194 assert_se(items
[1].item_list_next
== &items
[2]);
195 assert_se(items
[2].item_list_next
== &items
[3]);
196 assert_se(items
[3].item_list_next
== NULL
);
198 assert_se(items
[0].item_list_prev
== NULL
);
199 assert_se(items
[1].item_list_prev
== &items
[0]);
200 assert_se(items
[2].item_list_prev
== &items
[1]);
201 assert_se(items
[3].item_list_prev
== &items
[2]);
203 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
204 assert_se(LIST_REMOVE(item_list
, head
, &items
[i
]) == &items
[i
]);
206 assert_se(head
== NULL
);
208 for (i
= 0; i
< ELEMENTSOF(items
) / 2; i
++) {
209 LIST_INIT(item_list
, &items
[i
]);
210 assert_se(LIST_JUST_US(item_list
, &items
[i
]));
211 assert_se(LIST_PREPEND(item_list
, head
, &items
[i
]) == &items
[i
]);
214 for (i
= ELEMENTSOF(items
) / 2; i
< ELEMENTSOF(items
); i
++) {
215 LIST_INIT(item_list
, &items
[i
]);
216 assert_se(LIST_JUST_US(item_list
, &items
[i
]));
217 assert_se(LIST_PREPEND(item_list
, head2
, &items
[i
]) == &items
[i
]);
220 assert_se(items
[0].item_list_next
== NULL
);
221 assert_se(items
[1].item_list_next
== &items
[0]);
222 assert_se(items
[2].item_list_next
== NULL
);
223 assert_se(items
[3].item_list_next
== &items
[2]);
225 assert_se(items
[0].item_list_prev
== &items
[1]);
226 assert_se(items
[1].item_list_prev
== NULL
);
227 assert_se(items
[2].item_list_prev
== &items
[3]);
228 assert_se(items
[3].item_list_prev
== NULL
);
230 assert_se(LIST_JOIN(item_list
, head2
, head
) == head2
);
231 assert_se(head
== NULL
);
233 assert_se(items
[0].item_list_next
== NULL
);
234 assert_se(items
[1].item_list_next
== &items
[0]);
235 assert_se(items
[2].item_list_next
== &items
[1]);
236 assert_se(items
[3].item_list_next
== &items
[2]);
238 assert_se(items
[0].item_list_prev
== &items
[1]);
239 assert_se(items
[1].item_list_prev
== &items
[2]);
240 assert_se(items
[2].item_list_prev
== &items
[3]);
241 assert_se(items
[3].item_list_prev
== NULL
);
243 assert_se(LIST_JOIN(item_list
, head
, head2
) == head
);
244 assert_se(head2
== NULL
);
247 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
248 assert_se(LIST_REMOVE(item_list
, head
, &items
[i
]) == &items
[i
]);
250 assert_se(head
== NULL
);
252 assert_se(LIST_PREPEND(item_list
, head
, items
+ 0) == items
+ 0);
253 assert_se(LIST_PREPEND(item_list
, head
, items
+ 1) == items
+ 1);
254 assert_se(LIST_PREPEND(item_list
, head
, items
+ 2) == items
+ 2);
256 assert_se(LIST_POP(item_list
, head
) == items
+ 2);
257 assert_se(LIST_POP(item_list
, head
) == items
+ 1);
258 assert_se(LIST_POP(item_list
, head
) == items
+ 0);
259 assert_se(LIST_POP(item_list
, head
) == NULL
);
261 /* No-op on an empty list */
263 LIST_CLEAR(item_list
, head
, free
);
265 /* A non-empty list is cleared */
267 assert_se(LIST_PREPEND(item_list
, head
, new0(list_item
, 1)));
268 assert_se(LIST_PREPEND(item_list
, head
, new0(list_item
, 1)));
270 LIST_CLEAR(item_list
, head
, free
);
272 assert_se(head
== NULL
);
274 /* A list can be cleared partially */
276 assert_se(LIST_PREPEND(item_list
, head
, new0(list_item
, 1)));
277 assert_se(LIST_PREPEND(item_list
, head
, new0(list_item
, 1)));
278 assert_se(LIST_PREPEND(item_list
, head
, items
+ 0) == items
+ 0);
280 LIST_CLEAR(item_list
, head
->item_list_next
, free
);
282 assert_se(head
== items
+ 0);
283 assert_se(head
->item_list_next
== NULL
);