]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-list.c
udev-builtin-blkid: Use _cleanup_blkid_free_probe_ to free probe (#6108)
[thirdparty/systemd.git] / src / test / test-list.c
1 /***
2 This file is part of systemd
3
4 Copyright 2013 Jan Janssen
5
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
10
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
18 ***/
19
20 #include "list.h"
21 #include "util.h"
22
23 int main(int argc, const char *argv[]) {
24 size_t i;
25 typedef struct list_item {
26 LIST_FIELDS(struct list_item, item);
27 } list_item;
28 LIST_HEAD(list_item, head);
29 list_item items[4];
30 list_item *cursor;
31
32 LIST_HEAD_INIT(head);
33 assert_se(head == NULL);
34
35 for (i = 0; i < ELEMENTSOF(items); i++) {
36 LIST_INIT(item, &items[i]);
37 assert_se(LIST_JUST_US(item, &items[i]));
38 LIST_PREPEND(item, head, &items[i]);
39 }
40
41 i = 0;
42 LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
43 i++;
44 assert_se(cursor != &items[2]);
45 }
46 assert_se(i == ELEMENTSOF(items)-1);
47
48 i = 0;
49 LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
50 i++;
51 assert_se(cursor != &items[0]);
52 }
53 assert_se(i == ELEMENTSOF(items)-1);
54
55 i = 0;
56 LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
57 i++;
58 assert_se(cursor != &items[3]);
59 }
60 assert_se(i == ELEMENTSOF(items)-1);
61
62 assert_se(!LIST_JUST_US(item, head));
63
64 assert_se(items[0].item_next == NULL);
65 assert_se(items[1].item_next == &items[0]);
66 assert_se(items[2].item_next == &items[1]);
67 assert_se(items[3].item_next == &items[2]);
68
69 assert_se(items[0].item_prev == &items[1]);
70 assert_se(items[1].item_prev == &items[2]);
71 assert_se(items[2].item_prev == &items[3]);
72 assert_se(items[3].item_prev == NULL);
73
74 LIST_FIND_HEAD(item, &items[0], cursor);
75 assert_se(cursor == &items[3]);
76
77 LIST_FIND_TAIL(item, &items[3], cursor);
78 assert_se(cursor == &items[0]);
79
80 LIST_REMOVE(item, head, &items[1]);
81 assert_se(LIST_JUST_US(item, &items[1]));
82
83 assert_se(items[0].item_next == NULL);
84 assert_se(items[2].item_next == &items[0]);
85 assert_se(items[3].item_next == &items[2]);
86
87 assert_se(items[0].item_prev == &items[2]);
88 assert_se(items[2].item_prev == &items[3]);
89 assert_se(items[3].item_prev == NULL);
90
91 LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
92 assert_se(items[0].item_next == NULL);
93 assert_se(items[2].item_next == &items[0]);
94 assert_se(items[1].item_next == &items[2]);
95 assert_se(items[3].item_next == &items[1]);
96
97 assert_se(items[0].item_prev == &items[2]);
98 assert_se(items[2].item_prev == &items[1]);
99 assert_se(items[1].item_prev == &items[3]);
100 assert_se(items[3].item_prev == NULL);
101
102 LIST_REMOVE(item, head, &items[1]);
103 assert_se(LIST_JUST_US(item, &items[1]));
104
105 assert_se(items[0].item_next == NULL);
106 assert_se(items[2].item_next == &items[0]);
107 assert_se(items[3].item_next == &items[2]);
108
109 assert_se(items[0].item_prev == &items[2]);
110 assert_se(items[2].item_prev == &items[3]);
111 assert_se(items[3].item_prev == NULL);
112
113 LIST_INSERT_BEFORE(item, head, &items[2], &items[1]);
114 assert_se(items[0].item_next == NULL);
115 assert_se(items[2].item_next == &items[0]);
116 assert_se(items[1].item_next == &items[2]);
117 assert_se(items[3].item_next == &items[1]);
118
119 assert_se(items[0].item_prev == &items[2]);
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);
123
124 LIST_REMOVE(item, head, &items[0]);
125 assert_se(LIST_JUST_US(item, &items[0]));
126
127 assert_se(items[2].item_next == NULL);
128 assert_se(items[1].item_next == &items[2]);
129 assert_se(items[3].item_next == &items[1]);
130
131 assert_se(items[2].item_prev == &items[1]);
132 assert_se(items[1].item_prev == &items[3]);
133 assert_se(items[3].item_prev == NULL);
134
135 LIST_INSERT_BEFORE(item, head, &items[3], &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]);
139 assert_se(items[0].item_next == &items[3]);
140
141 assert_se(items[2].item_prev == &items[1]);
142 assert_se(items[1].item_prev == &items[3]);
143 assert_se(items[3].item_prev == &items[0]);
144 assert_se(items[0].item_prev == NULL);
145 assert_se(head == &items[0]);
146
147 LIST_REMOVE(item, head, &items[0]);
148 assert_se(LIST_JUST_US(item, &items[0]));
149
150 assert_se(items[2].item_next == NULL);
151 assert_se(items[1].item_next == &items[2]);
152 assert_se(items[3].item_next == &items[1]);
153
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);
157
158 LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
159 assert_se(items[0].item_next == NULL);
160 assert_se(items[2].item_next == &items[0]);
161 assert_se(items[1].item_next == &items[2]);
162 assert_se(items[3].item_next == &items[1]);
163
164 assert_se(items[0].item_prev == &items[2]);
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);
168
169 LIST_REMOVE(item, head, &items[0]);
170 assert_se(LIST_JUST_US(item, &items[0]));
171
172 assert_se(items[2].item_next == NULL);
173 assert_se(items[1].item_next == &items[2]);
174 assert_se(items[3].item_next == &items[1]);
175
176 assert_se(items[2].item_prev == &items[1]);
177 assert_se(items[1].item_prev == &items[3]);
178 assert_se(items[3].item_prev == NULL);
179
180 LIST_REMOVE(item, head, &items[1]);
181 assert_se(LIST_JUST_US(item, &items[1]));
182
183 assert_se(items[2].item_next == NULL);
184 assert_se(items[3].item_next == &items[2]);
185
186 assert_se(items[2].item_prev == &items[3]);
187 assert_se(items[3].item_prev == NULL);
188
189 LIST_REMOVE(item, head, &items[2]);
190 assert_se(LIST_JUST_US(item, &items[2]));
191 assert_se(LIST_JUST_US(item, head));
192
193 LIST_REMOVE(item, head, &items[3]);
194 assert_se(LIST_JUST_US(item, &items[3]));
195
196 assert_se(head == NULL);
197
198 for (i = 0; i < ELEMENTSOF(items); i++) {
199 assert_se(LIST_JUST_US(item, &items[i]));
200 LIST_APPEND(item, head, &items[i]);
201 }
202
203 assert_se(!LIST_JUST_US(item, head));
204
205 assert_se(items[0].item_next == &items[1]);
206 assert_se(items[1].item_next == &items[2]);
207 assert_se(items[2].item_next == &items[3]);
208 assert_se(items[3].item_next == NULL);
209
210 assert_se(items[0].item_prev == NULL);
211 assert_se(items[1].item_prev == &items[0]);
212 assert_se(items[2].item_prev == &items[1]);
213 assert_se(items[3].item_prev == &items[2]);
214
215 for (i = 0; i < ELEMENTSOF(items); i++)
216 LIST_REMOVE(item, head, &items[i]);
217
218 assert_se(head == NULL);
219
220 return 0;
221 }