1
#include <dbus/dbus-glib.h>
5
* test_g_variant_equivalent:
7
* The function g_variant_equal() cannot be used for dictionaries because it
8
* cares about the ordering of dictionaries, which breaks our tests.
11
test_g_variant_equivalent (GVariant *one,
14
if (!g_variant_type_equal (
15
g_variant_get_type (one),
16
g_variant_get_type (two)))
20
else if (g_variant_is_of_type (one, G_VARIANT_TYPE_DICTIONARY) &&
21
g_variant_is_of_type (two, G_VARIANT_TYPE_DICTIONARY))
26
gboolean equal = TRUE;
28
if (g_variant_n_children (one) != g_variant_n_children (two))
31
/* pack @one into a hash table */
32
hash = g_hash_table_new_full (g_variant_hash, g_variant_equal,
33
(GDestroyNotify) g_variant_unref, (GDestroyNotify) g_variant_unref);
35
g_variant_iter_init (&iter, one);
36
while ((child = g_variant_iter_next_value (&iter)))
38
g_hash_table_insert (hash,
39
g_variant_get_child_value (child, 0),
40
g_variant_get_child_value (child, 1));
41
g_variant_unref (child);
44
/* now iterate @two to check for the keys in @hash */
45
g_variant_iter_init (&iter, two);
46
while (equal && (child = g_variant_iter_next_value (&iter)))
48
GVariant *k, *v1, *v2;
50
k = g_variant_get_child_value (child, 0);
51
v1 = g_variant_get_child_value (child, 1);
53
v2 = g_hash_table_lookup (hash, k);
55
if (v2 == NULL || !test_g_variant_equivalent (v1, v2))
58
g_hash_table_remove (hash, k);
62
g_variant_unref (child);
65
if (g_hash_table_size (hash) > 0)
68
g_hash_table_destroy (hash);
72
else if (g_variant_is_container (one) &&
73
g_variant_is_container (two))
76
gboolean equal = TRUE;
78
if (g_variant_n_children (one) != g_variant_n_children (two))
81
size = g_variant_n_children (one);
82
for (i = 0; equal && i < size; i++)
84
GVariant *child1, *child2;
86
child1 = g_variant_get_child_value (one, i);
87
child2 = g_variant_get_child_value (two, i);
89
equal = test_g_variant_equivalent (child1, child2);
91
g_variant_unref (child1);
92
g_variant_unref (child2);
99
return g_variant_equal (one, two);
103
/* test_g_variant_equivalent tests */
105
test_simple_equiv (void)
109
v1 = g_variant_new_int32 (1984);
110
v2 = g_variant_new_int32 (1984);
112
g_assert (test_g_variant_equivalent (v1, v2));
114
g_variant_unref (v1);
115
g_variant_unref (v2);
119
test_simple_not_equiv (void)
123
v1 = g_variant_new_int32 (1982);
124
v2 = g_variant_new_int32 (1984);
126
g_assert (!test_g_variant_equivalent (v1, v2));
128
g_variant_unref (v1);
129
g_variant_unref (v2);
133
test_array_not_equiv (void)
138
g_variant_builder_init (&b, G_VARIANT_TYPE ("av"));
139
g_variant_builder_add (&b, "v", g_variant_new_int32 (1984));
140
g_variant_builder_add (&b, "v", g_variant_new_string ("Orwell"));
141
g_variant_builder_add (&b, "v", g_variant_new_object_path ("/cats/escher"));
142
v1 = g_variant_builder_end (&b);
144
g_variant_builder_init (&b, G_VARIANT_TYPE ("av"));
145
/* note the order has changed */
146
g_variant_builder_add (&b, "v", g_variant_new_string ("Orwell"));
147
g_variant_builder_add (&b, "v", g_variant_new_int32 (1984));
148
g_variant_builder_add (&b, "v", g_variant_new_object_path ("/cats/escher"));
149
v2 = g_variant_builder_end (&b);
151
g_assert (!test_g_variant_equivalent (v1, v2));
153
g_variant_unref (v1);
154
g_variant_unref (v2);
158
test_map_equiv (void)
163
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
164
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
165
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
166
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
167
v1 = g_variant_builder_end (&b);
169
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
170
/* note the order has changed */
171
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
172
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
173
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
174
v2 = g_variant_builder_end (&b);
176
g_assert (test_g_variant_equivalent (v1, v2));
178
g_variant_unref (v1);
179
g_variant_unref (v2);
183
test_map_not_equiv1 (void)
188
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
189
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
190
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
191
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
192
v1 = g_variant_builder_end (&b);
194
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
195
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
196
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
197
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
198
g_variant_builder_add (&b, "{os}", "/cats/rory", "Rory Cat");
199
v2 = g_variant_builder_end (&b);
201
g_assert (!test_g_variant_equivalent (v1, v2));
203
g_variant_unref (v1);
204
g_variant_unref (v2);
208
test_map_not_equiv2 (void)
213
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
214
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
215
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
216
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
217
v1 = g_variant_builder_end (&b);
219
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
220
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
221
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
222
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Cat");
223
v2 = g_variant_builder_end (&b);
225
g_assert (!test_g_variant_equivalent (v1, v2));
227
g_variant_unref (v1);
228
g_variant_unref (v2);
231
/* dbus_g_value_build_g_variant tests */
236
GVariant *var, *varc;
238
g_value_init (&v, G_TYPE_INT);
239
g_value_set_int (&v, 1984);
241
var = dbus_g_value_build_g_variant (&v);
244
varc = g_variant_new_int32 (1984);
246
g_assert (test_g_variant_equivalent (var, varc));
248
g_variant_unref (var);
249
g_variant_unref (varc);
256
GVariant *var, *varc;
258
g_value_init (&v, G_TYPE_STRING);
259
g_value_set_static_string (&v, "Orwell");
261
var = dbus_g_value_build_g_variant (&v);
264
varc = g_variant_new_string ("Orwell");
266
g_assert (test_g_variant_equivalent (var, varc));
268
g_variant_unref (var);
269
g_variant_unref (varc);
276
GVariant *var, *varc;
278
g_value_init (&v, DBUS_TYPE_G_OBJECT_PATH);
279
g_value_set_boxed (&v, "/cats/escher");
281
var = dbus_g_value_build_g_variant (&v);
284
varc = g_variant_new_object_path ("/cats/escher");
286
g_assert (test_g_variant_equivalent (var, varc));
288
g_variant_unref (var);
289
g_variant_unref (varc);
296
GVariant *var, *varc;
297
GType us = dbus_g_type_get_struct ("GValueArray",
302
g_value_init (&v, us);
303
g_value_take_boxed (&v, dbus_g_type_specialized_construct (us));
304
dbus_g_type_struct_set (&v,
309
var = dbus_g_value_build_g_variant (&v);
312
varc = g_variant_new ("(us)", 1984, "Orwell");
314
g_assert (test_g_variant_equivalent (var, varc));
316
g_variant_unref (var);
317
g_variant_unref (varc);
326
GVariant *var, *varc;
327
GType a_os = dbus_g_type_get_map ("GHashTable",
328
DBUS_TYPE_G_OBJECT_PATH,
331
g_value_init (&v, a_os);
332
map = dbus_g_type_specialized_construct (a_os);
334
g_hash_table_insert (map,
335
g_strdup ("/cats/escher"), g_strdup ("Escher Moonbeam"));
336
g_hash_table_insert (map,
337
g_strdup ("/cats/harvey"), g_strdup ("Harvey Nomcat"));
338
g_hash_table_insert (map,
339
g_strdup ("/cats/josh"), g_strdup ("Josh Smith"));
340
g_value_take_boxed (&v, map);
342
var = dbus_g_value_build_g_variant (&v);
345
g_variant_builder_init (&b, G_VARIANT_TYPE ("a{os}"));
346
g_variant_builder_add (&b, "{os}", "/cats/escher", "Escher Moonbeam");
347
g_variant_builder_add (&b, "{os}", "/cats/harvey", "Harvey Nomcat");
348
g_variant_builder_add (&b, "{os}", "/cats/josh", "Josh Smith");
349
varc = g_variant_builder_end (&b);
351
g_assert (test_g_variant_equivalent (var, varc));
353
g_variant_unref (var);
354
g_variant_unref (varc);
360
GValue v = { 0, }, *v2;
362
GVariant *var, *varc;
363
GType av = dbus_g_type_get_collection ("GPtrArray", G_TYPE_VALUE);
366
g_value_init (&v, av);
367
array = dbus_g_type_specialized_construct (av);
369
v2 = g_new0 (GValue, 1);
370
g_value_init (v2, G_TYPE_INT);
371
g_value_set_int (v2, 1984);
372
g_ptr_array_add (array, v2);
374
v2 = g_new0 (GValue, 1);
375
g_value_init (v2, G_TYPE_STRING);
376
g_value_set_static_string (v2, "Orwell");
377
g_ptr_array_add (array, v2);
379
v2 = g_new0 (GValue, 1);
380
g_value_init (v2, DBUS_TYPE_G_OBJECT_PATH);
381
g_value_set_boxed (v2, "/cats/escher");
382
g_ptr_array_add (array, v2);
384
g_value_take_boxed (&v, array);
386
var = dbus_g_value_build_g_variant (&v);
389
g_variant_builder_init (&b, G_VARIANT_TYPE ("av"));
390
g_variant_builder_add (&b, "v", g_variant_new_int32 (1984));
391
g_variant_builder_add (&b, "v", g_variant_new_string ("Orwell"));
392
g_variant_builder_add (&b, "v", g_variant_new_object_path ("/cats/escher"));
393
varc = g_variant_builder_end (&b);
395
g_assert (test_g_variant_equivalent (var, varc));
397
g_variant_unref (var);
398
g_variant_unref (varc);
405
GVariant *var, *varc;
407
g_value_init (&v, DBUS_TYPE_G_SIGNATURE);
408
g_value_set_boxed (&v, "a{u(ua{sa{sv}})}");
410
var = dbus_g_value_build_g_variant (&v);
413
varc = g_variant_new_signature ("a{u(ua{sa{sv}})}");
415
g_assert (test_g_variant_equivalent (var, varc));
417
g_variant_unref (var);
418
g_variant_unref (varc);
426
dbus_g_type_specialized_init ();
428
g_test_init (&argc, &argv, NULL);
430
/* test_g_variant_equivalent tests */
431
g_test_add_func ("/test_g_variant_equivalent/test_simple_equiv",
433
g_test_add_func ("/test_g_variant_equivalent/test_simple_not_equiv",
434
test_simple_not_equiv);
435
g_test_add_func ("/test_g_variant_equivalent/test_array_not_equiv",
436
test_array_not_equiv);
437
g_test_add_func ("/test_g_variant_equivalent/test_map_equiv",
439
g_test_add_func ("/test_g_variant_equivalent/test_map_not_equiv1",
440
test_map_not_equiv1);
441
g_test_add_func ("/test_g_variant_equivalent/test_map_not_equiv2",
442
test_map_not_equiv2);
444
/* dbus_g_value_build_g_variant tests */
445
g_test_add_func ("/gvalue-to-gvariant/i", test_i);
446
g_test_add_func ("/gvalue-to-gvariant/s", test_s);
447
g_test_add_func ("/gvalue-to-gvariant/o", test_o);
448
g_test_add_func ("/gvalue-to-gvariant/us", test_us);
449
g_test_add_func ("/gvalue-to-gvariant/a{os}", test_a_os);
450
g_test_add_func ("/gvalue-to-gvariant/av", test_av);
451
g_test_add_func ("/gvalue-to-gvariant/g", test_g);
453
return g_test_run ();