]>
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
);
19 assert_se(head
== NULL
);
21 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
22 LIST_INIT(item
, &items
[i
]);
23 assert_se(LIST_JUST_US(item
, &items
[i
]));
24 LIST_PREPEND(item
, head
, &items
[i
]);
28 LIST_FOREACH_OTHERS(item
, cursor
, &items
[2]) {
30 assert_se(cursor
!= &items
[2]);
32 assert_se(i
== ELEMENTSOF(items
)-1);
35 LIST_FOREACH_OTHERS(item
, cursor
, &items
[0]) {
37 assert_se(cursor
!= &items
[0]);
39 assert_se(i
== ELEMENTSOF(items
)-1);
42 LIST_FOREACH_OTHERS(item
, cursor
, &items
[3]) {
44 assert_se(cursor
!= &items
[3]);
46 assert_se(i
== ELEMENTSOF(items
)-1);
48 assert_se(!LIST_JUST_US(item
, head
));
50 assert_se(items
[0].item_next
== NULL
);
51 assert_se(items
[1].item_next
== &items
[0]);
52 assert_se(items
[2].item_next
== &items
[1]);
53 assert_se(items
[3].item_next
== &items
[2]);
55 assert_se(items
[0].item_prev
== &items
[1]);
56 assert_se(items
[1].item_prev
== &items
[2]);
57 assert_se(items
[2].item_prev
== &items
[3]);
58 assert_se(items
[3].item_prev
== NULL
);
60 LIST_FIND_HEAD(item
, &items
[0], cursor
);
61 assert_se(cursor
== &items
[3]);
63 LIST_FIND_TAIL(item
, &items
[3], cursor
);
64 assert_se(cursor
== &items
[0]);
66 LIST_REMOVE(item
, head
, &items
[1]);
67 assert_se(LIST_JUST_US(item
, &items
[1]));
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]);
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
);
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]);
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
);
88 LIST_REMOVE(item
, head
, &items
[1]);
89 assert_se(LIST_JUST_US(item
, &items
[1]));
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]);
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
);
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]);
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
);
110 LIST_REMOVE(item
, head
, &items
[0]);
111 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
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]);
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]);
133 LIST_REMOVE(item
, head
, &items
[0]);
134 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
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]);
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
);
155 LIST_REMOVE(item
, head
, &items
[0]);
156 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
166 LIST_REMOVE(item
, head
, &items
[1]);
167 assert_se(LIST_JUST_US(item
, &items
[1]));
169 assert_se(items
[2].item_next
== NULL
);
170 assert_se(items
[3].item_next
== &items
[2]);
172 assert_se(items
[2].item_prev
== &items
[3]);
173 assert_se(items
[3].item_prev
== NULL
);
175 LIST_REMOVE(item
, head
, &items
[2]);
176 assert_se(LIST_JUST_US(item
, &items
[2]));
177 assert_se(LIST_JUST_US(item
, head
));
179 LIST_REMOVE(item
, head
, &items
[3]);
180 assert_se(LIST_JUST_US(item
, &items
[3]));
182 assert_se(head
== NULL
);
184 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
185 assert_se(LIST_JUST_US(item
, &items
[i
]));
186 LIST_APPEND(item
, head
, &items
[i
]);
189 assert_se(!LIST_JUST_US(item
, head
));
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
);
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]);
201 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
202 LIST_REMOVE(item
, head
, &items
[i
]);
204 assert_se(head
== NULL
);