Simplify subprocesses in tests
[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 before
208    * calling g_realloc(). So if we got here, we already won.
209    */
210   exit (0);
211 }
212
213 static GMemVTable array_large_size_mem_vtable = {
214   malloc, array_large_size_remalloc_impl, free,
215   NULL, NULL, NULL
216 };
217
218 static void
219 array_large_size (void)
220 {
221   g_test_bug ("568760");
222
223   if (g_test_subprocess ())
224     {
225       GArray *array;
226
227       array = g_array_new (FALSE, FALSE, sizeof (char));
228
229       g_mem_set_vtable (&array_large_size_mem_vtable);
230       g_array_set_size (array, 1073750016);
231       g_assert_not_reached ();
232       return;
233     }
234
235   g_test_trap_subprocess (NULL, 5000000, 0);
236   g_test_trap_assert_passed ();
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 gint num_clear_func_invocations = 0;
309
310 static void
311 my_clear_func (gpointer data)
312 {
313   num_clear_func_invocations += 1;
314 }
315
316 static void
317 array_clear_func (void)
318 {
319   GArray *garray;
320   gint i;
321   gint cur;
322
323   garray = g_array_new (FALSE, FALSE, sizeof (gint));
324   g_array_set_clear_func (garray, my_clear_func);
325
326   for (i = 0; i < 10; i++)
327     {
328       cur = g_random_int_range (0, 100);
329       g_array_append_val (garray, cur);
330     }
331
332   g_array_remove_index (garray, 9);
333   g_assert_cmpint (num_clear_func_invocations, ==, 1);
334
335   g_array_remove_range (garray, 5, 3);
336   g_assert_cmpint (num_clear_func_invocations, ==, 4);
337
338   g_array_remove_index_fast (garray, 4);
339   g_assert_cmpint (num_clear_func_invocations, ==, 5);
340
341   g_array_free (garray, TRUE);
342   g_assert_cmpint (num_clear_func_invocations, ==, 10);
343 }
344
345 static void
346 pointer_array_add (void)
347 {
348   GPtrArray *gparray;
349   gint i;
350   gint sum = 0;
351   gpointer *segment;
352
353   gparray = g_ptr_array_sized_new (1000);
354
355   for (i = 0; i < 10000; i++)
356     g_ptr_array_add (gparray, GINT_TO_POINTER (i));
357
358   for (i = 0; i < 10000; i++)
359     g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
360   
361   g_ptr_array_foreach (gparray, sum_up, &sum);
362   g_assert (sum == 49995000);
363
364   segment = g_ptr_array_free (gparray, FALSE);
365   for (i = 0; i < 10000; i++)
366     g_assert (segment[i] == GINT_TO_POINTER (i));
367   g_free (segment);
368 }
369
370 static void
371 pointer_array_insert (void)
372 {
373   GPtrArray *gparray;
374   gint i;
375   gint sum = 0;
376   gint index;
377
378   gparray = g_ptr_array_sized_new (1000);
379
380   for (i = 0; i < 10000; i++)
381     {
382       index = g_random_int_range (-1, i + 1);
383       g_ptr_array_insert (gparray, index, GINT_TO_POINTER (i));
384     }
385
386   g_ptr_array_foreach (gparray, sum_up, &sum);
387   g_assert (sum == 49995000);
388
389   g_ptr_array_free (gparray, TRUE);
390 }
391
392 static void
393 pointer_array_ref_count (void)
394 {
395   GPtrArray *gparray;
396   GPtrArray *gparray2;
397   gint i;
398   gint sum = 0;
399
400   gparray = g_ptr_array_new ();
401   for (i = 0; i < 10000; i++)
402     g_ptr_array_add (gparray, GINT_TO_POINTER (i));
403
404   /* check we can ref, unref and still access the array */
405   gparray2 = g_ptr_array_ref (gparray);
406   g_assert (gparray == gparray2);
407   g_ptr_array_unref (gparray2);
408   for (i = 0; i < 10000; i++)
409     g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
410
411   g_ptr_array_foreach (gparray, sum_up, &sum);
412   g_assert (sum == 49995000);
413
414   /* gparray2 should be an empty valid GPtrArray wrapper */
415   gparray2 = g_ptr_array_ref (gparray);
416   g_ptr_array_free (gparray, TRUE);
417
418   g_assert_cmpint (gparray2->len, ==, 0);
419   g_ptr_array_unref (gparray2);
420 }
421
422 static gint num_free_func_invocations = 0;
423
424 static void
425 my_free_func (gpointer data)
426 {
427   num_free_func_invocations++;
428   g_free (data);
429 }
430
431 static void
432 pointer_array_free_func (void)
433 {
434   GPtrArray *gparray;
435   GPtrArray *gparray2;
436   gchar **strv;
437   gchar *s;
438
439   num_free_func_invocations = 0;
440   gparray = g_ptr_array_new_with_free_func (my_free_func);
441   g_ptr_array_unref (gparray);
442   g_assert_cmpint (num_free_func_invocations, ==, 0);
443
444   gparray = g_ptr_array_new_with_free_func (my_free_func);
445   g_ptr_array_free (gparray, TRUE);
446   g_assert_cmpint (num_free_func_invocations, ==, 0);
447
448   num_free_func_invocations = 0;
449   gparray = g_ptr_array_new_with_free_func (my_free_func);
450   g_ptr_array_add (gparray, g_strdup ("foo"));
451   g_ptr_array_add (gparray, g_strdup ("bar"));
452   g_ptr_array_add (gparray, g_strdup ("baz"));
453   g_ptr_array_remove_index (gparray, 0);
454   g_assert_cmpint (num_free_func_invocations, ==, 1);
455   g_ptr_array_remove_index_fast (gparray, 1);
456   g_assert_cmpint (num_free_func_invocations, ==, 2);
457   s = g_strdup ("frob");
458   g_ptr_array_add (gparray, s);
459   g_assert (g_ptr_array_remove (gparray, s));
460   g_assert (!g_ptr_array_remove (gparray, "nuun"));
461   g_assert (!g_ptr_array_remove_fast (gparray, "mlo"));
462   g_assert_cmpint (num_free_func_invocations, ==, 3);
463   s = g_strdup ("frob");
464   g_ptr_array_add (gparray, s);
465   g_ptr_array_set_size (gparray, 1);
466   g_assert_cmpint (num_free_func_invocations, ==, 4);
467   g_ptr_array_ref (gparray);
468   g_ptr_array_unref (gparray);
469   g_assert_cmpint (num_free_func_invocations, ==, 4);
470   g_ptr_array_unref (gparray);
471   g_assert_cmpint (num_free_func_invocations, ==, 5);
472
473   num_free_func_invocations = 0;
474   gparray = g_ptr_array_new_full (10, my_free_func);
475   g_ptr_array_add (gparray, g_strdup ("foo"));
476   g_ptr_array_add (gparray, g_strdup ("bar"));
477   g_ptr_array_add (gparray, g_strdup ("baz"));
478   g_ptr_array_set_size (gparray, 20);
479   g_ptr_array_add (gparray, NULL);
480   gparray2 = g_ptr_array_ref (gparray);
481   strv = (gchar **) g_ptr_array_free (gparray, FALSE);
482   g_assert_cmpint (num_free_func_invocations, ==, 0);
483   g_strfreev (strv);
484   g_ptr_array_unref (gparray2);
485   g_assert_cmpint (num_free_func_invocations, ==, 0);
486
487   num_free_func_invocations = 0;
488   gparray = g_ptr_array_new_with_free_func (my_free_func);
489   g_ptr_array_add (gparray, g_strdup ("foo"));
490   g_ptr_array_add (gparray, g_strdup ("bar"));
491   g_ptr_array_add (gparray, g_strdup ("baz"));
492   g_ptr_array_remove_range (gparray, 1, 1);
493   g_ptr_array_unref (gparray);
494   g_assert_cmpint (num_free_func_invocations, ==, 3);
495
496   num_free_func_invocations = 0;
497   gparray = g_ptr_array_new_with_free_func (my_free_func);
498   g_ptr_array_add (gparray, g_strdup ("foo"));
499   g_ptr_array_add (gparray, g_strdup ("bar"));
500   g_ptr_array_add (gparray, g_strdup ("baz"));
501   g_ptr_array_free (gparray, TRUE);
502   g_assert_cmpint (num_free_func_invocations, ==, 3);
503
504   num_free_func_invocations = 0;
505   gparray = g_ptr_array_new_with_free_func (my_free_func);
506   g_ptr_array_add (gparray, "foo");
507   g_ptr_array_add (gparray, "bar");
508   g_ptr_array_add (gparray, "baz");
509   g_ptr_array_set_free_func (gparray, NULL);
510   g_ptr_array_free (gparray, TRUE);
511   g_assert_cmpint (num_free_func_invocations, ==, 0);
512 }
513
514 static gint
515 ptr_compare (gconstpointer p1, gconstpointer p2)
516 {
517   gpointer i1 = *(gpointer*)p1;
518   gpointer i2 = *(gpointer*)p2;
519
520   return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
521 }
522
523 static gint
524 ptr_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
525 {
526   gpointer i1 = *(gpointer*)p1;
527   gpointer i2 = *(gpointer*)p2;
528
529   return GPOINTER_TO_INT (i1) - GPOINTER_TO_INT (i2);
530 }
531
532 static void
533 pointer_array_sort (void)
534 {
535   GPtrArray *gparray;
536   gint i;
537   gint val;
538   gint prev, cur;
539
540   gparray = g_ptr_array_new ();
541   for (i = 0; i < 10000; i++)
542     {
543       val = g_random_int_range (0, 10000);
544       g_ptr_array_add (gparray, GINT_TO_POINTER (val));
545     }
546
547   g_ptr_array_sort (gparray, ptr_compare);
548
549   prev = -1;
550   for (i = 0; i < 10000; i++)
551     {
552       cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
553       g_assert_cmpint (prev, <=, cur);
554       prev = cur;
555     }
556
557   g_ptr_array_free (gparray, TRUE);
558 }
559
560 static void
561 pointer_array_sort_with_data (void)
562 {
563   GPtrArray *gparray;
564   gint i;
565   gint prev, cur;
566
567   gparray = g_ptr_array_new ();
568   for (i = 0; i < 10000; i++)
569     g_ptr_array_add (gparray, GINT_TO_POINTER (g_random_int_range (0, 10000)));
570
571   g_ptr_array_sort_with_data (gparray, ptr_compare_data, NULL);
572
573   prev = -1;
574   for (i = 0; i < 10000; i++)
575     {
576       cur = GPOINTER_TO_INT (g_ptr_array_index (gparray, i));
577       g_assert_cmpint (prev, <=, cur);
578       prev = cur;
579     }
580
581   g_ptr_array_free (gparray, TRUE);
582 }
583
584 static void
585 byte_array_append (void)
586 {
587   GByteArray *gbarray;
588   gint i;
589   guint8 *segment;
590
591   gbarray = g_byte_array_sized_new (1000);
592   for (i = 0; i < 10000; i++)
593     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
594
595   for (i = 0; i < 10000; i++)
596     {
597       g_assert (gbarray->data[4*i] == 'a');
598       g_assert (gbarray->data[4*i+1] == 'b');
599       g_assert (gbarray->data[4*i+2] == 'c');
600       g_assert (gbarray->data[4*i+3] == 'd');
601     }
602
603   segment = g_byte_array_free (gbarray, FALSE);
604
605   for (i = 0; i < 10000; i++)
606     {
607       g_assert (segment[4*i] == 'a');
608       g_assert (segment[4*i+1] == 'b');
609       g_assert (segment[4*i+2] == 'c');
610       g_assert (segment[4*i+3] == 'd');
611     }
612
613   g_free (segment);
614 }
615
616 static void
617 byte_array_prepend (void)
618 {
619   GByteArray *gbarray;
620   gint i;
621
622   gbarray = g_byte_array_new ();
623   g_byte_array_set_size (gbarray, 1000);
624
625   for (i = 0; i < 10000; i++)
626     g_byte_array_prepend (gbarray, (guint8*) "abcd", 4);
627
628   for (i = 0; i < 10000; i++)
629     {
630       g_assert (gbarray->data[4*i] == 'a');
631       g_assert (gbarray->data[4*i+1] == 'b');
632       g_assert (gbarray->data[4*i+2] == 'c');
633       g_assert (gbarray->data[4*i+3] == 'd');
634     }
635
636   g_byte_array_free (gbarray, TRUE);
637 }
638
639 static void
640 byte_array_ref_count (void)
641 {
642   GByteArray *gbarray;
643   GByteArray *gbarray2;
644   gint i;
645
646   gbarray = g_byte_array_new ();
647   for (i = 0; i < 10000; i++)
648     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
649
650   gbarray2 = g_byte_array_ref (gbarray);
651   g_assert (gbarray2 == gbarray);
652   g_byte_array_unref (gbarray2);
653   for (i = 0; i < 10000; i++)
654     {
655       g_assert (gbarray->data[4*i] == 'a');
656       g_assert (gbarray->data[4*i+1] == 'b');
657       g_assert (gbarray->data[4*i+2] == 'c');
658       g_assert (gbarray->data[4*i+3] == 'd');
659     }
660
661   gbarray2 = g_byte_array_ref (gbarray);
662   g_assert (gbarray2 == gbarray);
663   g_byte_array_free (gbarray, TRUE);
664   g_assert_cmpint (gbarray2->len, ==, 0);
665   g_byte_array_unref (gbarray2);
666 }
667
668 static void
669 byte_array_remove (void)
670 {
671   GByteArray *gbarray;
672   gint i;
673
674   gbarray = g_byte_array_new ();
675   for (i = 0; i < 100; i++)
676     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
677
678   g_assert_cmpint (gbarray->len, ==, 400);
679
680   g_byte_array_remove_index (gbarray, 4);
681   g_byte_array_remove_index (gbarray, 4);
682   g_byte_array_remove_index (gbarray, 4);
683   g_byte_array_remove_index (gbarray, 4);
684
685   g_assert_cmpint (gbarray->len, ==, 396);
686
687   for (i = 0; i < 99; i++)
688     {
689       g_assert (gbarray->data[4*i] == 'a');
690       g_assert (gbarray->data[4*i+1] == 'b');
691       g_assert (gbarray->data[4*i+2] == 'c');
692       g_assert (gbarray->data[4*i+3] == 'd');
693     }
694
695   g_byte_array_free (gbarray, TRUE);
696 }
697
698 static void
699 byte_array_remove_fast (void)
700 {
701   GByteArray *gbarray;
702   gint i;
703
704   gbarray = g_byte_array_new ();
705   for (i = 0; i < 100; i++)
706     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
707
708   g_assert_cmpint (gbarray->len, ==, 400);
709
710   g_byte_array_remove_index_fast (gbarray, 4);
711   g_byte_array_remove_index_fast (gbarray, 4);
712   g_byte_array_remove_index_fast (gbarray, 4);
713   g_byte_array_remove_index_fast (gbarray, 4);
714
715   g_assert_cmpint (gbarray->len, ==, 396);
716
717   for (i = 0; i < 99; i++)
718     {
719       g_assert (gbarray->data[4*i] == 'a');
720       g_assert (gbarray->data[4*i+1] == 'b');
721       g_assert (gbarray->data[4*i+2] == 'c');
722       g_assert (gbarray->data[4*i+3] == 'd');
723     }
724
725   g_byte_array_free (gbarray, TRUE);
726 }
727
728 static void
729 byte_array_remove_range (void)
730 {
731   GByteArray *gbarray;
732   gint i;
733
734   gbarray = g_byte_array_new ();
735   for (i = 0; i < 100; i++)
736     g_byte_array_append (gbarray, (guint8*) "abcd", 4);
737
738   g_assert_cmpint (gbarray->len, ==, 400);
739
740   g_byte_array_remove_range (gbarray, 12, 4);
741
742   g_assert_cmpint (gbarray->len, ==, 396);
743
744   for (i = 0; i < 99; i++)
745     {
746       g_assert (gbarray->data[4*i] == 'a');
747       g_assert (gbarray->data[4*i+1] == 'b');
748       g_assert (gbarray->data[4*i+2] == 'c');
749       g_assert (gbarray->data[4*i+3] == 'd');
750     }
751
752   g_byte_array_free (gbarray, TRUE);
753 }
754
755 static int
756 byte_compare (gconstpointer p1, gconstpointer p2)
757 {
758   const guint8 *i1 = p1;
759   const guint8 *i2 = p2;
760
761   return *i1 - *i2;
762 }
763
764 static int
765 byte_compare_data (gconstpointer p1, gconstpointer p2, gpointer data)
766 {
767   const guint8 *i1 = p1;
768   const guint8 *i2 = p2;
769
770   return *i1 - *i2;
771 }
772
773 static void
774 byte_array_sort (void)
775 {
776   GByteArray *gbarray;
777   gint i;
778   guint8 val;
779   guint8 prev, cur;
780
781   gbarray = g_byte_array_new ();
782   for (i = 0; i < 100; i++)
783     {
784       val = 'a' + g_random_int_range (0, 26);
785       g_byte_array_append (gbarray, (guint8*) &val, 1);
786     }
787
788   g_byte_array_sort (gbarray, byte_compare);
789
790   prev = 'a';
791   for (i = 0; i < gbarray->len; i++)
792     {
793       cur = gbarray->data[i];
794       g_assert_cmpint (prev, <=, cur);
795       prev = cur;
796     }
797
798   g_byte_array_free (gbarray, TRUE);
799 }
800
801 static void
802 byte_array_sort_with_data (void)
803 {
804   GByteArray *gbarray;
805   gint i;
806   guint8 val;
807   guint8 prev, cur;
808
809   gbarray = g_byte_array_new ();
810   for (i = 0; i < 100; i++)
811     {
812       val = 'a' + g_random_int_range (0, 26);
813       g_byte_array_append (gbarray, (guint8*) &val, 1);
814     }
815
816   g_byte_array_sort_with_data (gbarray, byte_compare_data, NULL);
817
818   prev = 'a';
819   for (i = 0; i < gbarray->len; i++)
820     {
821       cur = gbarray->data[i];
822       g_assert_cmpint (prev, <=, cur);
823       prev = cur;
824     }
825
826   g_byte_array_free (gbarray, TRUE);
827 }
828
829 static void
830 byte_array_new_take (void)
831 {
832   GByteArray *gbarray;
833   guint8 *data;
834
835   data = g_memdup ("woooweeewow", 11);
836   gbarray = g_byte_array_new_take (data, 11);
837   g_assert (gbarray->data == data);
838   g_assert_cmpuint (gbarray->len, ==, 11);
839   g_byte_array_free (gbarray, TRUE);
840 }
841
842 static void
843 byte_array_free_to_bytes (void)
844 {
845   GByteArray *gbarray;
846   gpointer memory;
847   GBytes *bytes;
848   gsize size;
849
850   gbarray = g_byte_array_new ();
851   g_byte_array_append (gbarray, (guint8 *)"woooweeewow", 11);
852   memory = gbarray->data;
853
854   bytes = g_byte_array_free_to_bytes (gbarray);
855   g_assert (bytes != NULL);
856   g_assert_cmpuint (g_bytes_get_size (bytes), ==, 11);
857   g_assert (g_bytes_get_data (bytes, &size) == memory);
858   g_assert_cmpuint (size, ==, 11);
859
860   g_bytes_unref (bytes);
861 }
862 int
863 main (int argc, char *argv[])
864 {
865   g_test_init (&argc, &argv, NULL);
866
867   g_test_bug_base ("http://bugs.gnome.org/");
868
869   /* array tests */
870   g_test_add_func ("/array/append", array_append);
871   g_test_add_func ("/array/prepend", array_prepend);
872   g_test_add_func ("/array/remove", array_remove);
873   g_test_add_func ("/array/remove-fast", array_remove_fast);
874   g_test_add_func ("/array/remove-range", array_remove_range);
875   g_test_add_func ("/array/ref-count", array_ref_count);
876   g_test_add_func ("/array/large-size", array_large_size);
877   g_test_add_func ("/array/sort", array_sort);
878   g_test_add_func ("/array/sort-with-data", array_sort_with_data);
879   g_test_add_func ("/array/clear-func", array_clear_func);
880
881   /* pointer arrays */
882   g_test_add_func ("/pointerarray/add", pointer_array_add);
883   g_test_add_func ("/pointerarray/insert", pointer_array_insert);
884   g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count);
885   g_test_add_func ("/pointerarray/free-func", pointer_array_free_func);
886   g_test_add_func ("/pointerarray/sort", pointer_array_sort);
887   g_test_add_func ("/pointerarray/sort-with-data", pointer_array_sort_with_data);
888
889   /* byte arrays */
890   g_test_add_func ("/bytearray/append", byte_array_append);
891   g_test_add_func ("/bytearray/prepend", byte_array_prepend);
892   g_test_add_func ("/bytearray/remove", byte_array_remove);
893   g_test_add_func ("/bytearray/remove-fast", byte_array_remove_fast);
894   g_test_add_func ("/bytearray/remove-range", byte_array_remove_range);
895   g_test_add_func ("/bytearray/ref-count", byte_array_ref_count);
896   g_test_add_func ("/bytearray/sort", byte_array_sort);
897   g_test_add_func ("/bytearray/sort-with-data", byte_array_sort_with_data);
898   g_test_add_func ("/bytearray/new-take", byte_array_new_take);
899   g_test_add_func ("/bytearray/free-to-bytes", byte_array_free_to_bytes);
900
901   return g_test_run ();
902 }
903