1 #include <glib-object.h>
3 typedef struct _MyBoxed MyBoxed;
12 my_boxed_copy (gpointer orig)
17 b = g_slice_new (MyBoxed);
18 b->ivalue = a->ivalue;
19 b->bla = g_strdup (a->bla);
24 static gint my_boxed_free_count;
27 my_boxed_free (gpointer orig)
32 g_slice_free (MyBoxed, a);
34 my_boxed_free_count++;
37 #define MY_TYPE_BOXED (my_boxed_get_type ())
39 G_DEFINE_BOXED_TYPE (MyBoxed, my_boxed, my_boxed_copy, my_boxed_free)
42 test_define_boxed (void)
48 a.bla = g_strdup ("bla");
50 b = g_boxed_copy (MY_TYPE_BOXED, &a);
52 g_assert_cmpint (b->ivalue, ==, 20);
53 g_assert_cmpstr (b->bla, ==, "bla");
55 g_boxed_free (MY_TYPE_BOXED, b);
59 test_boxed_ownership (void)
61 GValue value = { 0, };
62 static MyBoxed boxed = { 10, "bla" };
64 g_value_init (&value, MY_TYPE_BOXED);
66 my_boxed_free_count = 0;
68 g_value_set_static_boxed (&value, &boxed);
69 g_value_reset (&value);
71 g_assert_cmpint (my_boxed_free_count, ==, 0);
73 g_value_set_boxed_take_ownership (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
74 g_value_reset (&value);
75 g_assert_cmpint (my_boxed_free_count, ==, 1);
77 g_value_take_boxed (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
78 g_value_reset (&value);
79 g_assert_cmpint (my_boxed_free_count, ==, 2);
81 g_value_set_boxed (&value, &boxed);
82 g_value_reset (&value);
83 g_assert_cmpint (my_boxed_free_count, ==, 3);
87 my_callback (gpointer user_data)
91 static gint destroy_count;
94 my_closure_notify (gpointer user_data, GClosure *closure)
100 test_boxed_closure (void)
104 GValue value = { 0, };
106 g_value_init (&value, G_TYPE_CLOSURE);
107 g_assert (G_VALUE_HOLDS_BOXED (&value));
109 closure = g_cclosure_new (G_CALLBACK (my_callback), "bla", my_closure_notify);
110 g_value_take_boxed (&value, closure);
112 closure2 = g_value_get_boxed (&value);
113 g_assert (closure2 == closure);
115 closure2 = g_value_dup_boxed (&value);
116 g_assert (closure2 == closure); /* closures use ref/unref for copy/free */
117 g_closure_unref (closure2);
119 g_value_unset (&value);
120 g_assert_cmpint (destroy_count, ==, 1);
124 test_boxed_date (void)
128 GValue value = { 0, };
130 g_value_init (&value, G_TYPE_DATE);
131 g_assert (G_VALUE_HOLDS_BOXED (&value));
133 date = g_date_new_dmy (1, 3, 1970);
134 g_value_take_boxed (&value, date);
136 date2 = g_value_get_boxed (&value);
137 g_assert (date2 == date);
139 date2 = g_value_dup_boxed (&value);
140 g_assert (date2 != date);
141 g_assert (g_date_compare (date, date2) == 0);
144 g_value_unset (&value);
148 test_boxed_value (void)
150 GValue value1 = { 0, };
152 GValue value = { 0, };
154 g_value_init (&value, G_TYPE_VALUE);
155 g_assert (G_VALUE_HOLDS_BOXED (&value));
157 g_value_init (&value1, G_TYPE_INT);
158 g_value_set_int (&value1, 26);
160 g_value_set_static_boxed (&value, &value1);
162 value2 = g_value_get_boxed (&value);
163 g_assert (value2 == &value1);
165 value2 = g_value_dup_boxed (&value);
166 g_assert (value2 != &value1);
167 g_assert (G_VALUE_HOLDS_INT (value2));
168 g_assert_cmpint (g_value_get_int (value2), ==, 26);
169 g_boxed_free (G_TYPE_VALUE, value2);
171 g_value_unset (&value);
175 test_boxed_string (void)
179 GValue value = { 0, };
181 g_value_init (&value, G_TYPE_GSTRING);
182 g_assert (G_VALUE_HOLDS_BOXED (&value));
184 v = g_string_new ("bla");
185 g_value_take_boxed (&value, v);
187 v2 = g_value_get_boxed (&value);
190 v2 = g_value_dup_boxed (&value);
192 g_assert (g_string_equal (v, v2));
193 g_string_free (v2, TRUE);
195 g_value_unset (&value);
199 test_boxed_hashtable (void)
203 GValue value = { 0, };
205 g_value_init (&value, G_TYPE_HASH_TABLE);
206 g_assert (G_VALUE_HOLDS_BOXED (&value));
208 v = g_hash_table_new (g_str_hash, g_str_equal);
209 g_value_take_boxed (&value, v);
211 v2 = g_value_get_boxed (&value);
214 v2 = g_value_dup_boxed (&value);
215 g_assert (v2 == v); /* hash tables use ref/unref for copy/free */
216 g_hash_table_unref (v2);
218 g_value_unset (&value);
222 test_boxed_array (void)
226 GValue value = { 0, };
228 g_value_init (&value, G_TYPE_ARRAY);
229 g_assert (G_VALUE_HOLDS_BOXED (&value));
231 v = g_array_new (TRUE, FALSE, 1);
232 g_value_take_boxed (&value, v);
234 v2 = g_value_get_boxed (&value);
237 v2 = g_value_dup_boxed (&value);
238 g_assert (v2 == v); /* arrays use ref/unref for copy/free */
241 g_value_unset (&value);
245 test_boxed_ptrarray (void)
249 GValue value = { 0, };
251 g_value_init (&value, G_TYPE_PTR_ARRAY);
252 g_assert (G_VALUE_HOLDS_BOXED (&value));
254 v = g_ptr_array_new ();
255 g_value_take_boxed (&value, v);
257 v2 = g_value_get_boxed (&value);
260 v2 = g_value_dup_boxed (&value);
261 g_assert (v2 == v); /* ptr arrays use ref/unref for copy/free */
262 g_ptr_array_unref (v2);
264 g_value_unset (&value);
268 test_boxed_regex (void)
272 GValue value = { 0, };
274 g_value_init (&value, G_TYPE_REGEX);
275 g_assert (G_VALUE_HOLDS_BOXED (&value));
277 v = g_regex_new ("a+b+", 0, 0, NULL);
278 g_value_take_boxed (&value, v);
280 v2 = g_value_get_boxed (&value);
283 v2 = g_value_dup_boxed (&value);
284 g_assert (v2 == v); /* regexes use ref/unref for copy/free */
287 g_value_unset (&value);
291 test_boxed_varianttype (void)
295 GValue value = { 0, };
297 g_value_init (&value, G_TYPE_VARIANT_TYPE);
298 g_assert (G_VALUE_HOLDS_BOXED (&value));
300 v = g_variant_type_new ("mas");
301 g_value_take_boxed (&value, v);
303 v2 = g_value_get_boxed (&value);
306 v2 = g_value_dup_boxed (&value);
308 g_assert_cmpstr (g_variant_type_peek_string (v), ==, g_variant_type_peek_string (v2));
309 g_variant_type_free (v2);
311 g_value_unset (&value);
315 test_boxed_datetime (void)
319 GValue value = { 0, };
321 g_value_init (&value, G_TYPE_DATE_TIME);
322 g_assert (G_VALUE_HOLDS_BOXED (&value));
324 v = g_date_time_new_now_local ();
325 g_value_take_boxed (&value, v);
327 v2 = g_value_get_boxed (&value);
330 v2 = g_value_dup_boxed (&value);
331 g_assert (v2 == v); /* datetime uses ref/unref for copy/free */
332 g_date_time_unref (v2);
334 g_value_unset (&value);
338 test_boxed_error (void)
342 GValue value = { 0, };
344 g_value_init (&value, G_TYPE_ERROR);
345 g_assert (G_VALUE_HOLDS_BOXED (&value));
347 v = g_error_new_literal (G_VARIANT_PARSE_ERROR,
348 G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG,
350 g_value_take_boxed (&value, v);
352 v2 = g_value_get_boxed (&value);
355 v2 = g_value_dup_boxed (&value);
357 g_assert_cmpint (v->domain, ==, v2->domain);
358 g_assert_cmpint (v->code, ==, v2->code);
359 g_assert_cmpstr (v->message, ==, v2->message);
362 g_value_unset (&value);
366 main (int argc, char *argv[])
369 g_test_init (&argc, &argv, NULL);
371 g_test_add_func ("/boxed/define", test_define_boxed);
372 g_test_add_func ("/boxed/ownership", test_boxed_ownership);
373 g_test_add_func ("/boxed/closure", test_boxed_closure);
374 g_test_add_func ("/boxed/date", test_boxed_date);
375 g_test_add_func ("/boxed/value", test_boxed_value);
376 g_test_add_func ("/boxed/string", test_boxed_string);
377 g_test_add_func ("/boxed/hashtable", test_boxed_hashtable);
378 g_test_add_func ("/boxed/array", test_boxed_array);
379 g_test_add_func ("/boxed/ptrarray", test_boxed_ptrarray);
380 g_test_add_func ("/boxed/regex", test_boxed_regex);
381 g_test_add_func ("/boxed/varianttype", test_boxed_varianttype);
382 g_test_add_func ("/boxed/error", test_boxed_error);
383 g_test_add_func ("/boxed/datetime", test_boxed_datetime);
385 return g_test_run ();