chiark / gitweb /
c30803b55b5b77203e943ec4b6956ff0cee3fe3a
[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
8 #include "list.h"
9 #include "util.h"
10
11 int main(int argc, const char *argv[]) {
12         size_t i;
13         typedef struct list_item {
14                 LIST_FIELDS(struct list_item, item);
15         } list_item;
16         LIST_HEAD(list_item, head);
17         list_item items[4];
18         list_item *cursor;
19
20         LIST_HEAD_INIT(head);
21         assert_se(head == NULL);
22
23         for (i = 0; i < ELEMENTSOF(items); i++) {
24                 LIST_INIT(item, &items[i]);
25                 assert_se(LIST_JUST_US(item, &items[i]));
26                 LIST_PREPEND(item, head, &items[i]);
27         }
28
29         i = 0;
30         LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
31                 i++;
32                 assert_se(cursor != &items[2]);
33         }
34         assert_se(i == ELEMENTSOF(items)-1);
35
36         i = 0;
37         LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
38                 i++;
39                 assert_se(cursor != &items[0]);
40         }
41         assert_se(i == ELEMENTSOF(items)-1);
42
43         i = 0;
44         LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
45                 i++;
46                 assert_se(cursor != &items[3]);
47         }
48         assert_se(i == ELEMENTSOF(items)-1);
49
50         assert_se(!LIST_JUST_US(item, head));
51
52         assert_se(items[0].item_next == NULL);
53         assert_se(items[1].item_next == &items[0]);
54         assert_se(items[2].item_next == &items[1]);
55         assert_se(items[3].item_next == &items[2]);
56
57         assert_se(items[0].item_prev == &items[1]);
58         assert_se(items[1].item_prev == &items[2]);
59         assert_se(items[2].item_prev == &items[3]);
60         assert_se(items[3].item_prev == NULL);
61
62         LIST_FIND_HEAD(item, &items[0], cursor);
63         assert_se(cursor == &items[3]);
64
65         LIST_FIND_TAIL(item, &items[3], cursor);
66         assert_se(cursor == &items[0]);
67
68         LIST_REMOVE(item, head, &items[1]);
69         assert_se(LIST_JUST_US(item, &items[1]));
70
71         assert_se(items[0].item_next == NULL);
72         assert_se(items[2].item_next == &items[0]);
73         assert_se(items[3].item_next == &items[2]);
74
75         assert_se(items[0].item_prev == &items[2]);
76         assert_se(items[2].item_prev == &items[3]);
77         assert_se(items[3].item_prev == NULL);
78
79         LIST_INSERT_AFTER(item, head, &items[3], &items[1]);
80         assert_se(items[0].item_next == NULL);
81         assert_se(items[2].item_next == &items[0]);
82         assert_se(items[1].item_next == &items[2]);
83         assert_se(items[3].item_next == &items[1]);
84
85         assert_se(items[0].item_prev == &items[2]);
86         assert_se(items[2].item_prev == &items[1]);
87         assert_se(items[1].item_prev == &items[3]);
88         assert_se(items[3].item_prev == NULL);
89
90         LIST_REMOVE(item, head, &items[1]);
91         assert_se(LIST_JUST_US(item, &items[1]));
92
93         assert_se(items[0].item_next == NULL);
94         assert_se(items[2].item_next == &items[0]);
95         assert_se(items[3].item_next == &items[2]);
96
97         assert_se(items[0].item_prev == &items[2]);
98         assert_se(items[2].item_prev == &items[3]);
99         assert_se(items[3].item_prev == NULL);
100
101         LIST_INSERT_BEFORE(item, head, &items[2], &items[1]);
102         assert_se(items[0].item_next == NULL);
103         assert_se(items[2].item_next == &items[0]);
104         assert_se(items[1].item_next == &items[2]);
105         assert_se(items[3].item_next == &items[1]);
106
107         assert_se(items[0].item_prev == &items[2]);
108         assert_se(items[2].item_prev == &items[1]);
109         assert_se(items[1].item_prev == &items[3]);
110         assert_se(items[3].item_prev == NULL);
111
112         LIST_REMOVE(item, head, &items[0]);
113         assert_se(LIST_JUST_US(item, &items[0]));
114
115         assert_se(items[2].item_next == NULL);
116         assert_se(items[1].item_next == &items[2]);
117         assert_se(items[3].item_next == &items[1]);
118
119         assert_se(items[2].item_prev == &items[1]);
120         assert_se(items[1].item_prev == &items[3]);
121         assert_se(items[3].item_prev == NULL);
122
123         LIST_INSERT_BEFORE(item, head, &items[3], &items[0]);
124         assert_se(items[2].item_next == NULL);
125         assert_se(items[1].item_next == &items[2]);
126         assert_se(items[3].item_next == &items[1]);
127         assert_se(items[0].item_next == &items[3]);
128
129         assert_se(items[2].item_prev == &items[1]);
130         assert_se(items[1].item_prev == &items[3]);
131         assert_se(items[3].item_prev == &items[0]);
132         assert_se(items[0].item_prev == NULL);
133         assert_se(head == &items[0]);
134
135         LIST_REMOVE(item, head, &items[0]);
136         assert_se(LIST_JUST_US(item, &items[0]));
137
138         assert_se(items[2].item_next == NULL);
139         assert_se(items[1].item_next == &items[2]);
140         assert_se(items[3].item_next == &items[1]);
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 == NULL);
145
146         LIST_INSERT_BEFORE(item, head, NULL, &items[0]);
147         assert_se(items[0].item_next == NULL);
148         assert_se(items[2].item_next == &items[0]);
149         assert_se(items[1].item_next == &items[2]);
150         assert_se(items[3].item_next == &items[1]);
151
152         assert_se(items[0].item_prev == &items[2]);
153         assert_se(items[2].item_prev == &items[1]);
154         assert_se(items[1].item_prev == &items[3]);
155         assert_se(items[3].item_prev == NULL);
156
157         LIST_REMOVE(item, head, &items[0]);
158         assert_se(LIST_JUST_US(item, &items[0]));
159
160         assert_se(items[2].item_next == NULL);
161         assert_se(items[1].item_next == &items[2]);
162         assert_se(items[3].item_next == &items[1]);
163
164         assert_se(items[2].item_prev == &items[1]);
165         assert_se(items[1].item_prev == &items[3]);
166         assert_se(items[3].item_prev == NULL);
167
168         LIST_REMOVE(item, head, &items[1]);
169         assert_se(LIST_JUST_US(item, &items[1]));
170
171         assert_se(items[2].item_next == NULL);
172         assert_se(items[3].item_next == &items[2]);
173
174         assert_se(items[2].item_prev == &items[3]);
175         assert_se(items[3].item_prev == NULL);
176
177         LIST_REMOVE(item, head, &items[2]);
178         assert_se(LIST_JUST_US(item, &items[2]));
179         assert_se(LIST_JUST_US(item, head));
180
181         LIST_REMOVE(item, head, &items[3]);
182         assert_se(LIST_JUST_US(item, &items[3]));
183
184         assert_se(head == NULL);
185
186         for (i = 0; i < ELEMENTSOF(items); i++) {
187                 assert_se(LIST_JUST_US(item, &items[i]));
188                 LIST_APPEND(item, head, &items[i]);
189         }
190
191         assert_se(!LIST_JUST_US(item, head));
192
193         assert_se(items[0].item_next == &items[1]);
194         assert_se(items[1].item_next == &items[2]);
195         assert_se(items[2].item_next == &items[3]);
196         assert_se(items[3].item_next == NULL);
197
198         assert_se(items[0].item_prev == NULL);
199         assert_se(items[1].item_prev == &items[0]);
200         assert_se(items[2].item_prev == &items[1]);
201         assert_se(items[3].item_prev == &items[2]);
202
203         for (i = 0; i < ELEMENTSOF(items); i++)
204                 LIST_REMOVE(item, head, &items[i]);
205
206         assert_se(head == NULL);
207
208         return 0;
209 }