gobject: Use G_VALUE_INIT
[platform/upstream/glib.git] / gobject / tests / param.c
1 #define GLIB_DISABLE_DEPRECATION_WARNINGS
2 #include <glib-object.h>
3
4 static void
5 test_param_value (void)
6 {
7   GParamSpec *p, *p2;
8   GParamSpec *pp;
9   GValue value = G_VALUE_INIT;
10
11   g_value_init (&value, G_TYPE_PARAM);
12   g_assert (G_VALUE_HOLDS_PARAM (&value));
13
14   p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
15
16   g_value_take_param (&value, p);
17   p2 = g_value_get_param (&value);
18   g_assert (p2 == p);
19
20   pp = g_param_spec_uint ("my-uint", "My UInt", "Blurb", 0, 10, 5, G_PARAM_READWRITE);
21   g_value_set_param (&value, pp);
22
23   p2 = g_value_dup_param (&value);
24   g_assert (p2 == pp); /* param specs use ref/unref for copy/free */
25   g_param_spec_unref (p2);
26
27   g_value_unset (&value);
28 }
29
30 static gint destroy_count;
31
32 static void
33 my_destroy (gpointer data)
34 {
35   destroy_count++;
36 }
37
38 static void
39 test_param_qdata (void)
40 {
41   GParamSpec *p;
42   gchar *bla;
43   GQuark q;
44
45   q = g_quark_from_string ("bla");
46
47   p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
48   g_param_spec_set_qdata (p, q, "bla");
49   bla = g_param_spec_get_qdata (p, q);
50   g_assert_cmpstr (bla, ==, "bla");
51
52   g_assert_cmpint (destroy_count, ==, 0);
53   g_param_spec_set_qdata_full (p, q, "bla", my_destroy);
54   g_param_spec_set_qdata_full (p, q, "blabla", my_destroy);
55   g_assert_cmpint (destroy_count, ==, 1);
56   g_assert_cmpstr (g_param_spec_steal_qdata (p, q), ==, "blabla");
57   g_assert_cmpint (destroy_count, ==, 1);
58   g_assert (g_param_spec_get_qdata (p, q) == NULL);
59
60   g_param_spec_ref_sink (p);
61
62   g_param_spec_unref (p);
63 }
64
65 static void
66 test_param_validate (void)
67 {
68   GParamSpec *p;
69   GValue value = G_VALUE_INIT;
70
71   p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
72
73   g_value_init (&value, G_TYPE_INT);
74   g_value_set_int (&value, 100);
75   g_assert (!g_param_value_defaults (p, &value));
76   g_assert (g_param_value_validate (p, &value));
77   g_assert_cmpint (g_value_get_int (&value), ==, 20);
78
79   g_param_value_set_default (p, &value);
80   g_assert (g_param_value_defaults (p, &value));
81   g_assert_cmpint (g_value_get_int (&value), ==, 10);
82
83   g_param_spec_unref (p);
84 }
85
86 static void
87 test_param_strings (void)
88 {
89   GParamSpec *p;
90
91   /* test canonicalization */
92   p = g_param_spec_int ("my_int:bla", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
93
94   g_assert_cmpstr (g_param_spec_get_name (p), ==, "my-int-bla");
95   g_assert_cmpstr (g_param_spec_get_nick (p), ==, "My Int");
96   g_assert_cmpstr (g_param_spec_get_blurb (p), ==, "Blurb");
97
98   g_param_spec_unref (p);
99
100   /* test nick defaults to name */
101   p = g_param_spec_int ("my-int", NULL, NULL, 0, 20, 10, G_PARAM_READWRITE);
102
103   g_assert_cmpstr (g_param_spec_get_name (p), ==, "my-int");
104   g_assert_cmpstr (g_param_spec_get_nick (p), ==, "my-int");
105   g_assert (g_param_spec_get_blurb (p) == NULL);
106
107   g_param_spec_unref (p);
108 }
109
110 static void
111 test_param_convert (void)
112 {
113   GParamSpec *p;
114   GValue v1 = G_VALUE_INIT;
115   GValue v2 = G_VALUE_INIT;
116
117   p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
118   g_value_init (&v1, G_TYPE_UINT);
119   g_value_set_uint (&v1, 43);
120
121   g_value_init (&v2, G_TYPE_INT);
122   g_value_set_int (&v2, -4);
123
124   g_assert (!g_param_value_convert (p, &v1, &v2, TRUE));
125   g_assert_cmpint (g_value_get_int (&v2), ==, -4);
126
127   g_assert (g_param_value_convert (p, &v1, &v2, FALSE));
128   g_assert_cmpint (g_value_get_int (&v2), ==, 20);
129
130   g_param_spec_unref (p);
131 }
132
133 static void
134 test_value_transform (void)
135 {
136   GValue src = G_VALUE_INIT;
137   GValue dest = G_VALUE_INIT;
138
139 #define CHECK_INT_CONVERSION(type, getter, value)                       \
140   g_assert (g_value_type_transformable (G_TYPE_INT, type));             \
141   g_value_init (&src, G_TYPE_INT);                                      \
142   g_value_init (&dest, type);                                           \
143   g_value_set_int (&src, value);                                        \
144   g_assert (g_value_transform (&src, &dest));                           \
145   g_assert_cmpint (g_value_get_##getter (&dest), ==, value);            \
146   g_value_unset (&src);                                                 \
147   g_value_unset (&dest);
148
149   /* Keep a check for an integer in the range of 0-127 so we're
150    * still testing g_value_get_char().  See
151    * https://bugzilla.gnome.org/show_bug.cgi?id=659870
152    * for why it is broken.
153    */
154   CHECK_INT_CONVERSION(G_TYPE_CHAR, char, 124)
155
156   CHECK_INT_CONVERSION(G_TYPE_CHAR, schar, -124)
157   CHECK_INT_CONVERSION(G_TYPE_CHAR, schar, 124)
158   CHECK_INT_CONVERSION(G_TYPE_UCHAR, uchar, 0)
159   CHECK_INT_CONVERSION(G_TYPE_UCHAR, uchar, 255)
160   CHECK_INT_CONVERSION(G_TYPE_INT, int, -12345)
161   CHECK_INT_CONVERSION(G_TYPE_INT, int, 12345)
162   CHECK_INT_CONVERSION(G_TYPE_UINT, uint, 0)
163   CHECK_INT_CONVERSION(G_TYPE_UINT, uint, 12345)
164   CHECK_INT_CONVERSION(G_TYPE_LONG, long, -12345678)
165   CHECK_INT_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
166   CHECK_INT_CONVERSION(G_TYPE_INT64, int64, -12345678)
167   CHECK_INT_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
168   CHECK_INT_CONVERSION(G_TYPE_FLOAT, float, 12345678)
169   CHECK_INT_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
170
171 #define CHECK_UINT_CONVERSION(type, getter, value)                      \
172   g_assert (g_value_type_transformable (G_TYPE_UINT, type));            \
173   g_value_init (&src, G_TYPE_UINT);                                     \
174   g_value_init (&dest, type);                                           \
175   g_value_set_uint (&src, value);                                       \
176   g_assert (g_value_transform (&src, &dest));                           \
177   g_assert_cmpuint (g_value_get_##getter (&dest), ==, value);           \
178   g_value_unset (&src);                                                 \
179   g_value_unset (&dest);
180
181   CHECK_UINT_CONVERSION(G_TYPE_CHAR, char, 124)
182   CHECK_UINT_CONVERSION(G_TYPE_CHAR, char, 124)
183   CHECK_UINT_CONVERSION(G_TYPE_UCHAR, uchar, 0)
184   CHECK_UINT_CONVERSION(G_TYPE_UCHAR, uchar, 255)
185   CHECK_UINT_CONVERSION(G_TYPE_INT, int, 12345)
186   CHECK_UINT_CONVERSION(G_TYPE_INT, int, 12345)
187   CHECK_UINT_CONVERSION(G_TYPE_UINT, uint, 0)
188   CHECK_UINT_CONVERSION(G_TYPE_UINT, uint, 12345)
189   CHECK_UINT_CONVERSION(G_TYPE_LONG, long, 12345678)
190   CHECK_UINT_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
191   CHECK_UINT_CONVERSION(G_TYPE_INT64, int64, 12345678)
192   CHECK_UINT_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
193   CHECK_UINT_CONVERSION(G_TYPE_FLOAT, float, 12345678)
194   CHECK_UINT_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
195
196 #define CHECK_LONG_CONVERSION(type, getter, value)                      \
197   g_assert (g_value_type_transformable (G_TYPE_LONG, type));            \
198   g_value_init (&src, G_TYPE_LONG);                                     \
199   g_value_init (&dest, type);                                           \
200   g_value_set_long (&src, value);                                       \
201   g_assert (g_value_transform (&src, &dest));                           \
202   g_assert_cmpint (g_value_get_##getter (&dest), ==, value);            \
203   g_value_unset (&src);                                                 \
204   g_value_unset (&dest);
205
206   CHECK_LONG_CONVERSION(G_TYPE_CHAR, char, -124)
207   CHECK_LONG_CONVERSION(G_TYPE_CHAR, char, 124)
208   CHECK_LONG_CONVERSION(G_TYPE_UCHAR, uchar, 0)
209   CHECK_LONG_CONVERSION(G_TYPE_UCHAR, uchar, 255)
210   CHECK_LONG_CONVERSION(G_TYPE_INT, int, -12345)
211   CHECK_LONG_CONVERSION(G_TYPE_INT, int, 12345)
212   CHECK_LONG_CONVERSION(G_TYPE_UINT, uint, 0)
213   CHECK_LONG_CONVERSION(G_TYPE_UINT, uint, 12345)
214   CHECK_LONG_CONVERSION(G_TYPE_LONG, long, -12345678)
215   CHECK_LONG_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
216   CHECK_LONG_CONVERSION(G_TYPE_INT64, int64, -12345678)
217   CHECK_LONG_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
218   CHECK_LONG_CONVERSION(G_TYPE_FLOAT, float, 12345678)
219   CHECK_LONG_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
220
221 #define CHECK_ULONG_CONVERSION(type, getter, value)                     \
222   g_assert (g_value_type_transformable (G_TYPE_ULONG, type));           \
223   g_value_init (&src, G_TYPE_ULONG);                                    \
224   g_value_init (&dest, type);                                           \
225   g_value_set_ulong (&src, value);                                      \
226   g_assert (g_value_transform (&src, &dest));                           \
227   g_assert_cmpuint (g_value_get_##getter (&dest), ==, value);           \
228   g_value_unset (&src);                                                 \
229   g_value_unset (&dest);
230
231   CHECK_ULONG_CONVERSION(G_TYPE_CHAR, char, 124)
232   CHECK_ULONG_CONVERSION(G_TYPE_CHAR, char, 124)
233   CHECK_ULONG_CONVERSION(G_TYPE_UCHAR, uchar, 0)
234   CHECK_ULONG_CONVERSION(G_TYPE_UCHAR, uchar, 255)
235   CHECK_ULONG_CONVERSION(G_TYPE_INT, int, -12345)
236   CHECK_ULONG_CONVERSION(G_TYPE_INT, int, 12345)
237   CHECK_ULONG_CONVERSION(G_TYPE_UINT, uint, 0)
238   CHECK_ULONG_CONVERSION(G_TYPE_UINT, uint, 12345)
239   CHECK_ULONG_CONVERSION(G_TYPE_LONG, long, 12345678)
240   CHECK_ULONG_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
241   CHECK_ULONG_CONVERSION(G_TYPE_INT64, int64, 12345678)
242   CHECK_ULONG_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
243   CHECK_ULONG_CONVERSION(G_TYPE_FLOAT, float, 12345678)
244   CHECK_ULONG_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
245
246 #define CHECK_INT64_CONVERSION(type, getter, value)                     \
247   g_assert (g_value_type_transformable (G_TYPE_INT64, type));           \
248   g_value_init (&src, G_TYPE_INT64);                                    \
249   g_value_init (&dest, type);                                           \
250   g_value_set_int64 (&src, value);                                      \
251   g_assert (g_value_transform (&src, &dest));                           \
252   g_assert_cmpint (g_value_get_##getter (&dest), ==, value);            \
253   g_value_unset (&src);                                                 \
254   g_value_unset (&dest);
255
256   CHECK_INT64_CONVERSION(G_TYPE_CHAR, char, -124)
257   CHECK_INT64_CONVERSION(G_TYPE_CHAR, char, 124)
258   CHECK_INT64_CONVERSION(G_TYPE_UCHAR, uchar, 0)
259   CHECK_INT64_CONVERSION(G_TYPE_UCHAR, uchar, 255)
260   CHECK_INT64_CONVERSION(G_TYPE_INT, int, -12345)
261   CHECK_INT64_CONVERSION(G_TYPE_INT, int, 12345)
262   CHECK_INT64_CONVERSION(G_TYPE_UINT, uint, 0)
263   CHECK_INT64_CONVERSION(G_TYPE_UINT, uint, 12345)
264   CHECK_INT64_CONVERSION(G_TYPE_LONG, long, -12345678)
265   CHECK_INT64_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
266   CHECK_INT64_CONVERSION(G_TYPE_INT64, int64, -12345678)
267   CHECK_INT64_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
268   CHECK_INT64_CONVERSION(G_TYPE_FLOAT, float, 12345678)
269   CHECK_INT64_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
270
271 #define CHECK_UINT64_CONVERSION(type, getter, value)                    \
272   g_assert (g_value_type_transformable (G_TYPE_UINT64, type));          \
273   g_value_init (&src, G_TYPE_UINT64);                                   \
274   g_value_init (&dest, type);                                           \
275   g_value_set_uint64 (&src, value);                                     \
276   g_assert (g_value_transform (&src, &dest));                           \
277   g_assert_cmpuint (g_value_get_##getter (&dest), ==, value);           \
278   g_value_unset (&src);                                                 \
279   g_value_unset (&dest);
280
281   CHECK_UINT64_CONVERSION(G_TYPE_CHAR, char, -124)
282   CHECK_UINT64_CONVERSION(G_TYPE_CHAR, char, 124)
283   CHECK_UINT64_CONVERSION(G_TYPE_UCHAR, uchar, 0)
284   CHECK_UINT64_CONVERSION(G_TYPE_UCHAR, uchar, 255)
285   CHECK_UINT64_CONVERSION(G_TYPE_INT, int, -12345)
286   CHECK_UINT64_CONVERSION(G_TYPE_INT, int, 12345)
287   CHECK_UINT64_CONVERSION(G_TYPE_UINT, uint, 0)
288   CHECK_UINT64_CONVERSION(G_TYPE_UINT, uint, 12345)
289   CHECK_UINT64_CONVERSION(G_TYPE_LONG, long, -12345678)
290   CHECK_UINT64_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
291   CHECK_UINT64_CONVERSION(G_TYPE_INT64, int64, -12345678)
292   CHECK_UINT64_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
293   CHECK_UINT64_CONVERSION(G_TYPE_FLOAT, float, 12345678)
294   CHECK_UINT64_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
295
296 #define CHECK_FLOAT_CONVERSION(type, getter, value)                    \
297   g_assert (g_value_type_transformable (G_TYPE_FLOAT, type));          \
298   g_value_init (&src, G_TYPE_FLOAT);                                   \
299   g_value_init (&dest, type);                                          \
300   g_value_set_float (&src, value);                                     \
301   g_assert (g_value_transform (&src, &dest));                          \
302   g_assert_cmpfloat (g_value_get_##getter (&dest), ==, value);         \
303   g_value_unset (&src);                                                \
304   g_value_unset (&dest);
305
306   CHECK_FLOAT_CONVERSION(G_TYPE_CHAR, char, -124)
307   CHECK_FLOAT_CONVERSION(G_TYPE_CHAR, char, 124)
308   CHECK_FLOAT_CONVERSION(G_TYPE_UCHAR, uchar, 0)
309   CHECK_FLOAT_CONVERSION(G_TYPE_UCHAR, uchar, 255)
310   CHECK_FLOAT_CONVERSION(G_TYPE_INT, int, -12345)
311   CHECK_FLOAT_CONVERSION(G_TYPE_INT, int, 12345)
312   CHECK_FLOAT_CONVERSION(G_TYPE_UINT, uint, 0)
313   CHECK_FLOAT_CONVERSION(G_TYPE_UINT, uint, 12345)
314   CHECK_FLOAT_CONVERSION(G_TYPE_LONG, long, -12345678)
315   CHECK_FLOAT_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
316   CHECK_FLOAT_CONVERSION(G_TYPE_INT64, int64, -12345678)
317   CHECK_FLOAT_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
318   CHECK_FLOAT_CONVERSION(G_TYPE_FLOAT, float, 12345678)
319   CHECK_FLOAT_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
320
321 #define CHECK_DOUBLE_CONVERSION(type, getter, value)                    \
322   g_assert (g_value_type_transformable (G_TYPE_DOUBLE, type));          \
323   g_value_init (&src, G_TYPE_DOUBLE);                                   \
324   g_value_init (&dest, type);                                           \
325   g_value_set_double (&src, value);                                     \
326   g_assert (g_value_transform (&src, &dest));                           \
327   g_assert_cmpfloat (g_value_get_##getter (&dest), ==, value);          \
328   g_value_unset (&src);                                                 \
329   g_value_unset (&dest);
330
331   CHECK_DOUBLE_CONVERSION(G_TYPE_CHAR, char, -124)
332   CHECK_DOUBLE_CONVERSION(G_TYPE_CHAR, char, 124)
333   CHECK_DOUBLE_CONVERSION(G_TYPE_UCHAR, uchar, 0)
334   CHECK_DOUBLE_CONVERSION(G_TYPE_UCHAR, uchar, 255)
335   CHECK_DOUBLE_CONVERSION(G_TYPE_INT, int, -12345)
336   CHECK_DOUBLE_CONVERSION(G_TYPE_INT, int, 12345)
337   CHECK_DOUBLE_CONVERSION(G_TYPE_UINT, uint, 0)
338   CHECK_DOUBLE_CONVERSION(G_TYPE_UINT, uint, 12345)
339   CHECK_DOUBLE_CONVERSION(G_TYPE_LONG, long, -12345678)
340   CHECK_DOUBLE_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
341   CHECK_DOUBLE_CONVERSION(G_TYPE_INT64, int64, -12345678)
342   CHECK_DOUBLE_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
343   CHECK_DOUBLE_CONVERSION(G_TYPE_FLOAT, float, 12345678)
344   CHECK_DOUBLE_CONVERSION(G_TYPE_DOUBLE, double, 12345678)
345
346 #define CHECK_BOOLEAN_CONVERSION(type, setter, value)                   \
347   g_assert (g_value_type_transformable (type, G_TYPE_BOOLEAN));         \
348   g_value_init (&src, type);                                            \
349   g_value_init (&dest, G_TYPE_BOOLEAN);                                 \
350   g_value_set_##setter (&src, value);                                   \
351   g_assert (g_value_transform (&src, &dest));                           \
352   g_assert_cmpint (g_value_get_boolean (&dest), ==, TRUE);              \
353   g_value_set_##setter (&src, 0);                                       \
354   g_assert (g_value_transform (&src, &dest));                           \
355   g_assert_cmpint (g_value_get_boolean (&dest), ==, FALSE);             \
356   g_value_unset (&src);                                                 \
357   g_value_unset (&dest);
358
359   CHECK_BOOLEAN_CONVERSION(G_TYPE_INT, int, -12345)
360   CHECK_BOOLEAN_CONVERSION(G_TYPE_UINT, uint, 12345)
361   CHECK_BOOLEAN_CONVERSION(G_TYPE_LONG, long, -12345678)
362   CHECK_BOOLEAN_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
363   CHECK_BOOLEAN_CONVERSION(G_TYPE_INT64, int64, -12345678)
364   CHECK_BOOLEAN_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
365
366 #define CHECK_STRING_CONVERSION(int_type, setter, int_value)            \
367   g_assert (g_value_type_transformable (int_type, G_TYPE_STRING));      \
368   g_value_init (&src, int_type);                                        \
369   g_value_init (&dest, G_TYPE_STRING);                                  \
370   g_value_set_##setter (&src, int_value);                               \
371   g_assert (g_value_transform (&src, &dest));                           \
372   g_assert_cmpstr (g_value_get_string (&dest), ==, #int_value);         \
373   g_value_unset (&src);                                                 \
374   g_value_unset (&dest);
375
376   CHECK_STRING_CONVERSION(G_TYPE_INT, int, -12345)
377   CHECK_STRING_CONVERSION(G_TYPE_UINT, uint, 12345)
378   CHECK_STRING_CONVERSION(G_TYPE_LONG, long, -12345678)
379   CHECK_STRING_CONVERSION(G_TYPE_ULONG, ulong, 12345678)
380   CHECK_STRING_CONVERSION(G_TYPE_INT64, int64, -12345678)
381   CHECK_STRING_CONVERSION(G_TYPE_UINT64, uint64, 12345678)
382   CHECK_STRING_CONVERSION(G_TYPE_FLOAT, float, 0.500000)
383   CHECK_STRING_CONVERSION(G_TYPE_DOUBLE, double, -1.234567)
384
385   g_assert (!g_value_type_transformable (G_TYPE_STRING, G_TYPE_CHAR));
386   g_value_init (&src, G_TYPE_STRING);
387   g_value_init (&dest, G_TYPE_CHAR);
388   g_value_set_static_string (&src, "bla");
389   g_value_set_schar (&dest, 'c');
390   g_assert (!g_value_transform (&src, &dest));
391   g_assert_cmpint (g_value_get_schar (&dest), ==, 'c');
392   g_value_unset (&src);
393   g_value_unset (&dest);
394 }
395
396 int
397 main (int argc, char *argv[])
398 {
399   g_type_init ();
400   g_test_init (&argc, &argv, NULL);
401
402   g_test_add_func ("/param/value", test_param_value);
403   g_test_add_func ("/param/strings", test_param_strings);
404   g_test_add_func ("/param/qdata", test_param_qdata);
405   g_test_add_func ("/param/validate", test_param_validate);
406   g_test_add_func ("/param/convert", test_param_convert);
407   g_test_add_func ("/value/transform", test_value_transform);
408
409   return g_test_run ();
410 }