1 #define GLIB_DISABLE_DEPRECATION_WARNINGS
2 #include <glib-object.h>
5 test_param_value (void)
9 GValue value = G_VALUE_INIT;
11 g_value_init (&value, G_TYPE_PARAM);
12 g_assert (G_VALUE_HOLDS_PARAM (&value));
14 p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
16 g_value_take_param (&value, p);
17 p2 = g_value_get_param (&value);
20 pp = g_param_spec_uint ("my-uint", "My UInt", "Blurb", 0, 10, 5, G_PARAM_READWRITE);
21 g_value_set_param (&value, pp);
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);
27 g_value_unset (&value);
30 static gint destroy_count;
33 my_destroy (gpointer data)
39 test_param_qdata (void)
45 q = g_quark_from_string ("bla");
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");
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);
60 g_param_spec_ref_sink (p);
62 g_param_spec_unref (p);
66 test_param_validate (void)
69 GValue value = G_VALUE_INIT;
71 p = g_param_spec_int ("my-int", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
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);
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);
83 g_param_spec_unref (p);
87 test_param_strings (void)
91 /* test canonicalization */
92 p = g_param_spec_int ("my_int:bla", "My Int", "Blurb", 0, 20, 10, G_PARAM_READWRITE);
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");
98 g_param_spec_unref (p);
100 /* test nick defaults to name */
101 p = g_param_spec_int ("my-int", NULL, NULL, 0, 20, 10, G_PARAM_READWRITE);
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);
107 g_param_spec_unref (p);
111 test_param_convert (void)
114 GValue v1 = G_VALUE_INIT;
115 GValue v2 = G_VALUE_INIT;
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);
121 g_value_init (&v2, G_TYPE_INT);
122 g_value_set_int (&v2, -4);
124 g_assert (!g_param_value_convert (p, &v1, &v2, TRUE));
125 g_assert_cmpint (g_value_get_int (&v2), ==, -4);
127 g_assert (g_param_value_convert (p, &v1, &v2, FALSE));
128 g_assert_cmpint (g_value_get_int (&v2), ==, 20);
130 g_param_spec_unref (p);
134 test_value_transform (void)
136 GValue src = G_VALUE_INIT;
137 GValue dest = G_VALUE_INIT;
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);
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.
154 CHECK_INT_CONVERSION(G_TYPE_CHAR, char, 124)
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
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)
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);
397 main (int argc, char *argv[])
400 g_test_init (&argc, &argv, NULL);
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);
409 return g_test_run ();