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