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