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