chiark / gitweb /
a1345d740329552c7c8209cbf2244c2be16d7b79
[elogind.git] / src / test / test-list.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 /***
3   Copyright 2013 Jan Janssen
4 ***/
5
6 #include "list.h"
7 #include "util.h"
8
9 int main(int argc, const char *argv[]) {
10         size_t i;
11         typedef struct list_item {
12                 LIST_FIELDS(struct list_item, item);
13         } list_item;
14         LIST_HEAD(list_item, head);
15         list_item items[4];
16         list_item *cursor;
17
18         LIST_HEAD_INIT(head);
19         assert_se(head == NULL);
20
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]);
25         }
26
27         i = 0;
28         LIST_FOREACH_OTHERS(item, cursor, &items[2]) {
29                 i++;
30                 assert_se(cursor != &items[2]);
31         }
32         assert_se(i == ELEMENTSOF(items)-1);
33
34         i = 0;
35         LIST_FOREACH_OTHERS(item, cursor, &items[0]) {
36                 i++;
37                 assert_se(cursor != &items[0]);
38         }
39         assert_se(i == ELEMENTSOF(items)-1);
40
41         i = 0;
42         LIST_FOREACH_OTHERS(item, cursor, &items[3]) {
43                 i++;
44                 assert_se(cursor != &items[3]);
45         }
46         assert_se(i == ELEMENTSOF(items)-1);
47
48         assert_se(!LIST_JUST_US(item, head));
49
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]);
54
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);
59
60         LIST_FIND_HEAD(item, &items[0], cursor);
61         assert_se(cursor == &items[3]);
62
63         LIST_FIND_TAIL(item, &items[3], cursor);
64         assert_se(cursor == &items[0]);
65
66         LIST_REMOVE(item, head, &items[1]);
67         assert_se(LIST_JUST_US(item, &items[1]));
68
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]);
72
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);
76
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]);
82
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);
87
88         LIST_REMOVE(item, head, &items[1]);
89         assert_se(LIST_JUST_US(item, &items[1]));
90
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]);
94
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);
98
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]);
104
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);
109
110         LIST_REMOVE(item, head, &items[0]);
111         assert_se(LIST_JUST_US(item, &items[0]));
112
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]);
116
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);
120
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]);
126
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]);
132
133         LIST_REMOVE(item, head, &items[0]);
134         assert_se(LIST_JUST_US(item, &items[0]));
135
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
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);
143
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]);
149
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);
154
155         LIST_REMOVE(item, head, &items[0]);
156         assert_se(LIST_JUST_US(item, &items[0]));
157
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]);
161
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);
165
166         LIST_REMOVE(item, head, &items[1]);
167         assert_se(LIST_JUST_US(item, &items[1]));
168
169         assert_se(items[2].item_next == NULL);
170         assert_se(items[3].item_next == &items[2]);
171
172         assert_se(items[2].item_prev == &items[3]);
173         assert_se(items[3].item_prev == NULL);
174
175         LIST_REMOVE(item, head, &items[2]);
176         assert_se(LIST_JUST_US(item, &items[2]));
177         assert_se(LIST_JUST_US(item, head));
178
179         LIST_REMOVE(item, head, &items[3]);
180         assert_se(LIST_JUST_US(item, &items[3]));
181
182         assert_se(head == NULL);
183
184         for (i = 0; i < ELEMENTSOF(items); i++) {
185                 assert_se(LIST_JUST_US(item, &items[i]));
186                 LIST_APPEND(item, head, &items[i]);
187         }
188
189         assert_se(!LIST_JUST_US(item, head));
190
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);
195
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]);
200
201         for (i = 0; i < ELEMENTSOF(items); i++)
202                 LIST_REMOVE(item, head, &items[i]);
203
204         assert_se(head == NULL);
205
206         return 0;
207 }