glib-unix: add function to ensure an fd is sealed
[platform/upstream/glib.git] / glib / tests / slist.c
1 #include <glib.h>
2
3 #define SIZE       50
4 #define NUMBER_MIN 0000
5 #define NUMBER_MAX 9999
6
7
8 static guint32 array[SIZE];
9
10
11 static gint
12 sort (gconstpointer p1, gconstpointer p2)
13 {
14   gint32 a, b;
15
16   a = GPOINTER_TO_INT (p1);
17   b = GPOINTER_TO_INT (p2);
18
19   return (a > b ? +1 : a == b ? 0 : -1);
20 }
21
22 /*
23  * gslist sort tests
24  */
25 static void
26 test_slist_sort (void)
27 {
28   GSList *slist = NULL;
29   gint    i;
30
31   for (i = 0; i < SIZE; i++)
32     slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
33
34   slist = g_slist_sort (slist, sort);
35   for (i = 0; i < SIZE - 1; i++)
36     {
37       gpointer p1, p2;
38
39       p1 = g_slist_nth_data (slist, i);
40       p2 = g_slist_nth_data (slist, i+1);
41
42       g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
43     }
44
45   g_slist_free (slist);
46 }
47
48 static void
49 test_slist_sort_with_data (void)
50 {
51   GSList *slist = NULL;
52   gint    i;
53
54   for (i = 0; i < SIZE; i++)
55     slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
56
57   slist = g_slist_sort_with_data (slist, (GCompareDataFunc)sort, NULL);
58   for (i = 0; i < SIZE - 1; i++)
59     {
60       gpointer p1, p2;
61
62       p1 = g_slist_nth_data (slist, i);
63       p2 = g_slist_nth_data (slist, i+1);
64
65       g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
66     }
67
68   g_slist_free (slist);
69 }
70
71 static void
72 test_slist_insert_sorted (void)
73 {
74   GSList *slist = NULL;
75   gint    i;
76
77   for (i = 0; i < SIZE; i++)
78     slist = g_slist_insert_sorted (slist, GINT_TO_POINTER (array[i]), sort);
79
80   for (i = 0; i < SIZE - 1; i++)
81     {
82       gpointer p1, p2;
83
84       p1 = g_slist_nth_data (slist, i);
85       p2 = g_slist_nth_data (slist, i+1);
86
87       g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
88     }
89
90   g_slist_free (slist);
91 }
92
93 static void
94 test_slist_insert_sorted_with_data (void)
95 {
96   GSList *slist = NULL;
97   gint    i;
98
99   for (i = 0; i < SIZE; i++)
100     slist = g_slist_insert_sorted_with_data (slist,
101                                            GINT_TO_POINTER (array[i]),
102                                            (GCompareDataFunc)sort,
103                                            NULL);
104
105   for (i = 0; i < SIZE - 1; i++)
106     {
107       gpointer p1, p2;
108
109       p1 = g_slist_nth_data (slist, i);
110       p2 = g_slist_nth_data (slist, i+1);
111
112       g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
113     }
114
115   g_slist_free (slist);
116 }
117
118 static void
119 test_slist_reverse (void)
120 {
121   GSList *slist = NULL;
122   GSList *st;
123   gint    nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
124   gint    i;
125
126   for (i = 0; i < 10; i++)
127     slist = g_slist_append (slist, &nums[i]);
128
129   slist = g_slist_reverse (slist);
130
131   for (i = 0; i < 10; i++)
132     {
133       st = g_slist_nth (slist, i);
134       g_assert (*((gint*) st->data) == (9 - i));
135     }
136
137   g_slist_free (slist);
138 }
139
140 static void
141 test_slist_nth (void)
142 {
143   GSList *slist = NULL;
144   GSList *st;
145   gint    nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
146   gint    i;
147
148   for (i = 0; i < 10; i++)
149     slist = g_slist_append (slist, &nums[i]);
150
151   for (i = 0; i < 10; i++)
152     {
153       st = g_slist_nth (slist, i);
154       g_assert (*((gint*) st->data) == i);
155     }
156
157   g_slist_free (slist);
158 }
159
160 static void
161 test_slist_remove (void)
162 {
163   GSList *slist = NULL;
164   GSList *st;
165   gint    nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
166   gint    i;
167
168   for (i = 0; i < 10; i++)
169     {
170       slist = g_slist_append (slist, &nums[i]);
171       slist = g_slist_append (slist, &nums[i]);
172     }
173
174   g_assert_cmpint (g_slist_length (slist), ==, 20);
175
176   for (i = 0; i < 10; i++)
177     {
178       slist = g_slist_remove (slist, &nums[i]);
179     }
180
181   g_assert_cmpint (g_slist_length (slist), ==, 10);
182
183   for (i = 0; i < 10; i++)
184     {
185       st = g_slist_nth (slist, i);
186       g_assert (*((gint*) st->data) == i);
187     }
188
189   g_slist_free (slist);
190 }
191
192 static void
193 test_slist_remove_all (void)
194 {
195   GSList *slist = NULL;
196   gint    nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
197   gint    i;
198
199   for (i = 0; i < 10; i++)
200     {
201       slist = g_slist_append (slist, &nums[i]);
202       slist = g_slist_append (slist, &nums[i]);
203     }
204
205   g_assert_cmpint (g_slist_length (slist), ==, 20);
206
207   for (i = 0; i < 10; i++)
208     {
209       slist = g_slist_remove_all (slist, &nums[2 * i + 1]);
210       slist = g_slist_remove_all (slist, &nums[8 - 2 * i]);
211     }
212
213   g_assert_cmpint (g_slist_length (slist), ==, 0);
214   g_assert (slist == NULL);
215 }
216
217 static void
218 test_slist_insert (void)
219 {
220   GSList *slist = NULL;
221   GSList *st;
222   gint   nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
223   gint   i;
224
225   slist = g_slist_insert_before (NULL, NULL, &nums[1]);
226   slist = g_slist_insert (slist, &nums[3], 1);
227   slist = g_slist_insert (slist, &nums[4], -1);
228   slist = g_slist_insert (slist, &nums[0], 0);
229   slist = g_slist_insert (slist, &nums[5], 100);
230   slist = g_slist_insert_before (slist, NULL, &nums[6]);
231   slist = g_slist_insert_before (slist, slist->next->next, &nums[2]);
232
233   slist = g_slist_insert (slist, &nums[9], 7);
234   slist = g_slist_insert (slist, &nums[8], 7);
235   slist = g_slist_insert (slist, &nums[7], 7);
236
237   for (i = 0; i < 10; i++)
238     {
239       st = g_slist_nth (slist, i);
240       g_assert (*((gint*) st->data) == i);
241     }
242
243   g_slist_free (slist);
244
245   slist = g_slist_insert (NULL, "a", 1);
246   g_assert (slist->data == (gpointer)"a");
247   g_assert (slist->next == NULL);
248   g_slist_free (slist);
249
250   slist = g_slist_append (NULL, "a");
251   slist = g_slist_append (slist, "b");
252   slist = g_slist_insert (slist, "c", 5);
253
254   g_assert (slist->next->next->data == (gpointer)"c");
255   g_assert (slist->next->next->next == NULL);
256   g_slist_free (slist);
257
258   slist = g_slist_append (NULL, "a");
259   slist = g_slist_insert_before (slist, slist, "b");
260   g_assert (slist->data == (gpointer)"b");
261   g_assert (slist->next->data == (gpointer)"a");
262   g_assert (slist->next->next == NULL);
263   g_slist_free (slist);
264 }
265
266 static gint
267 find_num (gconstpointer l, gconstpointer data)
268 {
269   return *(gint*)l - GPOINTER_TO_INT(data);
270 }
271
272 static void
273 test_slist_position (void)
274 {
275   GSList *slist = NULL;
276   GSList *st;
277   gint    nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
278   gint    i;
279
280   for (i = 0; i < 10; i++)
281     {
282       slist = g_slist_append (slist, &nums[i]);
283     }
284
285   g_assert_cmpint (g_slist_index (slist, NULL), ==, -1);
286   g_assert_cmpint (g_slist_position (slist, NULL), ==, -1);
287
288   for (i = 0; i < 10; i++)
289     {
290       g_assert_cmpint (g_slist_index (slist, &nums[i]), ==, i);
291       st = g_slist_find_custom (slist, GINT_TO_POINTER(i), find_num);
292       g_assert (st != NULL);
293       g_assert_cmpint (g_slist_position (slist, st), ==, i);
294     }
295
296   st = g_slist_find_custom (slist, GINT_TO_POINTER (1000), find_num);
297   g_assert (st == NULL);
298
299   g_slist_free (slist);
300 }
301
302 static void
303 test_slist_concat (void)
304 {
305   GSList *s1, *s2, *s;
306
307   s1 = g_slist_append (NULL, "a");
308   s2 = g_slist_append (NULL, "b");
309   s = g_slist_concat (s1, s2);
310   g_assert (s->data == (gpointer)"a");
311   g_assert (s->next->data == (gpointer)"b");
312   g_assert (s->next->next == NULL);
313   g_slist_free (s);
314
315   s1 = g_slist_append (NULL, "a");
316
317   s = g_slist_concat (NULL, s1);
318   g_assert_cmpint (g_slist_length (s), ==, 1);
319   s = g_slist_concat (s1, NULL);
320   g_assert_cmpint (g_slist_length (s), ==, 1);
321
322   g_slist_free (s);
323
324   s = g_slist_concat (NULL, NULL);
325   g_assert (s == NULL);
326 }
327
328 int
329 main (int argc, char *argv[])
330 {
331   gint i;
332
333   g_test_init (&argc, &argv, NULL);
334
335   /* Create an array of random numbers. */
336   for (i = 0; i < SIZE; i++)
337     array[i] = g_test_rand_int_range (NUMBER_MIN, NUMBER_MAX);
338
339   g_test_add_func ("/slist/sort", test_slist_sort);
340   g_test_add_func ("/slist/sort-with-data", test_slist_sort_with_data);
341   g_test_add_func ("/slist/insert-sorted", test_slist_insert_sorted);
342   g_test_add_func ("/slist/insert-sorted-with-data", test_slist_insert_sorted_with_data);
343   g_test_add_func ("/slist/reverse", test_slist_reverse);
344   g_test_add_func ("/slist/nth", test_slist_nth);
345   g_test_add_func ("/slist/remove", test_slist_remove);
346   g_test_add_func ("/slist/remove-all", test_slist_remove_all);
347   g_test_add_func ("/slist/insert", test_slist_insert);
348   g_test_add_func ("/slist/position", test_slist_position);
349   g_test_add_func ("/slist/concat", test_slist_concat);
350
351   return g_test_run ();
352 }