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 */
119 if (!g_test_trap_has_passed ())
121 g_test_trap_assert_stderr ("*failed to allocate 2147483648 bytes*");
124 g_array_free (array, TRUE);
128 pointer_array_add (void)
134 gparray = g_ptr_array_new ();
135 for (i = 0; i < 10000; i++)
136 g_ptr_array_add (gparray, GINT_TO_POINTER (i));
138 for (i = 0; i < 10000; i++)
139 g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
141 g_ptr_array_foreach (gparray, sum_up, &sum);
142 g_assert (sum == 49995000);
144 g_ptr_array_free (gparray, TRUE);
148 pointer_array_ref_count (void)
155 gparray = g_ptr_array_new ();
156 for (i = 0; i < 10000; i++)
157 g_ptr_array_add (gparray, GINT_TO_POINTER (i));
159 /* check we can ref, unref and still access the array */
160 gparray2 = g_ptr_array_ref (gparray);
161 g_assert (gparray == gparray2);
162 g_ptr_array_unref (gparray2);
163 for (i = 0; i < 10000; i++)
164 g_assert (g_ptr_array_index (gparray, i) == GINT_TO_POINTER (i));
166 g_ptr_array_foreach (gparray, sum_up, &sum);
167 g_assert (sum == 49995000);
169 /* gparray2 should be an empty valid GPtrArray wrapper */
170 gparray2 = g_ptr_array_ref (gparray);
171 g_ptr_array_free (gparray, TRUE);
173 g_assert_cmpint (gparray2->len, ==, 0);
174 g_ptr_array_unref (gparray2);
177 static gint num_free_func_invocations = 0;
180 my_free_func (gpointer data)
182 num_free_func_invocations++;
187 pointer_array_free_func (void)
194 num_free_func_invocations = 0;
195 gparray = g_ptr_array_new_with_free_func (my_free_func);
196 g_ptr_array_unref (gparray);
197 g_assert_cmpint (num_free_func_invocations, ==, 0);
199 gparray = g_ptr_array_new_with_free_func (my_free_func);
200 g_ptr_array_free (gparray, TRUE);
201 g_assert_cmpint (num_free_func_invocations, ==, 0);
203 num_free_func_invocations = 0;
204 gparray = g_ptr_array_new_with_free_func (my_free_func);
205 g_ptr_array_add (gparray, g_strdup ("foo"));
206 g_ptr_array_add (gparray, g_strdup ("bar"));
207 g_ptr_array_add (gparray, g_strdup ("baz"));
208 g_ptr_array_remove_index (gparray, 0);
209 g_assert_cmpint (num_free_func_invocations, ==, 1);
210 s = g_strdup ("frob");
211 g_ptr_array_add (gparray, s);
212 g_assert (g_ptr_array_remove (gparray, s));
213 g_assert_cmpint (num_free_func_invocations, ==, 2);
214 g_ptr_array_set_size (gparray, 1);
215 g_assert_cmpint (num_free_func_invocations, ==, 3);
216 g_ptr_array_ref (gparray);
217 g_ptr_array_unref (gparray);
218 g_assert_cmpint (num_free_func_invocations, ==, 3);
219 g_ptr_array_unref (gparray);
220 g_assert_cmpint (num_free_func_invocations, ==, 4);
222 num_free_func_invocations = 0;
223 gparray = g_ptr_array_new_with_free_func (my_free_func);
224 g_ptr_array_add (gparray, g_strdup ("foo"));
225 g_ptr_array_add (gparray, g_strdup ("bar"));
226 g_ptr_array_add (gparray, g_strdup ("baz"));
227 g_ptr_array_add (gparray, NULL);
228 gparray2 = g_ptr_array_ref (gparray);
229 strv = (gchar **) g_ptr_array_free (gparray, FALSE);
230 g_assert_cmpint (num_free_func_invocations, ==, 0);
232 g_ptr_array_unref (gparray2);
233 g_assert_cmpint (num_free_func_invocations, ==, 0);
235 num_free_func_invocations = 0;
236 gparray = g_ptr_array_new_with_free_func (my_free_func);
237 g_ptr_array_add (gparray, g_strdup ("foo"));
238 g_ptr_array_add (gparray, g_strdup ("bar"));
239 g_ptr_array_add (gparray, g_strdup ("baz"));
240 g_ptr_array_unref (gparray);
241 g_assert_cmpint (num_free_func_invocations, ==, 3);
243 num_free_func_invocations = 0;
244 gparray = g_ptr_array_new_with_free_func (my_free_func);
245 g_ptr_array_add (gparray, g_strdup ("foo"));
246 g_ptr_array_add (gparray, g_strdup ("bar"));
247 g_ptr_array_add (gparray, g_strdup ("baz"));
248 g_ptr_array_free (gparray, TRUE);
249 g_assert_cmpint (num_free_func_invocations, ==, 3);
251 num_free_func_invocations = 0;
252 gparray = g_ptr_array_new_with_free_func (my_free_func);
253 g_ptr_array_add (gparray, "foo");
254 g_ptr_array_add (gparray, "bar");
255 g_ptr_array_add (gparray, "baz");
256 g_ptr_array_set_free_func (gparray, NULL);
257 g_ptr_array_free (gparray, TRUE);
258 g_assert_cmpint (num_free_func_invocations, ==, 0);
262 byte_array_append (void)
267 gbarray = g_byte_array_new ();
268 for (i = 0; i < 10000; i++)
269 g_byte_array_append (gbarray, (guint8*) "abcd", 4);
271 for (i = 0; i < 10000; i++)
273 g_assert (gbarray->data[4*i] == 'a');
274 g_assert (gbarray->data[4*i+1] == 'b');
275 g_assert (gbarray->data[4*i+2] == 'c');
276 g_assert (gbarray->data[4*i+3] == 'd');
279 g_byte_array_free (gbarray, TRUE);
283 byte_array_ref_count (void)
286 GByteArray *gbarray2;
289 gbarray = g_byte_array_new ();
290 for (i = 0; i < 10000; i++)
291 g_byte_array_append (gbarray, (guint8*) "abcd", 4);
293 gbarray2 = g_byte_array_ref (gbarray);
294 g_assert (gbarray2 == gbarray);
295 g_byte_array_unref (gbarray2);
296 for (i = 0; i < 10000; i++)
298 g_assert (gbarray->data[4*i] == 'a');
299 g_assert (gbarray->data[4*i+1] == 'b');
300 g_assert (gbarray->data[4*i+2] == 'c');
301 g_assert (gbarray->data[4*i+3] == 'd');
304 gbarray2 = g_byte_array_ref (gbarray);
305 g_assert (gbarray2 == gbarray);
306 g_byte_array_free (gbarray, TRUE);
307 g_assert_cmpint (gbarray2->len, ==, 0);
308 g_byte_array_unref (gbarray2);
312 main (int argc, char *argv[])
314 g_test_init (&argc, &argv, NULL);
316 g_test_bug_base ("http://bugs.gnome.org/%s");
319 g_test_add_func ("/array/append", array_append);
320 g_test_add_func ("/array/prepend", array_prepend);
321 g_test_add_func ("/array/ref-count", array_ref_count);
322 g_test_add_func ("/array/large-size", array_large_size);
325 g_test_add_func ("/pointerarray/add", pointer_array_add);
326 g_test_add_func ("/pointerarray/ref-count", pointer_array_ref_count);
327 g_test_add_func ("/pointerarray/free-func", pointer_array_free_func);
330 g_test_add_func ("/bytearray/append", byte_array_append);
331 g_test_add_func ("/bytearray/ref-count", byte_array_ref_count);
333 return g_test_run ();