]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-list.c
2 This file is part of systemd
4 Copyright 2013 Jan Janssen
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.
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.
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/>.
23 int main(int argc
, const char *argv
[]) {
25 typedef struct list_item
{
26 LIST_FIELDS(struct list_item
, item
);
28 LIST_HEAD(list_item
, head
);
33 assert_se(head
== NULL
);
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
]);
42 LIST_FOREACH_OTHERS(item
, cursor
, &items
[2]) {
44 assert_se(cursor
!= &items
[2]);
46 assert_se(i
== ELEMENTSOF(items
)-1);
49 LIST_FOREACH_OTHERS(item
, cursor
, &items
[0]) {
51 assert_se(cursor
!= &items
[0]);
53 assert_se(i
== ELEMENTSOF(items
)-1);
56 LIST_FOREACH_OTHERS(item
, cursor
, &items
[3]) {
58 assert_se(cursor
!= &items
[3]);
60 assert_se(i
== ELEMENTSOF(items
)-1);
62 assert_se(!LIST_JUST_US(item
, head
));
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]);
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
);
74 LIST_FIND_HEAD(item
, &items
[0], cursor
);
75 assert_se(cursor
== &items
[3]);
77 LIST_FIND_TAIL(item
, &items
[3], cursor
);
78 assert_se(cursor
== &items
[0]);
80 LIST_REMOVE(item
, head
, &items
[1]);
81 assert_se(LIST_JUST_US(item
, &items
[1]));
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]);
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
);
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]);
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
);
102 LIST_REMOVE(item
, head
, &items
[1]);
103 assert_se(LIST_JUST_US(item
, &items
[1]));
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]);
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
);
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]);
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
);
124 LIST_REMOVE(item
, head
, &items
[0]);
125 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
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]);
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]);
147 LIST_REMOVE(item
, head
, &items
[0]);
148 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
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]);
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
);
169 LIST_REMOVE(item
, head
, &items
[0]);
170 assert_se(LIST_JUST_US(item
, &items
[0]));
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]);
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
);
180 LIST_REMOVE(item
, head
, &items
[1]);
181 assert_se(LIST_JUST_US(item
, &items
[1]));
183 assert_se(items
[2].item_next
== NULL
);
184 assert_se(items
[3].item_next
== &items
[2]);
186 assert_se(items
[2].item_prev
== &items
[3]);
187 assert_se(items
[3].item_prev
== NULL
);
189 LIST_REMOVE(item
, head
, &items
[2]);
190 assert_se(LIST_JUST_US(item
, &items
[2]));
191 assert_se(LIST_JUST_US(item
, head
));
193 LIST_REMOVE(item
, head
, &items
[3]);
194 assert_se(LIST_JUST_US(item
, &items
[3]));
196 assert_se(head
== NULL
);
198 for (i
= 0; i
< ELEMENTSOF(items
); i
++) {
199 assert_se(LIST_JUST_US(item
, &items
[i
]));
200 LIST_APPEND(item
, head
, &items
[i
]);
203 assert_se(!LIST_JUST_US(item
, head
));
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
);
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]);
215 for (i
= 0; i
< ELEMENTSOF(items
); i
++)
216 LIST_REMOVE(item
, head
, &items
[i
]);
218 assert_se(head
== NULL
);