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