chiark / gitweb /
Prep v236 : Add missing SPDX-License-Identifier (8/9) src/test
[elogind.git] / src / test / test-list.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
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
24 int 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
33         LIST_HEAD_INIT(head);
34         assert_se(head == NULL);
35
36         for (i = 0; i < ELEMENTSOF(items); i++) {
37                 LIST_INIT(item, &items[i]);
38                 assert_se(LIST_JUST_US(item, &items[i]));
39                 LIST_PREPEND(item, head, &items[i]);
40         }
41
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
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
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
75         LIST_FIND_HEAD(item, &items[0], cursor);
76         assert_se(cursor == &items[3]);
77
78         LIST_FIND_TAIL(item, &items[3], cursor);
79         assert_se(cursor == &items[0]);
80
81         LIST_REMOVE(item, head, &items[1]);
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
92         LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
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]);
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
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
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]);
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
170         LIST_REMOVE(item, head, &items[0]);
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
181         LIST_REMOVE(item, head, &items[1]);
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
190         LIST_REMOVE(item, head, &items[2]);
191         assert_se(LIST_JUST_US(item, &items[2]));
192         assert_se(LIST_JUST_US(item, head));
193
194         LIST_REMOVE(item, head, &items[3]);
195         assert_se(LIST_JUST_US(item, &items[3]));
196
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++)
217                 LIST_REMOVE(item, head, &items[i]);
218
219         assert_se(head == NULL);
220
221         return 0;
222 }