]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-list.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
3 Copyright © 2013 Jan Janssen
9 int main(int argc
, const char *argv
[]) {
11 typedef struct list_item
{
12 LIST_FIELDS(struct list_item
, item
);
14 LIST_HEAD(list_item
, head
);
15 LIST_HEAD(list_item
, head2
);
20 LIST_HEAD_INIT(head2
);
21 assert_se(head
== NULL
);
22 assert_se(head2
== NULL
);
24 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
25 LIST_INIT(item
, &items
[i
]);
26 assert_se(LIST_JUST_US(item
, &items
[i
]));
27 LIST_PREPEND(item
, head
, &items
[i
]);
31 LIST_FOREACH_OTHERS(item
, cursor
, &items
[2]) {
33 assert_se(cursor
!= &items
[2]);
35 assert_se(i
== ELEMENTSOF(items
)-1);
38 LIST_FOREACH_OTHERS(item
, cursor
, &items
[0]) {
40 assert_se(cursor
!= &items
[0]);
42 assert_se(i
== ELEMENTSOF(items
)-1);
45 LIST_FOREACH_OTHERS(item
, cursor
, &items
[3]) {
47 assert_se(cursor
!= &items
[3]);
49 assert_se(i
== ELEMENTSOF(items
)-1);
51 assert_se(!LIST_JUST_US(item
, head
));
53 assert_se(items
[0].item_next
== NULL
);
54 assert_se(items
[1].item_next
== &items
[0]);
55 assert_se(items
[2].item_next
== &items
[1]);
56 assert_se(items
[3].item_next
== &items
[2]);
58 assert_se(items
[0].item_prev
== &items
[1]);
59 assert_se(items
[1].item_prev
== &items
[2]);
60 assert_se(items
[2].item_prev
== &items
[3]);
61 assert_se(items
[3].item_prev
== NULL
);
63 LIST_FIND_HEAD(item
, &items
[0], cursor
);
64 assert_se(cursor
== &items
[3]);
66 LIST_FIND_TAIL(item
, &items
[3], cursor
);
67 assert_se(cursor
== &items
[0]);
69 LIST_REMOVE(item
, head
, &items
[1]);
70 assert_se(LIST_JUST_US(item
, &items
[1]));
72 assert_se(items
[0].item_next
== NULL
);
73 assert_se(items
[2].item_next
== &items
[0]);
74 assert_se(items
[3].item_next
== &items
[2]);
76 assert_se(items
[0].item_prev
== &items
[2]);
77 assert_se(items
[2].item_prev
== &items
[3]);
78 assert_se(items
[3].item_prev
== NULL
);
80 LIST_INSERT_AFTER(item
, head
, &items
[3], &items
[1]);
81 assert_se(items
[0].item_next
== NULL
);
82 assert_se(items
[2].item_next
== &items
[0]);
83 assert_se(items
[1].item_next
== &items
[2]);
84 assert_se(items
[3].item_next
== &items
[1]);
86 assert_se(items
[0].item_prev
== &items
[2]);
87 assert_se(items
[2].item_prev
== &items
[1]);
88 assert_se(items
[1].item_prev
== &items
[3]);
89 assert_se(items
[3].item_prev
== NULL
);
91 LIST_REMOVE(item
, head
, &items
[1]);
92 assert_se(LIST_JUST_US(item
, &items
[1]));
94 assert_se(items
[0].item_next
== NULL
);
95 assert_se(items
[2].item_next
== &items
[0]);
96 assert_se(items
[3].item_next
== &items
[2]);
98 assert_se(items
[0].item_prev
== &items
[2]);
99 assert_se(items
[2].item_prev
== &items
[3]);
100 assert_se(items
[3].item_prev
== NULL
);
102 LIST_INSERT_BEFORE(item
, head
, &items
[2], &items
[1]);
103 assert_se(items
[0].item_next
== NULL
);
104 assert_se(items
[2].item_next
== &items
[0]);
105 assert_se(items
[1].item_next
== &items
[2]);
106 assert_se(items
[3].item_next
== &items
[1]);
108 assert_se(items
[0].item_prev
== &items
[2]);
109 assert_se(items
[2].item_prev
== &items
[1]);
110 assert_se(items
[1].item_prev
== &items
[3]);
111 assert_se(items
[3].item_prev
== NULL
);
113 LIST_REMOVE(item
, head
, &items
[0]);
114 assert_se(LIST_JUST_US(item
, &items
[0]));
116 assert_se(items
[2].item_next
== NULL
);
117 assert_se(items
[1].item_next
== &items
[2]);
118 assert_se(items
[3].item_next
== &items
[1]);
120 assert_se(items
[2].item_prev
== &items
[1]);
121 assert_se(items
[1].item_prev
== &items
[3]);
122 assert_se(items
[3].item_prev
== NULL
);
124 LIST_INSERT_BEFORE(item
, head
, &items
[3], &items
[0]);
125 assert_se(items
[2].item_next
== NULL
);
126 assert_se(items
[1].item_next
== &items
[2]);
127 assert_se(items
[3].item_next
== &items
[1]);
128 assert_se(items
[0].item_next
== &items
[3]);
130 assert_se(items
[2].item_prev
== &items
[1]);
131 assert_se(items
[1].item_prev
== &items
[3]);
132 assert_se(items
[3].item_prev
== &items
[0]);
133 assert_se(items
[0].item_prev
== NULL
);
134 assert_se(head
== &items
[0]);
136 LIST_REMOVE(item
, head
, &items
[0]);
137 assert_se(LIST_JUST_US(item
, &items
[0]));
139 assert_se(items
[2].item_next
== NULL
);
140 assert_se(items
[1].item_next
== &items
[2]);
141 assert_se(items
[3].item_next
== &items
[1]);
143 assert_se(items
[2].item_prev
== &items
[1]);
144 assert_se(items
[1].item_prev
== &items
[3]);
145 assert_se(items
[3].item_prev
== NULL
);
147 LIST_INSERT_BEFORE(item
, head
, NULL
, &items
[0]);
148 assert_se(items
[0].item_next
== NULL
);
149 assert_se(items
[2].item_next
== &items
[0]);
150 assert_se(items
[1].item_next
== &items
[2]);
151 assert_se(items
[3].item_next
== &items
[1]);
153 assert_se(items
[0].item_prev
== &items
[2]);
154 assert_se(items
[2].item_prev
== &items
[1]);
155 assert_se(items
[1].item_prev
== &items
[3]);
156 assert_se(items
[3].item_prev
== NULL
);
158 LIST_REMOVE(item
, head
, &items
[0]);
159 assert_se(LIST_JUST_US(item
, &items
[0]));
161 assert_se(items
[2].item_next
== NULL
);
162 assert_se(items
[1].item_next
== &items
[2]);
163 assert_se(items
[3].item_next
== &items
[1]);
165 assert_se(items
[2].item_prev
== &items
[1]);
166 assert_se(items
[1].item_prev
== &items
[3]);
167 assert_se(items
[3].item_prev
== NULL
);
169 LIST_REMOVE(item
, head
, &items
[1]);
170 assert_se(LIST_JUST_US(item
, &items
[1]));
172 assert_se(items
[2].item_next
== NULL
);
173 assert_se(items
[3].item_next
== &items
[2]);
175 assert_se(items
[2].item_prev
== &items
[3]);
176 assert_se(items
[3].item_prev
== NULL
);
178 LIST_REMOVE(item
, head
, &items
[2]);
179 assert_se(LIST_JUST_US(item
, &items
[2]));
180 assert_se(LIST_JUST_US(item
, head
));
182 LIST_REMOVE(item
, head
, &items
[3]);
183 assert_se(LIST_JUST_US(item
, &items
[3]));
185 assert_se(head
== NULL
);
187 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
188 assert_se(LIST_JUST_US(item
, &items
[i
]));
189 LIST_APPEND(item
, head
, &items
[i
]);
192 assert_se(!LIST_JUST_US(item
, head
));
194 assert_se(items
[0].item_next
== &items
[1]);
195 assert_se(items
[1].item_next
== &items
[2]);
196 assert_se(items
[2].item_next
== &items
[3]);
197 assert_se(items
[3].item_next
== NULL
);
199 assert_se(items
[0].item_prev
== NULL
);
200 assert_se(items
[1].item_prev
== &items
[0]);
201 assert_se(items
[2].item_prev
== &items
[1]);
202 assert_se(items
[3].item_prev
== &items
[2]);
204 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
205 LIST_REMOVE(item
, head
, &items
[i
]);
207 assert_se(head
== NULL
);
209 for (i
= 0; i
< ELEMENTSOF(items
) / 2; i
++) {
210 LIST_INIT(item
, &items
[i
]);
211 assert_se(LIST_JUST_US(item
, &items
[i
]));
212 LIST_PREPEND(item
, head
, &items
[i
]);
215 for (i
= ELEMENTSOF(items
) / 2; i
< ELEMENTSOF(items
); i
++) {
216 LIST_INIT(item
, &items
[i
]);
217 assert_se(LIST_JUST_US(item
, &items
[i
]));
218 LIST_PREPEND(item
, head2
, &items
[i
]);
221 assert_se(items
[0].item_next
== NULL
);
222 assert_se(items
[1].item_next
== &items
[0]);
223 assert_se(items
[2].item_next
== NULL
);
224 assert_se(items
[3].item_next
== &items
[2]);
226 assert_se(items
[0].item_prev
== &items
[1]);
227 assert_se(items
[1].item_prev
== NULL
);
228 assert_se(items
[2].item_prev
== &items
[3]);
229 assert_se(items
[3].item_prev
== NULL
);
231 LIST_JOIN(item
, head2
, head
);
232 assert_se(head
== NULL
);
234 assert_se(items
[0].item_next
== NULL
);
235 assert_se(items
[1].item_next
== &items
[0]);
236 assert_se(items
[2].item_next
== &items
[1]);
237 assert_se(items
[3].item_next
== &items
[2]);
239 assert_se(items
[0].item_prev
== &items
[1]);
240 assert_se(items
[1].item_prev
== &items
[2]);
241 assert_se(items
[2].item_prev
== &items
[3]);
242 assert_se(items
[3].item_prev
== NULL
);
244 LIST_JOIN(item
, head
, head2
);
245 assert_se(head2
== NULL
);
246 assert_se(!LIST_IS_EMPTY(head
));
248 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
249 LIST_REMOVE(item
, head
, &items
[i
]);
251 assert_se(head
== NULL
);