• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef GLIB_DISABLE_DEPRECATION_WARNINGS
2 #define GLIB_DISABLE_DEPRECATION_WARNINGS
3 #endif
4 
5 #include <glib-object.h>
6 
7 typedef struct _MyBoxed MyBoxed;
8 
9 struct _MyBoxed
10 {
11   gint ivalue;
12   gchar *bla;
13 };
14 
15 static gpointer
my_boxed_copy(gpointer orig)16 my_boxed_copy (gpointer orig)
17 {
18   MyBoxed *a = orig;
19   MyBoxed *b;
20 
21   b = g_slice_new (MyBoxed);
22   b->ivalue = a->ivalue;
23   b->bla = g_strdup (a->bla);
24 
25   return b;
26 }
27 
28 static gint my_boxed_free_count;
29 
30 static void
my_boxed_free(gpointer orig)31 my_boxed_free (gpointer orig)
32 {
33   MyBoxed *a = orig;
34 
35   g_free (a->bla);
36   g_slice_free (MyBoxed, a);
37 
38   my_boxed_free_count++;
39 }
40 
41 static GType my_boxed_get_type (void);
42 #define MY_TYPE_BOXED (my_boxed_get_type ())
43 
G_DEFINE_BOXED_TYPE(MyBoxed,my_boxed,my_boxed_copy,my_boxed_free)44 G_DEFINE_BOXED_TYPE (MyBoxed, my_boxed, my_boxed_copy, my_boxed_free)
45 
46 static void
47 test_define_boxed (void)
48 {
49   MyBoxed a;
50   MyBoxed *b;
51 
52   a.ivalue = 20;
53   a.bla = g_strdup ("bla");
54 
55   b = g_boxed_copy (MY_TYPE_BOXED, &a);
56 
57   g_assert_cmpint (b->ivalue, ==, 20);
58   g_assert_cmpstr (b->bla, ==, "bla");
59 
60   g_boxed_free (MY_TYPE_BOXED, b);
61 
62   g_free (a.bla);
63 }
64 
65 static void
test_boxed_ownership(void)66 test_boxed_ownership (void)
67 {
68   GValue value = G_VALUE_INIT;
69   static MyBoxed boxed = { 10, "bla" };
70 
71   g_value_init (&value, MY_TYPE_BOXED);
72 
73   my_boxed_free_count = 0;
74 
75   g_value_set_static_boxed (&value, &boxed);
76   g_value_reset (&value);
77 
78   g_assert_cmpint (my_boxed_free_count, ==, 0);
79 
80   g_value_set_boxed_take_ownership (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
81   g_value_reset (&value);
82   g_assert_cmpint (my_boxed_free_count, ==, 1);
83 
84   g_value_take_boxed (&value, g_boxed_copy (MY_TYPE_BOXED, &boxed));
85   g_value_reset (&value);
86   g_assert_cmpint (my_boxed_free_count, ==, 2);
87 
88   g_value_set_boxed (&value, &boxed);
89   g_value_reset (&value);
90   g_assert_cmpint (my_boxed_free_count, ==, 3);
91 }
92 
93 static void
my_callback(gpointer user_data)94 my_callback (gpointer user_data)
95 {
96 }
97 
98 static gint destroy_count;
99 
100 static void
my_closure_notify(gpointer user_data,GClosure * closure)101 my_closure_notify (gpointer user_data, GClosure *closure)
102 {
103   destroy_count++;
104 }
105 
106 static void
test_boxed_closure(void)107 test_boxed_closure (void)
108 {
109   GClosure *closure;
110   GClosure *closure2;
111   GValue value = G_VALUE_INIT;
112 
113   g_value_init (&value, G_TYPE_CLOSURE);
114   g_assert (G_VALUE_HOLDS_BOXED (&value));
115 
116   closure = g_cclosure_new (G_CALLBACK (my_callback), "bla", my_closure_notify);
117   g_value_take_boxed (&value, closure);
118 
119   closure2 = g_value_get_boxed (&value);
120   g_assert (closure2 == closure);
121 
122   closure2 = g_value_dup_boxed (&value);
123   g_assert (closure2 == closure); /* closures use ref/unref for copy/free */
124   g_closure_unref (closure2);
125 
126   g_value_unset (&value);
127   g_assert_cmpint (destroy_count, ==, 1);
128 }
129 
130 static void
test_boxed_date(void)131 test_boxed_date (void)
132 {
133   GDate *date;
134   GDate *date2;
135   GValue value = G_VALUE_INIT;
136 
137   g_value_init (&value, G_TYPE_DATE);
138   g_assert (G_VALUE_HOLDS_BOXED (&value));
139 
140   date = g_date_new_dmy (1, 3, 1970);
141   g_value_take_boxed (&value, date);
142 
143   date2 = g_value_get_boxed (&value);
144   g_assert (date2 == date);
145 
146   date2 = g_value_dup_boxed (&value);
147   g_assert (date2 != date);
148   g_assert (g_date_compare (date, date2) == 0);
149   g_date_free (date2);
150 
151   g_value_unset (&value);
152 }
153 
154 static void
test_boxed_value(void)155 test_boxed_value (void)
156 {
157   GValue value1 = G_VALUE_INIT;
158   GValue *value2;
159   GValue value = G_VALUE_INIT;
160 
161   g_value_init (&value, G_TYPE_VALUE);
162   g_assert (G_VALUE_HOLDS_BOXED (&value));
163 
164   g_value_init (&value1, G_TYPE_INT);
165   g_value_set_int (&value1, 26);
166 
167   g_value_set_static_boxed (&value, &value1);
168 
169   value2 = g_value_get_boxed (&value);
170   g_assert (value2 == &value1);
171 
172   value2 = g_value_dup_boxed (&value);
173   g_assert (value2 != &value1);
174   g_assert (G_VALUE_HOLDS_INT (value2));
175   g_assert_cmpint (g_value_get_int (value2), ==, 26);
176   g_boxed_free (G_TYPE_VALUE, value2);
177 
178   g_value_unset (&value);
179 }
180 
181 static void
test_boxed_string(void)182 test_boxed_string (void)
183 {
184   GString *v;
185   GString *v2;
186   GValue value = G_VALUE_INIT;
187 
188   g_value_init (&value, G_TYPE_GSTRING);
189   g_assert (G_VALUE_HOLDS_BOXED (&value));
190 
191   v = g_string_new ("bla");
192   g_value_take_boxed (&value, v);
193 
194   v2 = g_value_get_boxed (&value);
195   g_assert (v2 == v);
196 
197   v2 = g_value_dup_boxed (&value);
198   g_assert (v2 != v);
199   g_assert (g_string_equal (v, v2));
200   g_string_free (v2, TRUE);
201 
202   g_value_unset (&value);
203 }
204 
205 static void
test_boxed_hashtable(void)206 test_boxed_hashtable (void)
207 {
208   GHashTable *v;
209   GHashTable *v2;
210   GValue value = G_VALUE_INIT;
211 
212   g_value_init (&value, G_TYPE_HASH_TABLE);
213   g_assert (G_VALUE_HOLDS_BOXED (&value));
214 
215   v = g_hash_table_new (g_str_hash, g_str_equal);
216   g_value_take_boxed (&value, v);
217 
218   v2 = g_value_get_boxed (&value);
219   g_assert (v2 == v);
220 
221   v2 = g_value_dup_boxed (&value);
222   g_assert (v2 == v);  /* hash tables use ref/unref for copy/free */
223   g_hash_table_unref (v2);
224 
225   g_value_unset (&value);
226 }
227 
228 static void
test_boxed_array(void)229 test_boxed_array (void)
230 {
231   GArray *v;
232   GArray *v2;
233   GValue value = G_VALUE_INIT;
234 
235   g_value_init (&value, G_TYPE_ARRAY);
236   g_assert (G_VALUE_HOLDS_BOXED (&value));
237 
238   v = g_array_new (TRUE, FALSE, 1);
239   g_value_take_boxed (&value, v);
240 
241   v2 = g_value_get_boxed (&value);
242   g_assert (v2 == v);
243 
244   v2 = g_value_dup_boxed (&value);
245   g_assert (v2 == v);  /* arrays use ref/unref for copy/free */
246   g_array_unref (v2);
247 
248   g_value_unset (&value);
249 }
250 
251 static void
test_boxed_ptrarray(void)252 test_boxed_ptrarray (void)
253 {
254   GPtrArray *v;
255   GPtrArray *v2;
256   GValue value = G_VALUE_INIT;
257 
258   g_value_init (&value, G_TYPE_PTR_ARRAY);
259   g_assert (G_VALUE_HOLDS_BOXED (&value));
260 
261   v = g_ptr_array_new ();
262   g_value_take_boxed (&value, v);
263 
264   v2 = g_value_get_boxed (&value);
265   g_assert (v2 == v);
266 
267   v2 = g_value_dup_boxed (&value);
268   g_assert (v2 == v);  /* ptr arrays use ref/unref for copy/free */
269   g_ptr_array_unref (v2);
270 
271   g_value_unset (&value);
272 }
273 
274 static void
test_boxed_regex(void)275 test_boxed_regex (void)
276 {
277   GRegex *v;
278   GRegex *v2;
279   GValue value = G_VALUE_INIT;
280 
281   g_value_init (&value, G_TYPE_REGEX);
282   g_assert (G_VALUE_HOLDS_BOXED (&value));
283 
284   v = g_regex_new ("a+b+", 0, 0, NULL);
285   g_value_take_boxed (&value, v);
286 
287   v2 = g_value_get_boxed (&value);
288   g_assert (v2 == v);
289 
290   v2 = g_value_dup_boxed (&value);
291   g_assert (v2 == v);  /* regexes use ref/unref for copy/free */
292   g_regex_unref (v2);
293 
294   g_value_unset (&value);
295 }
296 
297 static void
test_boxed_matchinfo(void)298 test_boxed_matchinfo (void)
299 {
300   GRegex *r;
301   GMatchInfo *info, *info2;
302   gboolean ret;
303   GValue value = G_VALUE_INIT;
304 
305   g_value_init (&value, G_TYPE_MATCH_INFO);
306   g_assert (G_VALUE_HOLDS_BOXED (&value));
307 
308   r = g_regex_new ("ab", 0, 0, NULL);
309   ret = g_regex_match (r, "blabla abab bla", 0, &info);
310   g_assert (ret);
311   g_value_take_boxed (&value, info);
312 
313   info2 = g_value_get_boxed (&value);
314   g_assert (info == info2);
315 
316   info2 = g_value_dup_boxed (&value);
317   g_assert (info == info2);  /* matchinfo uses ref/unref for copy/free */
318   g_match_info_unref (info2);
319 
320   g_value_unset (&value);
321   g_regex_unref (r);
322 }
323 
324 static void
test_boxed_varianttype(void)325 test_boxed_varianttype (void)
326 {
327   GVariantType *v;
328   GVariantType *v2;
329   GValue value = G_VALUE_INIT;
330 
331   g_value_init (&value, G_TYPE_VARIANT_TYPE);
332   g_assert (G_VALUE_HOLDS_BOXED (&value));
333 
334   v = g_variant_type_new ("mas");
335   g_value_take_boxed (&value, v);
336 
337   v2 = g_value_get_boxed (&value);
338   g_assert (v2 == v);
339 
340   v2 = g_value_dup_boxed (&value);
341   g_assert (v2 != v);
342   g_assert_cmpstr (g_variant_type_peek_string (v), ==, g_variant_type_peek_string (v2));
343   g_variant_type_free (v2);
344 
345   g_value_unset (&value);
346 }
347 
348 static void
test_boxed_datetime(void)349 test_boxed_datetime (void)
350 {
351   GDateTime *v;
352   GDateTime *v2;
353   GValue value = G_VALUE_INIT;
354 
355   g_value_init (&value, G_TYPE_DATE_TIME);
356   g_assert (G_VALUE_HOLDS_BOXED (&value));
357 
358   v = g_date_time_new_now_local ();
359   g_value_take_boxed (&value, v);
360 
361   v2 = g_value_get_boxed (&value);
362   g_assert (v2 == v);
363 
364   v2 = g_value_dup_boxed (&value);
365   g_assert (v2 == v); /* datetime uses ref/unref for copy/free */
366   g_date_time_unref (v2);
367 
368   g_value_unset (&value);
369 }
370 
371 static void
test_boxed_error(void)372 test_boxed_error (void)
373 {
374   GError *v;
375   GError *v2;
376   GValue value = G_VALUE_INIT;
377 
378   g_value_init (&value, G_TYPE_ERROR);
379   g_assert (G_VALUE_HOLDS_BOXED (&value));
380 
381   v = g_error_new_literal (G_VARIANT_PARSE_ERROR,
382                            G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG,
383                            "Too damn big");
384   g_value_take_boxed (&value, v);
385 
386   v2 = g_value_get_boxed (&value);
387   g_assert (v2 == v);
388 
389   v2 = g_value_dup_boxed (&value);
390   g_assert (v2 != v);
391   g_assert_cmpint (v->domain, ==, v2->domain);
392   g_assert_cmpint (v->code, ==, v2->code);
393   g_assert_cmpstr (v->message, ==, v2->message);
394   g_error_free (v2);
395 
396   g_value_unset (&value);
397 }
398 
399 static void
test_boxed_keyfile(void)400 test_boxed_keyfile (void)
401 {
402   GKeyFile *k, *k2;
403   GValue value = G_VALUE_INIT;
404 
405   g_value_init (&value, G_TYPE_KEY_FILE);
406   g_assert (G_VALUE_HOLDS_BOXED (&value));
407 
408   k = g_key_file_new ();
409   g_value_take_boxed (&value, k);
410 
411   k2 = g_value_get_boxed (&value);
412   g_assert (k == k2);
413 
414   k2 = g_value_dup_boxed (&value);
415   g_assert (k == k2);  /* keyfile uses ref/unref for copy/free */
416   g_key_file_unref (k2);
417 
418   g_value_unset (&value);
419 }
420 
421 static void
test_boxed_mainloop(void)422 test_boxed_mainloop (void)
423 {
424   GMainLoop *l, *l2;
425   GValue value = G_VALUE_INIT;
426 
427   g_value_init (&value, G_TYPE_MAIN_LOOP);
428   g_assert (G_VALUE_HOLDS_BOXED (&value));
429 
430   l = g_main_loop_new (NULL, FALSE);
431   g_value_take_boxed (&value, l);
432 
433   l2 = g_value_get_boxed (&value);
434   g_assert (l == l2);
435 
436   l2 = g_value_dup_boxed (&value);
437   g_assert (l == l2);  /* mainloop uses ref/unref for copy/free */
438   g_main_loop_unref (l2);
439 
440   g_value_unset (&value);
441 }
442 
443 static void
test_boxed_maincontext(void)444 test_boxed_maincontext (void)
445 {
446   GMainContext *c, *c2;
447   GValue value = G_VALUE_INIT;
448 
449   g_value_init (&value, G_TYPE_MAIN_CONTEXT);
450   g_assert (G_VALUE_HOLDS_BOXED (&value));
451 
452   c = g_main_context_new ();
453   g_value_take_boxed (&value, c);
454 
455   c2 = g_value_get_boxed (&value);
456   g_assert (c == c2);
457 
458   c2 = g_value_dup_boxed (&value);
459   g_assert (c == c2);  /* maincontext uses ref/unref for copy/free */
460   g_main_context_unref (c2);
461 
462   g_value_unset (&value);
463 }
464 
465 static void
test_boxed_source(void)466 test_boxed_source (void)
467 {
468   GSource *s, *s2;
469   GValue value = G_VALUE_INIT;
470 
471   g_value_init (&value, G_TYPE_SOURCE);
472   g_assert (G_VALUE_HOLDS_BOXED (&value));
473 
474   s = g_idle_source_new ();
475   g_value_take_boxed (&value, s);
476 
477   s2 = g_value_get_boxed (&value);
478   g_assert (s == s2);
479 
480   s2 = g_value_dup_boxed (&value);
481   g_assert (s == s2);  /* source uses ref/unref for copy/free */
482   g_source_unref (s2);
483 
484   g_value_unset (&value);
485 }
486 
487 static void
test_boxed_variantbuilder(void)488 test_boxed_variantbuilder (void)
489 {
490   GVariantBuilder *v, *v2;
491   GValue value = G_VALUE_INIT;
492 
493   g_value_init (&value, G_TYPE_VARIANT_BUILDER);
494   g_assert (G_VALUE_HOLDS_BOXED (&value));
495 
496   v = g_variant_builder_new (G_VARIANT_TYPE_OBJECT_PATH_ARRAY);
497   g_value_take_boxed (&value, v);
498 
499   v2 = g_value_get_boxed (&value);
500   g_assert (v == v2);
501 
502   v2 = g_value_dup_boxed (&value);
503   g_assert (v == v2);  /* variantbuilder uses ref/unref for copy/free */
504   g_variant_builder_unref (v2);
505 
506   g_value_unset (&value);
507 }
508 
509 static void
test_boxed_timezone(void)510 test_boxed_timezone (void)
511 {
512   GTimeZone *z, *z2;
513   GValue value = G_VALUE_INIT;
514 
515   g_value_init (&value, G_TYPE_TIME_ZONE);
516   g_assert (G_VALUE_HOLDS_BOXED (&value));
517 
518   z = g_time_zone_new_utc ();
519   g_value_take_boxed (&value, z);
520 
521   z2 = g_value_get_boxed (&value);
522   g_assert (z == z2);
523 
524   z2 = g_value_dup_boxed (&value);
525   g_assert (z == z2);  /* timezone uses ref/unref for copy/free */
526   g_time_zone_unref (z2);
527 
528   g_value_unset (&value);
529 }
530 
531 static void
test_boxed_pollfd(void)532 test_boxed_pollfd (void)
533 {
534   GPollFD *p, *p2;
535   GValue value = G_VALUE_INIT;
536 
537   g_value_init (&value, G_TYPE_POLLFD);
538   g_assert (G_VALUE_HOLDS_BOXED (&value));
539 
540   p = g_new (GPollFD, 1);
541   g_value_take_boxed (&value, p);
542 
543   p2 = g_value_get_boxed (&value);
544   g_assert (p == p2);
545 
546   p2 = g_value_dup_boxed (&value);
547   g_assert (p != p2);
548   g_free (p2);
549 
550   g_value_unset (&value);
551 }
552 
553 static void
test_boxed_markup(void)554 test_boxed_markup (void)
555 {
556   GMarkupParseContext *c, *c2;
557   const GMarkupParser parser = { 0 };
558   GValue value = G_VALUE_INIT;
559 
560   g_value_init (&value, G_TYPE_MARKUP_PARSE_CONTEXT);
561   g_assert (G_VALUE_HOLDS_BOXED (&value));
562 
563   c = g_markup_parse_context_new (&parser, 0, NULL, NULL);
564   g_value_take_boxed (&value, c);
565 
566   c2 = g_value_get_boxed (&value);
567   g_assert (c == c2);
568 
569   c2 = g_value_dup_boxed (&value);
570   g_assert (c == c2);
571   g_markup_parse_context_unref (c2);
572 
573   g_value_unset (&value);
574 }
575 
576 static void
test_boxed_thread(void)577 test_boxed_thread (void)
578 {
579   GThread *t, *t2;
580   GValue value = G_VALUE_INIT;
581 
582   g_value_init (&value, G_TYPE_THREAD);
583   g_assert (G_VALUE_HOLDS_BOXED (&value));
584 
585   t = g_thread_self ();
586   g_value_set_boxed (&value, t);
587 
588   t2 = g_value_get_boxed (&value);
589   g_assert (t == t2);
590 
591   t2 = g_value_dup_boxed (&value);
592   g_assert (t == t2);
593   g_thread_unref (t2);
594 
595   g_value_unset (&value);
596 }
597 
598 static void
test_boxed_checksum(void)599 test_boxed_checksum (void)
600 {
601   GChecksum *c, *c2;
602   GValue value = G_VALUE_INIT;
603 
604   g_value_init (&value, G_TYPE_CHECKSUM);
605   g_assert (G_VALUE_HOLDS_BOXED (&value));
606 
607   c = g_checksum_new (G_CHECKSUM_SHA512);
608   g_value_take_boxed (&value, c);
609 
610   c2 = g_value_get_boxed (&value);
611   g_assert (c == c2);
612 
613   c2 = g_value_dup_boxed (&value);
614   g_assert (c != c2);
615   g_checksum_free (c2);
616 
617   g_value_unset (&value);
618 }
619 
620 static gint
treecmp(gconstpointer a,gconstpointer b)621 treecmp (gconstpointer a, gconstpointer b)
622 {
623   return (a < b) ? -1 : (a > b);
624 }
625 
626 static void
test_boxed_tree(void)627 test_boxed_tree (void)
628 {
629   GTree *t, *t2;
630   GValue value = G_VALUE_INIT;
631 
632   g_value_init (&value, G_TYPE_TREE);
633   g_assert_true (G_VALUE_HOLDS_BOXED (&value));
634 
635   t = g_tree_new (treecmp);
636   g_value_take_boxed (&value, t);
637 
638   t2 = g_value_get_boxed (&value);
639   g_assert_true (t == t2);
640 
641   t2 = g_value_dup_boxed (&value);
642   g_assert_true (t == t2); /* trees use ref/unref for copy/free */
643   g_tree_unref (t2);
644 
645   g_value_unset (&value);
646 }
647 
648 int
main(int argc,char * argv[])649 main (int argc, char *argv[])
650 {
651   g_test_init (&argc, &argv, NULL);
652 
653   g_test_add_func ("/boxed/define", test_define_boxed);
654   g_test_add_func ("/boxed/ownership", test_boxed_ownership);
655   g_test_add_func ("/boxed/closure", test_boxed_closure);
656   g_test_add_func ("/boxed/date", test_boxed_date);
657   g_test_add_func ("/boxed/value", test_boxed_value);
658   g_test_add_func ("/boxed/string", test_boxed_string);
659   g_test_add_func ("/boxed/hashtable", test_boxed_hashtable);
660   g_test_add_func ("/boxed/array", test_boxed_array);
661   g_test_add_func ("/boxed/ptrarray", test_boxed_ptrarray);
662   g_test_add_func ("/boxed/regex", test_boxed_regex);
663   g_test_add_func ("/boxed/varianttype", test_boxed_varianttype);
664   g_test_add_func ("/boxed/error", test_boxed_error);
665   g_test_add_func ("/boxed/datetime", test_boxed_datetime);
666   g_test_add_func ("/boxed/matchinfo", test_boxed_matchinfo);
667   g_test_add_func ("/boxed/keyfile", test_boxed_keyfile);
668   g_test_add_func ("/boxed/mainloop", test_boxed_mainloop);
669   g_test_add_func ("/boxed/maincontext", test_boxed_maincontext);
670   g_test_add_func ("/boxed/source", test_boxed_source);
671   g_test_add_func ("/boxed/variantbuilder", test_boxed_variantbuilder);
672   g_test_add_func ("/boxed/timezone", test_boxed_timezone);
673   g_test_add_func ("/boxed/pollfd", test_boxed_pollfd);
674   g_test_add_func ("/boxed/markup", test_boxed_markup);
675   g_test_add_func ("/boxed/thread", test_boxed_thread);
676   g_test_add_func ("/boxed/checksum", test_boxed_checksum);
677   g_test_add_func ("/boxed/tree", test_boxed_tree);
678 
679   return g_test_run ();
680 }
681