chiark / gitweb /
Fix service file to match installed elogind binary location
[elogind.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 }