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