4 #define NUMBER_MIN 0000
5 #define NUMBER_MAX 9999
8 static guint32 array[SIZE];
12 sort (gconstpointer p1, gconstpointer p2)
16 a = GPOINTER_TO_INT (p1);
17 b = GPOINTER_TO_INT (p2);
19 return (a > b ? +1 : a == b ? 0 : -1);
26 test_slist_sort (void)
31 for (i = 0; i < SIZE; i++)
32 slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
34 slist = g_slist_sort (slist, sort);
35 for (i = 0; i < SIZE - 1; i++)
39 p1 = g_slist_nth_data (slist, i);
40 p2 = g_slist_nth_data (slist, i+1);
42 g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
49 test_slist_sort_with_data (void)
54 for (i = 0; i < SIZE; i++)
55 slist = g_slist_append (slist, GINT_TO_POINTER (array[i]));
57 slist = g_slist_sort_with_data (slist, (GCompareDataFunc)sort, NULL);
58 for (i = 0; i < SIZE - 1; i++)
62 p1 = g_slist_nth_data (slist, i);
63 p2 = g_slist_nth_data (slist, i+1);
65 g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
71 /* Test that the sort is stable. */
73 test_slist_sort_stable (void)
75 GSList *list = NULL; /* (element-type utf8) */
76 GSList *copy = NULL; /* (element-type utf8) */
79 /* Build a test list, already ordered. */
80 for (i = 0; i < SIZE; i++)
81 list = g_slist_append (list, g_strdup_printf ("%" G_GSIZE_FORMAT, i / 5));
83 /* Take a copy and sort it. */
84 copy = g_slist_copy (list);
85 copy = g_slist_sort (copy, (GCompareFunc) g_strcmp0);
87 /* Compare the two lists, checking pointers are equal to ensure the elements
88 * have been kept stable. */
89 for (i = 0; i < SIZE; i++)
93 p1 = g_slist_nth_data (list, i);
94 p2 = g_slist_nth_data (list, i);
100 g_slist_free_full (list, g_free);
104 test_slist_insert_sorted (void)
106 GSList *slist = NULL;
109 for (i = 0; i < SIZE; i++)
110 slist = g_slist_insert_sorted (slist, GINT_TO_POINTER (array[i]), sort);
112 for (i = 0; i < SIZE - 1; i++)
116 p1 = g_slist_nth_data (slist, i);
117 p2 = g_slist_nth_data (slist, i+1);
119 g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
122 g_slist_free (slist);
126 test_slist_insert_sorted_with_data (void)
128 GSList *slist = NULL;
131 for (i = 0; i < SIZE; i++)
132 slist = g_slist_insert_sorted_with_data (slist,
133 GINT_TO_POINTER (array[i]),
134 (GCompareDataFunc)sort,
137 for (i = 0; i < SIZE - 1; i++)
141 p1 = g_slist_nth_data (slist, i);
142 p2 = g_slist_nth_data (slist, i+1);
144 g_assert (GPOINTER_TO_INT (p1) <= GPOINTER_TO_INT (p2));
147 g_slist_free (slist);
151 test_slist_reverse (void)
153 GSList *slist = NULL;
155 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
158 for (i = 0; i < 10; i++)
159 slist = g_slist_append (slist, &nums[i]);
161 slist = g_slist_reverse (slist);
163 for (i = 0; i < 10; i++)
165 st = g_slist_nth (slist, i);
166 g_assert (*((gint*) st->data) == (9 - i));
169 g_slist_free (slist);
173 test_slist_nth (void)
175 GSList *slist = NULL;
177 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
180 for (i = 0; i < 10; i++)
181 slist = g_slist_append (slist, &nums[i]);
183 for (i = 0; i < 10; i++)
185 st = g_slist_nth (slist, i);
186 g_assert (*((gint*) st->data) == i);
189 g_slist_free (slist);
193 test_slist_remove (void)
195 GSList *slist = NULL;
197 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
200 for (i = 0; i < 10; i++)
202 slist = g_slist_append (slist, &nums[i]);
203 slist = g_slist_append (slist, &nums[i]);
206 g_assert_cmpint (g_slist_length (slist), ==, 20);
208 for (i = 0; i < 10; i++)
210 slist = g_slist_remove (slist, &nums[i]);
213 g_assert_cmpint (g_slist_length (slist), ==, 10);
215 for (i = 0; i < 10; i++)
217 st = g_slist_nth (slist, i);
218 g_assert (*((gint*) st->data) == i);
221 g_slist_free (slist);
225 test_slist_remove_all (void)
227 GSList *slist = NULL;
228 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
231 for (i = 0; i < 10; i++)
233 slist = g_slist_append (slist, &nums[i]);
234 slist = g_slist_append (slist, &nums[i]);
237 g_assert_cmpint (g_slist_length (slist), ==, 20);
239 for (i = 0; i < 5; i++)
241 slist = g_slist_remove_all (slist, &nums[2 * i + 1]);
242 slist = g_slist_remove_all (slist, &nums[8 - 2 * i]);
245 g_assert_cmpint (g_slist_length (slist), ==, 0);
246 g_assert (slist == NULL);
250 test_slist_insert (void)
255 GSList *slist = NULL;
257 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
260 slist = g_slist_insert_before (NULL, NULL, &nums[1]);
261 slist = g_slist_insert (slist, &nums[3], 1);
262 slist = g_slist_insert (slist, &nums[4], -1);
263 slist = g_slist_insert (slist, &nums[0], 0);
264 slist = g_slist_insert (slist, &nums[5], 100);
265 slist = g_slist_insert_before (slist, NULL, &nums[6]);
266 slist = g_slist_insert_before (slist, slist->next->next, &nums[2]);
268 slist = g_slist_insert (slist, &nums[9], 7);
269 slist = g_slist_insert (slist, &nums[8], 7);
270 slist = g_slist_insert (slist, &nums[7], 7);
272 for (i = 0; i < 10; i++)
274 st = g_slist_nth (slist, i);
275 g_assert (*((gint*) st->data) == i);
278 g_slist_free (slist);
280 slist = g_slist_insert (NULL, a, 1);
281 g_assert (slist->data == a);
282 g_assert (slist->next == NULL);
283 g_slist_free (slist);
285 slist = g_slist_append (NULL, a);
286 slist = g_slist_append (slist, b);
287 slist = g_slist_insert (slist, c, 5);
289 g_assert (slist->next->next->data == c);
290 g_assert (slist->next->next->next == NULL);
291 g_slist_free (slist);
293 slist = g_slist_append (NULL, a);
294 slist = g_slist_insert_before (slist, slist, b);
295 g_assert (slist->data == b);
296 g_assert (slist->next->data == a);
297 g_assert (slist->next->next == NULL);
298 g_slist_free (slist);
302 find_num (gconstpointer l, gconstpointer data)
304 return *(gint*)l - GPOINTER_TO_INT(data);
308 test_slist_position (void)
310 GSList *slist = NULL;
312 gint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
315 for (i = 0; i < 10; i++)
317 slist = g_slist_append (slist, &nums[i]);
320 g_assert_cmpint (g_slist_index (slist, NULL), ==, -1);
321 g_assert_cmpint (g_slist_position (slist, NULL), ==, -1);
323 for (i = 0; i < 10; i++)
325 g_assert_cmpint (g_slist_index (slist, &nums[i]), ==, i);
326 st = g_slist_find_custom (slist, GINT_TO_POINTER(i), find_num);
327 g_assert (st != NULL);
328 g_assert_cmpint (g_slist_position (slist, st), ==, i);
331 st = g_slist_find_custom (slist, GINT_TO_POINTER (1000), find_num);
332 g_assert (st == NULL);
334 g_slist_free (slist);
338 test_slist_concat (void)
344 s1 = g_slist_append (NULL, a);
345 s2 = g_slist_append (NULL, b);
346 s = g_slist_concat (s1, s2);
347 g_assert (s->data == a);
348 g_assert (s->next->data == b);
349 g_assert (s->next->next == NULL);
352 s1 = g_slist_append (NULL, a);
354 s = g_slist_concat (NULL, s1);
355 g_assert_cmpint (g_slist_length (s), ==, 1);
356 s = g_slist_concat (s1, NULL);
357 g_assert_cmpint (g_slist_length (s), ==, 1);
361 s = g_slist_concat (NULL, NULL);
362 g_assert (s == NULL);
366 test_slist_copy (void)
368 GSList *slist = NULL, *copy;
370 guint nums[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
373 /* Copy and test a many-element list. */
374 for (i = 0; i < 10; i++)
375 slist = g_slist_append (slist, &nums[i]);
377 copy = g_slist_copy (slist);
379 g_assert_cmpuint (g_slist_length (copy), ==, g_slist_length (slist));
381 for (s1 = copy, s2 = slist; s1 != NULL && s2 != NULL; s1 = s1->next, s2 = s2->next)
382 g_assert (s1->data == s2->data);
385 g_slist_free (slist);
387 /* Copy a NULL list. */
388 copy = g_slist_copy (NULL);
389 g_assert_null (copy);
393 copy_and_count_string (gconstpointer src,
396 const gchar *str = src;
400 return g_strdup (str);
404 test_slist_copy_deep (void)
406 GSList *slist = NULL, *copy;
410 /* Deep-copy a simple list. */
411 slist = g_slist_append (slist, "a");
412 slist = g_slist_append (slist, "b");
413 slist = g_slist_append (slist, "c");
416 copy = g_slist_copy_deep (slist, copy_and_count_string, &count);
418 g_assert_cmpuint (count, ==, g_slist_length (slist));
419 g_assert_cmpuint (g_slist_length (copy), ==, count);
420 for (s1 = slist, s2 = copy; s1 != NULL && s2 != NULL; s1 = s1->next, s2 = s2->next)
422 g_assert_cmpstr (s1->data, ==, s2->data);
423 g_assert (s1->data != s2->data);
426 g_slist_free_full (copy, g_free);
427 g_slist_free (slist);
429 /* Try with an empty list. */
431 copy = g_slist_copy_deep (NULL, copy_and_count_string, &count);
432 g_assert_cmpuint (count, ==, 0);
433 g_assert_null (copy);
437 main (int argc, char *argv[])
441 g_test_init (&argc, &argv, NULL);
443 /* Create an array of random numbers. */
444 for (i = 0; i < SIZE; i++)
445 array[i] = g_test_rand_int_range (NUMBER_MIN, NUMBER_MAX);
447 g_test_add_func ("/slist/sort", test_slist_sort);
448 g_test_add_func ("/slist/sort-with-data", test_slist_sort_with_data);
449 g_test_add_func ("/slist/sort/stable", test_slist_sort_stable);
450 g_test_add_func ("/slist/insert-sorted", test_slist_insert_sorted);
451 g_test_add_func ("/slist/insert-sorted-with-data", test_slist_insert_sorted_with_data);
452 g_test_add_func ("/slist/reverse", test_slist_reverse);
453 g_test_add_func ("/slist/nth", test_slist_nth);
454 g_test_add_func ("/slist/remove", test_slist_remove);
455 g_test_add_func ("/slist/remove-all", test_slist_remove_all);
456 g_test_add_func ("/slist/insert", test_slist_insert);
457 g_test_add_func ("/slist/position", test_slist_position);
458 g_test_add_func ("/slist/concat", test_slist_concat);
459 g_test_add_func ("/slist/copy", test_slist_copy);
460 g_test_add_func ("/slist/copy/deep", test_slist_copy_deep);
462 return g_test_run ();