1 #define GLIB_DISABLE_DEPRECATION_WARNINGS
3 #include <glib-object.h>
5 typedef struct _MyBoxed MyBoxed;
14 my_boxed_copy (gpointer orig)
19 b = g_slice_new (MyBoxed);
20 b->ivalue = a->ivalue;
21 b->bla = g_strdup (a->bla);
26 static gint my_boxed_free_count;
29 my_boxed_free (gpointer orig)
34 g_slice_free (MyBoxed, a);
36 my_boxed_free_count++;
39 static GType my_boxed_get_type (void);
40 #define MY_TYPE_BOXED (my_boxed_get_type ())
42 G_DEFINE_BOXED_TYPE (MyBoxed, my_boxed, my_boxed_copy, my_boxed_free)
45 test_define_boxed (void)
51 a.bla = g_strdup ("bla");
53 b = g_boxed_copy (MY_TYPE_BOXED, &a);
55 g_assert_cmpint (b->ivalue, ==, 20);
56 g_assert_cmpstr (b->bla, ==, "bla");
58 g_boxed_free (MY_TYPE_BOXED, b);
64 test_boxed_ownership (void)
66 GValue value = G_VALUE_INIT;
67 static MyBoxed boxed = { 10, "bla" };
69 g_value_init (&value, MY_TYPE_BOXED);
71 my_boxed_free_count = 0;
73 g_value_set_static_boxed (&value, &boxed);
74 g_value_reset (&value);
76 g_assert_cmpint (my_boxed_free_count, ==, 0);
78 g_value_set_boxed_take_ownership (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
79 g_value_reset (&value);
80 g_assert_cmpint (my_boxed_free_count, ==, 1);
82 g_value_take_boxed (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
83 g_value_reset (&value);
84 g_assert_cmpint (my_boxed_free_count, ==, 2);
86 g_value_set_boxed (&value, &boxed);
87 g_value_reset (&value);
88 g_assert_cmpint (my_boxed_free_count, ==, 3);
92 my_callback (gpointer user_data)
96 static gint destroy_count;
99 my_closure_notify (gpointer user_data, GClosure *closure)
105 test_boxed_closure (void)
109 GValue value = G_VALUE_INIT;
111 g_value_init (&value, G_TYPE_CLOSURE);
112 g_assert (G_VALUE_HOLDS_BOXED (&value));
114 closure = g_cclosure_new (G_CALLBACK (my_callback), "bla", my_closure_notify);
115 g_value_take_boxed (&value, closure);
117 closure2 = g_value_get_boxed (&value);
118 g_assert (closure2 == closure);
120 closure2 = g_value_dup_boxed (&value);
121 g_assert (closure2 == closure); /* closures use ref/unref for copy/free */
122 g_closure_unref (closure2);
124 g_value_unset (&value);
125 g_assert_cmpint (destroy_count, ==, 1);
129 test_boxed_date (void)
133 GValue value = G_VALUE_INIT;
135 g_value_init (&value, G_TYPE_DATE);
136 g_assert (G_VALUE_HOLDS_BOXED (&value));
138 date = g_date_new_dmy (1, 3, 1970);
139 g_value_take_boxed (&value, date);
141 date2 = g_value_get_boxed (&value);
142 g_assert (date2 == date);
144 date2 = g_value_dup_boxed (&value);
145 g_assert (date2 != date);
146 g_assert (g_date_compare (date, date2) == 0);
149 g_value_unset (&value);
153 test_boxed_value (void)
155 GValue value1 = G_VALUE_INIT;
157 GValue value = G_VALUE_INIT;
159 g_value_init (&value, G_TYPE_VALUE);
160 g_assert (G_VALUE_HOLDS_BOXED (&value));
162 g_value_init (&value1, G_TYPE_INT);
163 g_value_set_int (&value1, 26);
165 g_value_set_static_boxed (&value, &value1);
167 value2 = g_value_get_boxed (&value);
168 g_assert (value2 == &value1);
170 value2 = g_value_dup_boxed (&value);
171 g_assert (value2 != &value1);
172 g_assert (G_VALUE_HOLDS_INT (value2));
173 g_assert_cmpint (g_value_get_int (value2), ==, 26);
174 g_boxed_free (G_TYPE_VALUE, value2);
176 g_value_unset (&value);
180 test_boxed_string (void)
184 GValue value = G_VALUE_INIT;
186 g_value_init (&value, G_TYPE_GSTRING);
187 g_assert (G_VALUE_HOLDS_BOXED (&value));
189 v = g_string_new ("bla");
190 g_value_take_boxed (&value, v);
192 v2 = g_value_get_boxed (&value);
195 v2 = g_value_dup_boxed (&value);
197 g_assert (g_string_equal (v, v2));
198 g_string_free (v2, TRUE);
200 g_value_unset (&value);
204 test_boxed_hashtable (void)
208 GValue value = G_VALUE_INIT;
210 g_value_init (&value, G_TYPE_HASH_TABLE);
211 g_assert (G_VALUE_HOLDS_BOXED (&value));
213 v = g_hash_table_new (g_str_hash, g_str_equal);
214 g_value_take_boxed (&value, v);
216 v2 = g_value_get_boxed (&value);
219 v2 = g_value_dup_boxed (&value);
220 g_assert (v2 == v); /* hash tables use ref/unref for copy/free */
221 g_hash_table_unref (v2);
223 g_value_unset (&value);
227 test_boxed_array (void)
231 GValue value = G_VALUE_INIT;
233 g_value_init (&value, G_TYPE_ARRAY);
234 g_assert (G_VALUE_HOLDS_BOXED (&value));
236 v = g_array_new (TRUE, FALSE, 1);
237 g_value_take_boxed (&value, v);
239 v2 = g_value_get_boxed (&value);
242 v2 = g_value_dup_boxed (&value);
243 g_assert (v2 == v); /* arrays use ref/unref for copy/free */
246 g_value_unset (&value);
250 test_boxed_ptrarray (void)
254 GValue value = G_VALUE_INIT;
256 g_value_init (&value, G_TYPE_PTR_ARRAY);
257 g_assert (G_VALUE_HOLDS_BOXED (&value));
259 v = g_ptr_array_new ();
260 g_value_take_boxed (&value, v);
262 v2 = g_value_get_boxed (&value);
265 v2 = g_value_dup_boxed (&value);
266 g_assert (v2 == v); /* ptr arrays use ref/unref for copy/free */
267 g_ptr_array_unref (v2);
269 g_value_unset (&value);
273 test_boxed_regex (void)
277 GValue value = G_VALUE_INIT;
279 g_value_init (&value, G_TYPE_REGEX);
280 g_assert (G_VALUE_HOLDS_BOXED (&value));
282 v = g_regex_new ("a+b+", 0, 0, NULL);
283 g_value_take_boxed (&value, v);
285 v2 = g_value_get_boxed (&value);
288 v2 = g_value_dup_boxed (&value);
289 g_assert (v2 == v); /* regexes use ref/unref for copy/free */
292 g_value_unset (&value);
296 test_boxed_varianttype (void)
300 GValue value = G_VALUE_INIT;
302 g_value_init (&value, G_TYPE_VARIANT_TYPE);
303 g_assert (G_VALUE_HOLDS_BOXED (&value));
305 v = g_variant_type_new ("mas");
306 g_value_take_boxed (&value, v);
308 v2 = g_value_get_boxed (&value);
311 v2 = g_value_dup_boxed (&value);
313 g_assert_cmpstr (g_variant_type_peek_string (v), ==, g_variant_type_peek_string (v2));
314 g_variant_type_free (v2);
316 g_value_unset (&value);
320 test_boxed_datetime (void)
324 GValue value = G_VALUE_INIT;
326 g_value_init (&value, G_TYPE_DATE_TIME);
327 g_assert (G_VALUE_HOLDS_BOXED (&value));
329 v = g_date_time_new_now_local ();
330 g_value_take_boxed (&value, v);
332 v2 = g_value_get_boxed (&value);
335 v2 = g_value_dup_boxed (&value);
336 g_assert (v2 == v); /* datetime uses ref/unref for copy/free */
337 g_date_time_unref (v2);
339 g_value_unset (&value);
343 test_boxed_error (void)
347 GValue value = G_VALUE_INIT;
349 g_value_init (&value, G_TYPE_ERROR);
350 g_assert (G_VALUE_HOLDS_BOXED (&value));
352 v = g_error_new_literal (G_VARIANT_PARSE_ERROR,
353 G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG,
355 g_value_take_boxed (&value, v);
357 v2 = g_value_get_boxed (&value);
360 v2 = g_value_dup_boxed (&value);
362 g_assert_cmpint (v->domain, ==, v2->domain);
363 g_assert_cmpint (v->code, ==, v2->code);
364 g_assert_cmpstr (v->message, ==, v2->message);
367 g_value_unset (&value);
371 main (int argc, char *argv[])
374 g_test_init (&argc, &argv, NULL);
376 g_test_add_func ("/boxed/define", test_define_boxed);
377 g_test_add_func ("/boxed/ownership", test_boxed_ownership);
378 g_test_add_func ("/boxed/closure", test_boxed_closure);
379 g_test_add_func ("/boxed/date", test_boxed_date);
380 g_test_add_func ("/boxed/value", test_boxed_value);
381 g_test_add_func ("/boxed/string", test_boxed_string);
382 g_test_add_func ("/boxed/hashtable", test_boxed_hashtable);
383 g_test_add_func ("/boxed/array", test_boxed_array);
384 g_test_add_func ("/boxed/ptrarray", test_boxed_ptrarray);
385 g_test_add_func ("/boxed/regex", test_boxed_regex);
386 g_test_add_func ("/boxed/varianttype", test_boxed_varianttype);
387 g_test_add_func ("/boxed/error", test_boxed_error);
388 g_test_add_func ("/boxed/datetime", test_boxed_datetime);
390 return g_test_run ();