Misc test coverage improvements
[platform/upstream/glib.git] / glib / tests / array-test.c
1 /* GLIB - Library of useful routines for C programming
2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GLib Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 #undef G_DISABLE_ASSERT
28 #undef G_LOG_DOMAIN
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <string.h>
33 #include "glib.h"
34
35 static void
36 sum_up (gpointer data,
37         gpointer user_data)
38 {
39   gint *sum = (gint *)user_data;
40
41   *sum += GPOINTER_TO_INT (data);
42 }
43
44 static void
45 array_append (void)
46 {
47   GArray *garray;
48   gint i;
49   gint *segment;
50
51   garray = g_array_new (FALSE, FALSE, sizeof (gint));
52   for (i = 0; i < 10000; i++)
53     g_array_append_val (garray, i);
54
55   for (i = 0; i < 10000; i++)
56     g_assert_cmpint (g_array_index (garray, gint, i), ==, i);
57
58   segment = (gint*)g_array_free (garray, FALSE);
59   for (i = 0; i < 10000; i++)
60     g_assert_cmpint (segment[i], ==, i);
61   g_free (segment);
62 }
63
64 static void
65 array_prepend (void)
66 {
67   GArray *garray;
68   gint i;
69
70   garray = g_array_new (FALSE, FALSE, sizeof (gint));
71   for (i = 0; i < 100; i++)
72     g_array_prepend_val (garray, i);
73
74   for (i = 0; i < 100; i++)
75     g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1));
76
77   g_array_free (garray, TRUE);
78 }
79
80 static void
81 array_remove (void)
82 {
83   GArray *garray;
84   gint i;
85   gint prev, cur;
86
87   garray = g_array_new (FALSE, FALSE, sizeof (gint));
88   for (i = 0; i < 100; i++)
89     g_array_append_val (garray, i);
90
91   g_assert_cmpint (garray->len, ==, 100);
92
93   g_array_remove_index (garray, 1);
94   g_array_remove_index (garray, 3);
95   g_array_remove_index (garray, 21);
96   g_array_remove_index (garray, 57);
97
98   g_assert_cmpint (garray->len, ==, 96);
99
100   prev = -1;
101   for (i = 0; i < garray->len; i++)
102     {
103       cur = g_array_index (garray, gint, i);
104       g_assert (cur != 1 &&  cur != 4 && cur != 23 && cur != 60);
105       g_assert_cmpint (prev, <, cur);
106       prev = cur;
107     }
108
109   g_array_free (garray, TRUE);
110 }
111
112 static void
113 array_remove_fast (void)
114 {
115   GArray *garray;
116   gint i;
117   gint prev, cur;
118
119   garray = g_array_new (FALSE, FALSE, sizeof (gint));
120   for (i = 0; i < 100; i++)
121     g_array_append_val (garray, i);
122
123   g_assert_cmpint (garray->len, ==, 100);
124
125   g_array_remove_index_fast (garray, 1);
126   g_array_remove_index_fast (garray, 3);
127   g_array_remove_index_fast (garray, 21);
128   g_array_remove_index_fast (garray, 57);
129
130   g_assert_cmpint (garray->len, ==, 96);
131
132   prev = -1;
133   for (i = 0; i < garray->len; i++)
134     {
135       cur = g_array_index (garray, gint, i);
136       g_assert (cur != 1 &&  cur != 3 && cur != 21 && cur != 57);
137       if (cur < 96)
138         {
139           g_assert_cmpint (prev, <, cur);
140           prev = cur;
141         }
142     }
143
144   g_array_free (garray, TRUE);
145 }
146
147 static void
148 array_remove_range (void)
149 {
150   GArray *garray;
151   gint i;
152   gint prev, cur;
153
154   garray = g_array_new (FALSE, FALSE, sizeof (gint));
155   for (i = 0; i < 100; i++)
156     g_array_append_val (garray, i);
157
158   g_assert_cmpint (garray->len, ==, 100);
159
160   g_array_remove_range (garray, 31, 4);
161
162   g_assert_cmpint (garray->len, ==, 96);
163
164   prev = -1;
165   for (i = 0; i < garray->len; i++)
166     {
167       cur = g_array_index (garray, gint, i);
168       g_assert (cur < 31 || cur > 34);
169       g_assert_cmpint (prev, <, cur);
170       prev = cur;
171     }
172
173   g_array_free (garray, TRUE);
174 }
175
176 static void
177 array_ref_count (void)
178 {
179   GArray *garray;
180   GArray *garray2;
181   gint i;
182
183   garray = g_array_new (FALSE, FALSE, sizeof (gint));
184   g_assert_cmpint (g_array_get_element_size (garray), ==, sizeof (gint));
185   for (i = 0; i < 100; i++)
186     g_array_prepend_val (garray, i);
187
188   /* check we can ref, unref and still access the array */
189   garray2 = g_array_ref (garray);
190   g_assert (garray == garray2);
191   g_array_unref (garray2);
192   for (i = 0; i < 100; i++)
193     g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1));
194
195   /* garray2 should be an empty valid GArray wrapper */
196   garray2 = g_array_ref (garray);
197   g_array_free (garray, TRUE);
198
199   g_assert_cmpint (garray2->len, ==, 0);
200   g_array_unref (garray2);
201 }
202
203 static gpointer
204 array_large_size_remalloc_impl (gpointer mem,
205                                 gsize n_bytes)
206 {
207   /* We only care that g_array_set_size() doesn't hang; we'll never
208    * actually use any of the 2G of memory that it requests, so it's
209    * OK that we don't actually allocate the whole thing.
210    */
211   return realloc (mem, MIN (n_bytes, 1024 * 1024));
212 }
213
214 static GMemVTable array_large_size_mem_vtable = {
215   malloc, array_large_size_remalloc_impl, free,
216   NULL, NULL, NULL
217 };
218
219 static void
220 array_large_size (void)
221 {
222   GArray* array;
223
224   g_test_bug ("568760");
225
226   array = g_array_new (FALSE, FALSE, sizeof (char));
227
228   if (g_test_trap_fork (5 /* s */ * 1000 /* ms */ * 1000 /* µs */, 0))
229     {
230       g_mem_set_vtable (&array_large_size_mem_vtable);
231       g_array_set_size (array, 1073750016);
232       exit (0); /* success */
233     }
234   g_test_trap_assert_passed ();
235
236   g_array_free (array, TRUE);
237 }
238
239 static int
240 int_compare (gconstpointer p1, gconstpointer p2)
241 {
242   const gint *i1 = p1;
243   const gint *i2 = p2;
244
245   return *i1 - *i2;
246 }
247
248 static int
249 int_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
250 {
251   const gint *i1 = p1;
252   const gint *i2 = p2;
253
254   return *i1 - *i2;
255 }
256 static void
257 array_sort (void)
258 {
259   GArray *garray;
260   gint i;
261   gint prev, cur;
262
263   garray = g_array_new (FALSE, FALSE, sizeof (gint));
264   for (i = 0; i < 10000; i++)
265     {
266       cur = g_random_int_range (0, 10000);
267       g_array_append_val (garray, cur);
268     }
269   g_array_sort (garray,  int_compare);
270
271   prev = -1;
272   for (i = 0; i < garray->len; i++)
273     {
274       cur = g_array_index (garray, gint, i);
275       g_assert_cmpint (prev, <=, cur);
276       prev = cur;
277     }
278
279   g_array_free (garray, TRUE);
280 }
281
282 static void
283 array_sort_with_data (void)
284 {
285   GArray *garray;
286   gint i;
287   gint prev, cur;
288
289   garray = g_array_new (FALSE, FALSE, sizeof (gint));
290   for (i = 0; i < 10000; i++)
291     {
292       cur = g_random_int_range (0, 10000);
293       g_array_append_val (garray, cur);
294     }
295   g_array_sort_with_data (garray, int_compare_data, NULL);
296
297   prev = -1;
298   for (i = 0; i < garray->len; i++)
299     {
300       cur = g_array_index (garray, gint, i);
301       g_assert_cmpint (prev, <=, cur);
302       prev = cur;
303     }
304
305   g_array_free (garray, TRUE);
306 }
307
308 static void
309 pointer_array_add (void)
310 {
311   GPtrArray *gparray;
312   gint i;
313   gint sum = 0;
314   gpointer *segment;
315
316   gparray = g_ptr_array_sized_new (1000);
317
318   for (i = 0; i < 10000; i++)
319     g_ptr_array_add (gparray, GINT_TO_POINTER (i));
320
321   for (i = 0; i < 10000; i++)
322     g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
323   
324   g_ptr_array_foreach (gparray, sum_up, &sum);
325   g_assert (sum == 49995000);
326
327   segment = g_ptr_array_free (gparray, FALSE);
328   for (i = 0; i < 10000; i++)
329     g_assert (segment[i] == GINT_TO_POINTER (i));
330   g_free (segment);
331 }
332
333 static void
334 pointer_array_ref_count (void)
335 {
336   GPtrArray *gparray;
337   GPtrArray *gparray2;
338   gint i;
339   gint sum = 0;
340
341   gparray = g_ptr_array_new ();
342   for (i = 0; i < 10000; i++)
343     g_ptr_array_add (gparray, GINT_TO_POINTER (i));
344
345   /* check we can ref, unref and still access the array */
346   gparray2 = g_ptr_array_ref (gparray);
347   g_assert (gparray == gparray2);
348   g_ptr_array_unref (gparray2);
349   for (i = 0; i < 10000; i++)
350     g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
351
352   g_ptr_array_foreach (gparray, sum_up, &sum);
353   g_assert (sum == 49995000);
354
355   /* gparray2 should be an empty valid GPtrArray wrapper */
356   gparray2 = g_ptr_array_ref (gparray);
357   g_ptr_array_free (gparray, TRUE);
358
359   g_assert_cmpint (gparray2->len, ==, 0);
360   g_ptr_array_unref (gparray2);
361 }
362
363 static gint num_free_func_invocations = 0;
364
365 static void
366 my_free_func (gpointer data)
367 {
368   num_free_func_invocations++;
369   g_free (data);
370 }
371
372 static void
373 pointer_array_free_func (void)
374 {
375   GPtrArray *gparray;
376   GPtrArray *gparray2;
377   gchar **strv;
378   gchar *s;
379
380   num_free_func_invocations = 0;
381   gparray = g_ptr_array_new_with_free_func (my_free_func);
382   g_ptr_array_unref (gparray);
383   g_assert_cmpint (num_free_func_invocations, ==, 0);
384
385   gparray = g_ptr_array_new_with_free_func (my_free_func);
386   g_ptr_array_free (gparray, TRUE);
387   g_assert_cmpint (num_free_func_invocations, ==, 0);
388
389   num_free_func_invocations = 0;
390   gparray = g_ptr_array_new_with_free_func (my_free_func);
391   g_ptr_array_add (gparray, g_strdup ("foo"));
392   g_ptr_array_add (gparray, g_strdup ("bar"));
393   g_ptr_array_add (gparray, g_strdup ("baz"));
394   g_ptr_array_remove_index (gparray, 0);
395   g_assert_cmpint (num_free_func_invocations, ==, 1);
396   s = g_strdup ("frob");
397   g_ptr_array_add (gparray, s);
398   g_assert (g_ptr_array_remove (gparray, s));
399   g_assert (!g_ptr_array_remove (gparray, "nuun"));
400   g_assert (!g_ptr_array_remove_fast (gparray, "mlo"));
401   g_assert_cmpint (num_free_func_invocations, ==, 2);
402   g_ptr_array_set_size (gparray, 1);
403   g_assert_cmpint (num_free_func_invocations, ==, 3);
404   g_ptr_array_ref (gparray);
405   g_ptr_array_unref (gparray);
406   g_assert_cmpint (num_free_func_invocations, ==, 3);
407   g_ptr_array_unref (gparray);
408   g_assert_cmpint (num_free_func_invocations, ==, 4);
409
410   num_free_func_invocations = 0;
411   gparray = g_ptr_array_new_full (10, my_free_func);
412   g_ptr_array_add (gparray, g_strdup ("foo"));
413   g_ptr_array_add (gparray, g_strdup ("bar"));
414   g_ptr_array_add (gparray, g_strdup ("baz"));
415   g_ptr_array_set_size (gparray, 20);
416   g_ptr_array_add (gparray, NULL);
417   gparray2 = g_ptr_array_ref (gparray);
418   strv = (gchar **) g_ptr_array_free (gparray, FALSE);
419   g_assert_cmpint (num_free_func_invocations, ==, 0);
420   g_strfreev (strv);
421   g_ptr_array_unref (gparray2);
422   g_assert_cmpint (num_free_func_invocations, ==, 0);
423
424   num_free_func_invocations = 0;
425   gparray = g_ptr_array_new_with_free_func (my_free_func);
426   g_ptr_array_add (gparray, g_strdup ("foo"));
427   g_ptr_array_add (gparray, g_strdup ("bar"));
428   g_ptr_array_add (gparray, g_strdup ("baz"));
429   g_ptr_array_remove_range (gparray, 1, 1);
430   g_ptr_array_unref (gparray);
431   g_assert_cmpint (num_free_func_invocations, ==, 3);
432
433   num_free_func_invocations = 0;
434   gparray = g_ptr_array_new_with_free_func (my_free_func);
435   g_ptr_array_add (gparray, g_strdup ("foo"));
436   g_ptr_array_add (gparray, g_strdup ("bar"));
437   g_ptr_array_add (gparray, g_strdup ("baz"));
438   g_ptr_array_free (gparray, TRUE);
439   g_assert_cmpint (num_free_func_invocations, ==, 3);
440
441   num_free_func_invocations = 0;
442   gparray = g_ptr_array_new_with_free_func (my_free_func);
443   g_ptr_array_add (gparray, "foo");
444   g_ptr_array_add (gparray, "bar");
445   g_ptr_array_add (gparray, "baz");
446   g_ptr_array_set_free_func (gparray, NULL);
447   g_ptr_array_free (gparray, TRUE);
448   g_assert_cmpint (num_free_func_invocations, ==, 0);
449 }
450
451 static gint
452 ptr_compare (gconstpointer p1, gconstpointer p2)
453 {
454   gpointer i1 = *(gpointer*)p1;
455   gpointer i2 = *(gpointer*)p2;
456
457   return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
458 }
459
460 static gint
461 ptr_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
462 {
463   gpointer i1 = *(gpointer*)p1;
464   gpointer i2 = *(gpointer*)p2;
465
466   return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
467 }
468
469 static void
470 pointer_array_sort (void)
471 {
472   GPtrArray *gparray;
473   gint i;
474   gint val;
475   gint prev, cur;
476
477   gparray = g_ptr_array_new ();
478   for (i = 0; i < 10000; i++)
479     {
480       val = g_random_int_range (0, 10000);
481       g_ptr_array_add (gparray, GINT_TO_POINTER (val));
482     }
483
484   g_ptr_array_sort (gparray, ptr_compare);
485
486   prev = -1;
487   for (i = 0; i < 10000; i++)
488     {
489       cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
490       g_assert_cmpint (prev, <=, cur);
491       prev = cur;
492     }
493
494   g_ptr_array_free (gparray, TRUE);
495 }
496
497 static void
498 pointer_array_sort_with_data (void)
499 {
500   GPtrArray *gparray;
501   gint i;
502   gint prev, cur;
503
504   gparray = g_ptr_array_new ();
505   for (i = 0; i < 10000; i++)
506     g_ptr_array_add (gparray, GINT_TO_POINTER (g_random_int_range (0, 10000)));
507
508   g_ptr_array_sort_with_data (gparray, ptr_compare_data, NULL);
509
510   prev = -1;
511   for (i = 0; i < 10000; i++)
512     {
513       cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
514       g_assert_cmpint (prev, <=, cur);
515       prev = cur;
516     }
517
518   g_ptr_array_free (gparray, TRUE);
519 }
520
521 static void
522 byte_array_append (void)
523 {
524   GByteArray *gbarray;
525   gint i;
526   guint8 *segment;
527
528   gbarray = g_byte_array_sized_new (1000);
529   for (i = 0; i < 10000; i++)
530     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
531
532   for (i = 0; i < 10000; i++)
533     {
534       g_assert (gbarray->data[4*i] == 'a');
535       g_assert (gbarray->data[4*i+1] == 'b');
536       g_assert (gbarray->data[4*i+2] == 'c');
537       g_assert (gbarray->data[4*i+3] == 'd');
538     }
539
540   segment = g_byte_array_free (gbarray, FALSE);
541
542   for (i = 0; i < 10000; i++)
543     {
544       g_assert (segment[4*i] == 'a');
545       g_assert (segment[4*i+1] == 'b');
546       g_assert (segment[4*i+2] == 'c');
547       g_assert (segment[4*i+3] == 'd');
548     }
549
550   g_free (segment);
551 }
552
553 static void
554 byte_array_prepend (void)
555 {
556   GByteArray *gbarray;
557   gint i;
558
559   gbarray = g_byte_array_new ();
560   g_byte_array_set_size (gbarray, 1000);
561
562   for (i = 0; i < 10000; i++)
563     g_byte_array_prepend (gbarray, (guint8*) "abcd", 4);
564
565   for (i = 0; i < 10000; i++)
566     {
567       g_assert (gbarray->data[4*i] == 'a');
568       g_assert (gbarray->data[4*i+1] == 'b');
569       g_assert (gbarray->data[4*i+2] == 'c');
570       g_assert (gbarray->data[4*i+3] == 'd');
571     }
572
573   g_byte_array_free (gbarray, TRUE);
574 }
575
576 static void
577 byte_array_ref_count (void)
578 {
579   GByteArray *gbarray;
580   GByteArray *gbarray2;
581   gint i;
582
583   gbarray = g_byte_array_new ();
584   for (i = 0; i < 10000; i++)
585     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
586
587   gbarray2 = g_byte_array_ref (gbarray);
588   g_assert (gbarray2 == gbarray);
589   g_byte_array_unref (gbarray2);
590   for (i = 0; i < 10000; i++)
591     {
592       g_assert (gbarray->data[4*i] == 'a');
593       g_assert (gbarray->data[4*i+1] == 'b');
594       g_assert (gbarray->data[4*i+2] == 'c');
595       g_assert (gbarray->data[4*i+3] == 'd');
596     }
597
598   gbarray2 = g_byte_array_ref (gbarray);
599   g_assert (gbarray2 == gbarray);
600   g_byte_array_free (gbarray, TRUE);
601   g_assert_cmpint (gbarray2->len, ==, 0);
602   g_byte_array_unref (gbarray2);
603 }
604
605 static void
606 byte_array_remove (void)
607 {
608   GByteArray *gbarray;
609   gint i;
610
611   gbarray = g_byte_array_new ();
612   for (i = 0; i < 100; i++)
613     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
614
615   g_assert_cmpint (gbarray->len, ==, 400);
616
617   g_byte_array_remove_index (gbarray, 4);
618   g_byte_array_remove_index (gbarray, 4);
619   g_byte_array_remove_index (gbarray, 4);
620   g_byte_array_remove_index (gbarray, 4);
621
622   g_assert_cmpint (gbarray->len, ==, 396);
623
624   for (i = 0; i < 99; i++)
625     {
626       g_assert (gbarray->data[4*i] == 'a');
627       g_assert (gbarray->data[4*i+1] == 'b');
628       g_assert (gbarray->data[4*i+2] == 'c');
629       g_assert (gbarray->data[4*i+3] == 'd');
630     }
631
632   g_byte_array_free (gbarray, TRUE);
633 }
634
635 static void
636 byte_array_remove_fast (void)
637 {
638   GByteArray *gbarray;
639   gint i;
640
641   gbarray = g_byte_array_new ();
642   for (i = 0; i < 100; i++)
643     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
644
645   g_assert_cmpint (gbarray->len, ==, 400);
646
647   g_byte_array_remove_index_fast (gbarray, 4);
648   g_byte_array_remove_index_fast (gbarray, 4);
649   g_byte_array_remove_index_fast (gbarray, 4);
650   g_byte_array_remove_index_fast (gbarray, 4);
651
652   g_assert_cmpint (gbarray->len, ==, 396);
653
654   for (i = 0; i < 99; i++)
655     {
656       g_assert (gbarray->data[4*i] == 'a');
657       g_assert (gbarray->data[4*i+1] == 'b');
658       g_assert (gbarray->data[4*i+2] == 'c');
659       g_assert (gbarray->data[4*i+3] == 'd');
660     }
661
662   g_byte_array_free (gbarray, TRUE);
663 }
664
665 static void
666 byte_array_remove_range (void)
667 {
668   GByteArray *gbarray;
669   gint i;
670
671   gbarray = g_byte_array_new ();
672   for (i = 0; i < 100; i++)
673     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
674
675   g_assert_cmpint (gbarray->len, ==, 400);
676
677   g_byte_array_remove_range (gbarray, 12, 4);
678
679   g_assert_cmpint (gbarray->len, ==, 396);
680
681   for (i = 0; i < 99; i++)
682     {
683       g_assert (gbarray->data[4*i] == 'a');
684       g_assert (gbarray->data[4*i+1] == 'b');
685       g_assert (gbarray->data[4*i+2] == 'c');
686       g_assert (gbarray->data[4*i+3] == 'd');
687     }
688
689   g_byte_array_free (gbarray, TRUE);
690 }
691
692 static int
693 byte_compare (gconstpointer p1, gconstpointer p2)
694 {
695   const guint8 *i1 = p1;
696   const guint8 *i2 = p2;
697
698   return *i1 - *i2;
699 }
700
701 static int
702 byte_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
703 {
704   const guint8 *i1 = p1;
705   const guint8 *i2 = p2;
706
707   return *i1 - *i2;
708 }
709
710 static void
711 byte_array_sort (void)
712 {
713   GByteArray *gbarray;
714   gint i;
715   guint8 val;
716   guint8 prev, cur;
717
718   gbarray = g_byte_array_new ();
719   for (i = 0; i < 100; i++)
720     {
721       val = 'a' + g_random_int_range (0, 26);
722       g_byte_array_append (gbarray, (guint8*) &val, 1);
723     }
724
725   g_byte_array_sort (gbarray, byte_compare);
726
727   prev = 'a';
728   for (i = 0; i < gbarray->len; i++)
729     {
730       cur = gbarray->data[i];
731       g_assert_cmpint (prev, <=, cur);
732       prev = cur;
733     }
734
735   g_byte_array_free (gbarray, TRUE);
736 }
737
738 static void
739 byte_array_sort_with_data (void)
740 {
741   GByteArray *gbarray;
742   gint i;
743   guint8 val;
744   guint8 prev, cur;
745
746   gbarray = g_byte_array_new ();
747   for (i = 0; i < 100; i++)
748     {
749       val = 'a' + g_random_int_range (0, 26);
750       g_byte_array_append (gbarray, (guint8*) &val, 1);
751     }
752
753   g_byte_array_sort_with_data (gbarray, byte_compare_data, NULL);
754
755   prev = 'a';
756   for (i = 0; i < gbarray->len; i++)
757     {
758       cur = gbarray->data[i];
759       g_assert_cmpint (prev, <=, cur);
760       prev = cur;
761     }
762
763   g_byte_array_free (gbarray, TRUE);
764 }
765
766 int
767 main (int argc, char *argv[])
768 {
769   g_test_init (&argc, &argv, NULL);
770
771   g_test_bug_base ("http://bugs.gnome.org/");
772
773   /* array tests */
774   g_test_add_func ("/array/append", array_append);
775   g_test_add_func ("/array/prepend", array_prepend);
776   g_test_add_func ("/array/remove", array_remove);
777   g_test_add_func ("/array/remove-fast", array_remove_fast);
778   g_test_add_func ("/array/remove-range", array_remove_range);
779   g_test_add_func ("/array/ref-count", array_ref_count);
780   g_test_add_func ("/array/large-size", array_large_size);
781   g_test_add_func ("/array/sort", array_sort);
782   g_test_add_func ("/array/sort-with-data", array_sort_with_data);
783
784   /* pointer arrays */
785   g_test_add_func ("/pointerarray/add", pointer_array_add);
786   g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count);
787   g_test_add_func ("/pointerarray/free-func", pointer_array_free_func);
788   g_test_add_func ("/pointerarray/sort", pointer_array_sort);
789   g_test_add_func ("/pointerarray/sort-with-data", pointer_array_sort_with_data);
790
791   /* byte arrays */
792   g_test_add_func ("/bytearray/append", byte_array_append);
793   g_test_add_func ("/bytearray/prepend", byte_array_prepend);
794   g_test_add_func ("/bytearray/remove", byte_array_remove);
795   g_test_add_func ("/bytearray/remove-fast", byte_array_remove_fast);
796   g_test_add_func ("/bytearray/remove-range", byte_array_remove_range);
797   g_test_add_func ("/bytearray/ref-count", byte_array_ref_count);
798   g_test_add_func ("/bytearray/sort", byte_array_sort);
799   g_test_add_func ("/bytearray/sort-with-data", byte_array_sort_with_data);
800
801   return g_test_run ();
802 }
803