1 /* GLIB - Library of useful routines for C programming
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
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.
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.
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.
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/.
27 #undef G_DISABLE_ASSERT
36 sum_up (gpointer data,
39 gint *sum = (gint *)user_data;
41 *sum += GPOINTER_TO_INT (data);
50 garray = g_array_new (FALSE, FALSE, sizeof (gint));
51 for (i = 0; i < 10000; i++)
52 g_array_append_val (garray, i);
54 for (i = 0; i < 10000; i++)
55 g_assert_cmpint (g_array_index (garray, gint, i), ==, i);
57 g_array_free (garray, TRUE);
66 garray = g_array_new (FALSE, FALSE, sizeof (gint));
67 for (i = 0; i < 100; i++)
68 g_array_prepend_val (garray, i);
70 for (i = 0; i < 100; i++)
71 g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1));
73 g_array_free (garray, TRUE);
77 array_ref_count (void)
83 garray = g_array_new (FALSE, FALSE, sizeof (gint));
84 g_assert_cmpint (g_array_get_element_size (garray), ==, sizeof (gint));
85 for (i = 0; i < 100; i++)
86 g_array_prepend_val (garray, i);
88 /* check we can ref, unref and still access the array */
89 garray2 = g_array_ref (garray);
90 g_assert (garray == garray2);
91 g_array_unref (garray2);
92 for (i = 0; i < 100; i++)
93 g_assert_cmpint (g_array_index (garray, gint, i), ==, (100 - i - 1));
95 /* garray2 should be an empty valid GArray wrapper */
96 garray2 = g_array_ref (garray);
97 g_array_free (garray, TRUE);
99 g_assert_cmpint (garray2->len, ==, 0);
100 g_array_unref (garray2);
104 array_large_size (void)
108 g_test_bug ("568760");
110 array = g_array_new (TRUE, TRUE, sizeof (char));
112 /* it might take really long until the allocation happens */
113 if (g_test_trap_fork (10 /* s */ * 1000 /* ms */ * 1000 /* µs */, 0))
115 g_array_set_size (array, 1073750016);
116 exit (0); /* success */
118 g_test_trap_assert_passed ();
120 g_array_free (array, TRUE);
124 pointer_array_add (void)
130 gparray = g_ptr_array_new ();
131 for (i = 0; i < 10000; i++)
132 g_ptr_array_add (gparray, GINT_TO_POINTER (i));
134 for (i = 0; i < 10000; i++)
135 g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
137 g_ptr_array_foreach (gparray, sum_up, &sum);
138 g_assert (sum == 49995000);
140 g_ptr_array_free (gparray, TRUE);
144 pointer_array_ref_count (void)
151 gparray = g_ptr_array_new ();
152 for (i = 0; i < 10000; i++)
153 g_ptr_array_add (gparray, GINT_TO_POINTER (i));
155 /* check we can ref, unref and still access the array */
156 gparray2 = g_ptr_array_ref (gparray);
157 g_assert (gparray == gparray2);
158 g_ptr_array_unref (gparray2);
159 for (i = 0; i < 10000; i++)
160 g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
162 g_ptr_array_foreach (gparray, sum_up, &sum);
163 g_assert (sum == 49995000);
165 /* gparray2 should be an empty valid GPtrArray wrapper */
166 gparray2 = g_ptr_array_ref (gparray);
167 g_ptr_array_free (gparray, TRUE);
169 g_assert_cmpint (gparray2->len, ==, 0);
170 g_ptr_array_unref (gparray2);
173 static gint num_free_func_invocations = 0;
176 my_free_func (gpointer data)
178 num_free_func_invocations++;
183 pointer_array_free_func (void)
190 num_free_func_invocations = 0;
191 gparray = g_ptr_array_new_with_free_func (my_free_func);
192 g_ptr_array_unref (gparray);
193 g_assert_cmpint (num_free_func_invocations, ==, 0);
195 gparray = g_ptr_array_new_with_free_func (my_free_func);
196 g_ptr_array_free (gparray, TRUE);
197 g_assert_cmpint (num_free_func_invocations, ==, 0);
199 num_free_func_invocations = 0;
200 gparray = g_ptr_array_new_with_free_func (my_free_func);
201 g_ptr_array_add (gparray, g_strdup ("foo"));
202 g_ptr_array_add (gparray, g_strdup ("bar"));
203 g_ptr_array_add (gparray, g_strdup ("baz"));
204 g_ptr_array_remove_index (gparray, 0);
205 g_assert_cmpint (num_free_func_invocations, ==, 1);
206 s = g_strdup ("frob");
207 g_ptr_array_add (gparray, s);
208 g_assert (g_ptr_array_remove (gparray, s));
209 g_assert_cmpint (num_free_func_invocations, ==, 2);
210 g_ptr_array_set_size (gparray, 1);
211 g_assert_cmpint (num_free_func_invocations, ==, 3);
212 g_ptr_array_ref (gparray);
213 g_ptr_array_unref (gparray);
214 g_assert_cmpint (num_free_func_invocations, ==, 3);
215 g_ptr_array_unref (gparray);
216 g_assert_cmpint (num_free_func_invocations, ==, 4);
218 num_free_func_invocations = 0;
219 gparray = g_ptr_array_new_with_free_func (my_free_func);
220 g_ptr_array_add (gparray, g_strdup ("foo"));
221 g_ptr_array_add (gparray, g_strdup ("bar"));
222 g_ptr_array_add (gparray, g_strdup ("baz"));
223 g_ptr_array_add (gparray, NULL);
224 gparray2 = g_ptr_array_ref (gparray);
225 strv = (gchar **) g_ptr_array_free (gparray, FALSE);
226 g_assert_cmpint (num_free_func_invocations, ==, 0);
228 g_ptr_array_unref (gparray2);
229 g_assert_cmpint (num_free_func_invocations, ==, 0);
231 num_free_func_invocations = 0;
232 gparray = g_ptr_array_new_with_free_func (my_free_func);
233 g_ptr_array_add (gparray, g_strdup ("foo"));
234 g_ptr_array_add (gparray, g_strdup ("bar"));
235 g_ptr_array_add (gparray, g_strdup ("baz"));
236 g_ptr_array_unref (gparray);
237 g_assert_cmpint (num_free_func_invocations, ==, 3);
239 num_free_func_invocations = 0;
240 gparray = g_ptr_array_new_with_free_func (my_free_func);
241 g_ptr_array_add (gparray, g_strdup ("foo"));
242 g_ptr_array_add (gparray, g_strdup ("bar"));
243 g_ptr_array_add (gparray, g_strdup ("baz"));
244 g_ptr_array_free (gparray, TRUE);
245 g_assert_cmpint (num_free_func_invocations, ==, 3);
247 num_free_func_invocations = 0;
248 gparray = g_ptr_array_new_with_free_func (my_free_func);
249 g_ptr_array_add (gparray, "foo");
250 g_ptr_array_add (gparray, "bar");
251 g_ptr_array_add (gparray, "baz");
252 g_ptr_array_set_free_func (gparray, NULL);
253 g_ptr_array_free (gparray, TRUE);
254 g_assert_cmpint (num_free_func_invocations, ==, 0);
258 byte_array_append (void)
263 gbarray = g_byte_array_new ();
264 for (i = 0; i < 10000; i++)
265 g_byte_array_append (gbarray, (guint8*) "abcd", 4);
267 for (i = 0; i < 10000; i++)
269 g_assert (gbarray->data[4*i] == 'a');
270 g_assert (gbarray->data[4*i+1] == 'b');
271 g_assert (gbarray->data[4*i+2] == 'c');
272 g_assert (gbarray->data[4*i+3] == 'd');
275 g_byte_array_free (gbarray, TRUE);
279 byte_array_ref_count (void)
282 GByteArray *gbarray2;
285 gbarray = g_byte_array_new ();
286 for (i = 0; i < 10000; i++)
287 g_byte_array_append (gbarray, (guint8*) "abcd", 4);
289 gbarray2 = g_byte_array_ref (gbarray);
290 g_assert (gbarray2 == gbarray);
291 g_byte_array_unref (gbarray2);
292 for (i = 0; i < 10000; i++)
294 g_assert (gbarray->data[4*i] == 'a');
295 g_assert (gbarray->data[4*i+1] == 'b');
296 g_assert (gbarray->data[4*i+2] == 'c');
297 g_assert (gbarray->data[4*i+3] == 'd');
300 gbarray2 = g_byte_array_ref (gbarray);
301 g_assert (gbarray2 == gbarray);
302 g_byte_array_free (gbarray, TRUE);
303 g_assert_cmpint (gbarray2->len, ==, 0);
304 g_byte_array_unref (gbarray2);
308 main (int argc, char *argv[])
310 g_test_init (&argc, &argv, NULL);
312 g_test_bug_base ("http://bugs.gnome.org/%s");
315 g_test_add_func ("/array/append", array_append);
316 g_test_add_func ("/array/prepend", array_prepend);
317 g_test_add_func ("/array/ref-count", array_ref_count);
318 g_test_add_func ("/array/large-size", array_large_size);
321 g_test_add_func ("/pointerarray/add", pointer_array_add);
322 g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count);
323 g_test_add_func ("/pointerarray/free-func", pointer_array_free_func);
326 g_test_add_func ("/bytearray/append", byte_array_append);
327 g_test_add_func ("/bytearray/ref-count", byte_array_ref_count);
329 return g_test_run ();