Merge remote-tracking branch 'gvdb/master'
[platform/upstream/glib.git] / gobject / tests / boxed.c
1 #define GLIB_DISABLE_DEPRECATION_WARNINGS
2
3 #include <glib-object.h>
4
5 typedef struct _MyBoxed MyBoxed;
6
7 struct _MyBoxed
8 {
9   gint ivalue;
10   gchar *bla;
11 };
12
13 static gpointer
14 my_boxed_copy (gpointer orig)
15 {
16   MyBoxed *a = orig;
17   MyBoxed *b;
18
19   b = g_slice_new (MyBoxed);
20   b->ivalue = a->ivalue;
21   b->bla = g_strdup (a->bla);
22
23   return b;
24 }
25
26 static gint my_boxed_free_count;
27
28 static void
29 my_boxed_free (gpointer orig)
30 {
31   MyBoxed *a = orig;
32
33   g_free (a->bla);
34   g_slice_free (MyBoxed, a);
35
36   my_boxed_free_count++;
37 }
38
39 static GType my_boxed_get_type (void);
40 #define MY_TYPE_BOXED (my_boxed_get_type ())
41
42 G_DEFINE_BOXED_TYPE (MyBoxed, my_boxed, my_boxed_copy, my_boxed_free)
43
44 static void
45 test_define_boxed (void)
46 {
47   MyBoxed a;
48   MyBoxed *b;
49
50   a.ivalue = 20;
51   a.bla = g_strdup ("bla");
52
53   b = g_boxed_copy (MY_TYPE_BOXED, &a);
54
55   g_assert_cmpint (b->ivalue, ==, 20);
56   g_assert_cmpstr (b->bla, ==, "bla");
57
58   g_boxed_free (MY_TYPE_BOXED, b);
59
60   g_free (a.bla);
61 }
62
63 static void
64 test_boxed_ownership (void)
65 {
66   GValue value = G_VALUE_INIT;
67   static MyBoxed boxed = { 10, "bla" };
68
69   g_value_init (&value, MY_TYPE_BOXED);
70
71   my_boxed_free_count = 0;
72
73   g_value_set_static_boxed (&value, &boxed);
74   g_value_reset (&value);
75
76   g_assert_cmpint (my_boxed_free_count, ==, 0);
77
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);
81
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);
85
86   g_value_set_boxed (&value, &boxed);
87   g_value_reset (&value);
88   g_assert_cmpint (my_boxed_free_count, ==, 3);
89 }
90
91 static void
92 my_callback (gpointer user_data)
93 {
94 }
95
96 static gint destroy_count;
97
98 static void
99 my_closure_notify (gpointer user_data, GClosure *closure)
100 {
101   destroy_count++;
102 }
103
104 static void
105 test_boxed_closure (void)
106 {
107   GClosure *closure;
108   GClosure *closure2;
109   GValue value = G_VALUE_INIT;
110
111   g_value_init (&value, G_TYPE_CLOSURE);
112   g_assert (G_VALUE_HOLDS_BOXED (&value));
113
114   closure = g_cclosure_new (G_CALLBACK (my_callback), "bla", my_closure_notify);
115   g_value_take_boxed (&value, closure);
116
117   closure2 = g_value_get_boxed (&value);
118   g_assert (closure2 == closure);
119
120   closure2 = g_value_dup_boxed (&value);
121   g_assert (closure2 == closure); /* closures use ref/unref for copy/free */
122   g_closure_unref (closure2);
123
124   g_value_unset (&value);
125   g_assert_cmpint (destroy_count, ==, 1);
126 }
127
128 static void
129 test_boxed_date (void)
130 {
131   GDate *date;
132   GDate *date2;
133   GValue value = G_VALUE_INIT;
134
135   g_value_init (&value, G_TYPE_DATE);
136   g_assert (G_VALUE_HOLDS_BOXED (&value));
137
138   date = g_date_new_dmy (1, 3, 1970);
139   g_value_take_boxed (&value, date);
140
141   date2 = g_value_get_boxed (&value);
142   g_assert (date2 == date);
143
144   date2 = g_value_dup_boxed (&value);
145   g_assert (date2 != date);
146   g_assert (g_date_compare (date, date2) == 0);
147   g_date_free (date2);
148
149   g_value_unset (&value);
150 }
151
152 static void
153 test_boxed_value (void)
154 {
155   GValue value1 = G_VALUE_INIT;
156   GValue *value2;
157   GValue value = G_VALUE_INIT;
158
159   g_value_init (&value, G_TYPE_VALUE);
160   g_assert (G_VALUE_HOLDS_BOXED (&value));
161
162   g_value_init (&value1, G_TYPE_INT);
163   g_value_set_int (&value1, 26);
164
165   g_value_set_static_boxed (&value, &value1);
166
167   value2 = g_value_get_boxed (&value);
168   g_assert (value2 == &value1);
169
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);
175
176   g_value_unset (&value);
177 }
178
179 static void
180 test_boxed_string (void)
181 {
182   GString *v;
183   GString *v2;
184   GValue value = G_VALUE_INIT;
185
186   g_value_init (&value, G_TYPE_GSTRING);
187   g_assert (G_VALUE_HOLDS_BOXED (&value));
188
189   v = g_string_new ("bla");
190   g_value_take_boxed (&value, v);
191
192   v2 = g_value_get_boxed (&value);
193   g_assert (v2 == v);
194
195   v2 = g_value_dup_boxed (&value);
196   g_assert (v2 != v);
197   g_assert (g_string_equal (v, v2));
198   g_string_free (v2, TRUE);
199
200   g_value_unset (&value);
201 }
202
203 static void
204 test_boxed_hashtable (void)
205 {
206   GHashTable *v;
207   GHashTable *v2;
208   GValue value = G_VALUE_INIT;
209
210   g_value_init (&value, G_TYPE_HASH_TABLE);
211   g_assert (G_VALUE_HOLDS_BOXED (&value));
212
213   v = g_hash_table_new (g_str_hash, g_str_equal);
214   g_value_take_boxed (&value, v);
215
216   v2 = g_value_get_boxed (&value);
217   g_assert (v2 == v);
218
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);
222
223   g_value_unset (&value);
224 }
225
226 static void
227 test_boxed_array (void)
228 {
229   GArray *v;
230   GArray *v2;
231   GValue value = G_VALUE_INIT;
232
233   g_value_init (&value, G_TYPE_ARRAY);
234   g_assert (G_VALUE_HOLDS_BOXED (&value));
235
236   v = g_array_new (TRUE, FALSE, 1);
237   g_value_take_boxed (&value, v);
238
239   v2 = g_value_get_boxed (&value);
240   g_assert (v2 == v);
241
242   v2 = g_value_dup_boxed (&value);
243   g_assert (v2 == v);  /* arrays use ref/unref for copy/free */
244   g_array_unref (v2);
245
246   g_value_unset (&value);
247 }
248
249 static void
250 test_boxed_ptrarray (void)
251 {
252   GPtrArray *v;
253   GPtrArray *v2;
254   GValue value = G_VALUE_INIT;
255
256   g_value_init (&value, G_TYPE_PTR_ARRAY);
257   g_assert (G_VALUE_HOLDS_BOXED (&value));
258
259   v = g_ptr_array_new ();
260   g_value_take_boxed (&value, v);
261
262   v2 = g_value_get_boxed (&value);
263   g_assert (v2 == v);
264
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);
268
269   g_value_unset (&value);
270 }
271
272 static void
273 test_boxed_regex (void)
274 {
275   GRegex *v;
276   GRegex *v2;
277   GValue value = G_VALUE_INIT;
278
279   g_value_init (&value, G_TYPE_REGEX);
280   g_assert (G_VALUE_HOLDS_BOXED (&value));
281
282   v = g_regex_new ("a+b+", 0, 0, NULL);
283   g_value_take_boxed (&value, v);
284
285   v2 = g_value_get_boxed (&value);
286   g_assert (v2 == v);
287
288   v2 = g_value_dup_boxed (&value);
289   g_assert (v2 == v);  /* regexes use ref/unref for copy/free */
290   g_regex_unref (v2);
291
292   g_value_unset (&value);
293 }
294
295 static void
296 test_boxed_varianttype (void)
297 {
298   GVariantType *v;
299   GVariantType *v2;
300   GValue value = G_VALUE_INIT;
301
302   g_value_init (&value, G_TYPE_VARIANT_TYPE);
303   g_assert (G_VALUE_HOLDS_BOXED (&value));
304
305   v = g_variant_type_new ("mas");
306   g_value_take_boxed (&value, v);
307
308   v2 = g_value_get_boxed (&value);
309   g_assert (v2 == v);
310
311   v2 = g_value_dup_boxed (&value);
312   g_assert (v2 != v);
313   g_assert_cmpstr (g_variant_type_peek_string (v), ==, g_variant_type_peek_string (v2));
314   g_variant_type_free (v2);
315
316   g_value_unset (&value);
317 }
318
319 static void
320 test_boxed_datetime (void)
321 {
322   GDateTime *v;
323   GDateTime *v2;
324   GValue value = G_VALUE_INIT;
325
326   g_value_init (&value, G_TYPE_DATE_TIME);
327   g_assert (G_VALUE_HOLDS_BOXED (&value));
328
329   v = g_date_time_new_now_local ();
330   g_value_take_boxed (&value, v);
331
332   v2 = g_value_get_boxed (&value);
333   g_assert (v2 == v);
334
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);
338
339   g_value_unset (&value);
340 }
341
342 static void
343 test_boxed_error (void)
344 {
345   GError *v;
346   GError *v2;
347   GValue value = G_VALUE_INIT;
348
349   g_value_init (&value, G_TYPE_ERROR);
350   g_assert (G_VALUE_HOLDS_BOXED (&value));
351
352   v = g_error_new_literal (G_VARIANT_PARSE_ERROR,
353                            G_VARIANT_PARSE_ERROR_NUMBER_TOO_BIG,
354                            "Too damn big");
355   g_value_take_boxed (&value, v);
356
357   v2 = g_value_get_boxed (&value);
358   g_assert (v2 == v);
359
360   v2 = g_value_dup_boxed (&value);
361   g_assert (v2 != v);
362   g_assert_cmpint (v->domain, ==, v2->domain);
363   g_assert_cmpint (v->code, ==, v2->code);
364   g_assert_cmpstr (v->message, ==, v2->message);
365   g_error_free (v2);
366
367   g_value_unset (&value);
368 }
369
370 int
371 main (int argc, char *argv[])
372 {
373   g_type_init ();
374   g_test_init (&argc, &argv, NULL);
375
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);
389
390   return g_test_run ();
391 }