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