1 # -*- Mode: Python; py-indent-offset: 4 -*-
2 # vim: tabstop=4 shiftwidth=4 expandtab
7 from gi.repository import GLib
8 from compathelper import _long
11 class TestGVariant(unittest.TestCase):
12 def test_create(self):
15 variant = GLib.Variant('i', 42)
16 self.assertTrue(isinstance(variant, GLib.Variant))
17 self.assertEqual(variant.get_int32(), 42)
19 variant = GLib.Variant('s', '')
20 self.assertTrue(isinstance(variant, GLib.Variant))
21 self.assertEqual(variant.get_string(), '')
23 variant = GLib.Variant('s', 'hello')
24 self.assertTrue(isinstance(variant, GLib.Variant))
25 self.assertEqual(variant.get_string(), 'hello')
28 variant = GLib.Variant('v', GLib.Variant('i', 42))
29 self.assertTrue(isinstance(variant, GLib.Variant))
30 self.assertTrue(isinstance(variant.get_variant(), GLib.Variant))
31 self.assertEqual(variant.get_type_string(), 'v')
32 self.assertEqual(variant.get_variant().get_type_string(), 'i')
33 self.assertEqual(variant.get_variant().get_int32(), 42)
35 variant = GLib.Variant('v', GLib.Variant('v', GLib.Variant('i', 42)))
36 self.assertEqual(variant.get_type_string(), 'v')
37 self.assertEqual(variant.get_variant().get_type_string(), 'v')
38 self.assertEqual(variant.get_variant().get_variant().get_type_string(), 'i')
39 self.assertEqual(variant.get_variant().get_variant().get_int32(), 42)
43 variant = GLib.Variant('()', ())
44 self.assertEqual(variant.get_type_string(), '()')
45 self.assertEqual(variant.n_children(), 0)
47 variant = GLib.Variant('(i)', (3,))
48 self.assertEqual(variant.get_type_string(), '(i)')
49 self.assertTrue(isinstance(variant, GLib.Variant))
50 self.assertEqual(variant.n_children(), 1)
51 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
52 self.assertEqual(variant.get_child_value(0).get_int32(), 3)
54 variant = GLib.Variant('(ss)', ('mec', 'mac'))
55 self.assertEqual(variant.get_type_string(), '(ss)')
56 self.assertTrue(isinstance(variant, GLib.Variant))
57 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
58 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
59 self.assertEqual(variant.get_child_value(0).get_string(), 'mec')
60 self.assertEqual(variant.get_child_value(1).get_string(), 'mac')
63 variant = GLib.Variant('((si)(ub))', (('hello', -1), (42, True)))
64 self.assertEqual(variant.get_type_string(), '((si)(ub))')
65 self.assertEqual(variant.unpack(), (('hello', -1), (_long(42), True)))
69 variant = GLib.Variant('a{si}', {})
70 self.assertTrue(isinstance(variant, GLib.Variant))
71 self.assertEqual(variant.get_type_string(), 'a{si}')
72 self.assertEqual(variant.n_children(), 0)
74 variant = GLib.Variant('a{si}', {'': 1, 'key1': 2, 'key2': 3})
75 self.assertEqual(variant.get_type_string(), 'a{si}')
76 self.assertTrue(isinstance(variant, GLib.Variant))
77 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
78 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
79 self.assertTrue(isinstance(variant.get_child_value(2), GLib.Variant))
80 self.assertEqual(variant.unpack(), {'': 1, 'key1': 2, 'key2': 3})
83 variant = GLib.Variant('a{sa{si}}', {})
84 self.assertTrue(isinstance(variant, GLib.Variant))
85 self.assertEqual(variant.get_type_string(), 'a{sa{si}}')
86 self.assertEqual(variant.n_children(), 0)
88 d = {'': {'': 1, 'keyn1': 2},
89 'key1': {'key11': 11, 'key12': 12}}
90 variant = GLib.Variant('a{sa{si}}', d)
91 self.assertEqual(variant.get_type_string(), 'a{sa{si}}')
92 self.assertTrue(isinstance(variant, GLib.Variant))
93 self.assertEqual(variant.unpack(), d)
97 variant = GLib.Variant('ai', [])
98 self.assertEqual(variant.get_type_string(), 'ai')
99 self.assertEqual(variant.n_children(), 0)
101 variant = GLib.Variant('ai', [1, 2])
102 self.assertEqual(variant.get_type_string(), 'ai')
103 self.assertTrue(isinstance(variant, GLib.Variant))
104 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
105 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
106 self.assertEqual(variant.get_child_value(0).get_int32(), 1)
107 self.assertEqual(variant.get_child_value(1).get_int32(), 2)
109 variant = GLib.Variant('as', [])
110 self.assertEqual(variant.get_type_string(), 'as')
111 self.assertEqual(variant.n_children(), 0)
113 variant = GLib.Variant('as', [''])
114 self.assertEqual(variant.get_type_string(), 'as')
115 self.assertTrue(isinstance(variant, GLib.Variant))
116 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
117 self.assertEqual(variant.get_child_value(0).get_string(), '')
119 variant = GLib.Variant('as', ['hello', 'world'])
120 self.assertEqual(variant.get_type_string(), 'as')
121 self.assertTrue(isinstance(variant, GLib.Variant))
122 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
123 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
124 self.assertEqual(variant.get_child_value(0).get_string(), 'hello')
125 self.assertEqual(variant.get_child_value(1).get_string(), 'world')
128 variant = GLib.Variant('aai', [])
129 self.assertEqual(variant.get_type_string(), 'aai')
130 self.assertEqual(variant.n_children(), 0)
132 variant = GLib.Variant('aai', [[]])
133 self.assertEqual(variant.get_type_string(), 'aai')
134 self.assertEqual(variant.n_children(), 1)
135 self.assertEqual(variant.get_child_value(0).n_children(), 0)
137 variant = GLib.Variant('aai', [[1, 2], [3, 4, 5]])
138 self.assertEqual(variant.get_type_string(), 'aai')
139 self.assertEqual(variant.unpack(), [[1, 2], [3, 4, 5]])
145 variant = GLib.Variant('(as)', ([],))
146 self.assertEqual(variant.get_type_string(), '(as)')
147 self.assertEqual(variant.n_children(), 1)
148 self.assertEqual(variant.get_child_value(0).n_children(), 0)
150 variant = GLib.Variant('(as)', ([''],))
151 self.assertEqual(variant.get_type_string(), '(as)')
152 self.assertEqual(variant.n_children(), 1)
153 self.assertEqual(variant.get_child_value(0).n_children(), 1)
154 self.assertEqual(variant.get_child_value(0).get_child_value(0).get_string(), '')
156 variant = GLib.Variant('(as)', (['hello'],))
157 self.assertEqual(variant.get_type_string(), '(as)')
158 self.assertEqual(variant.n_children(), 1)
159 self.assertEqual(variant.get_child_value(0).n_children(), 1)
160 self.assertEqual(variant.get_child_value(0).get_child_value(0).get_string(), 'hello')
162 obj = {'a1': (1, True), 'a2': (2, False)}
163 variant = GLib.Variant('a{s(ib)}', obj)
164 self.assertEqual(variant.get_type_string(), 'a{s(ib)}')
165 self.assertEqual(variant.unpack(), obj)
167 obj = {'a1': (1, GLib.Variant('b', True)), 'a2': (2, GLib.Variant('y', 255))}
168 variant = GLib.Variant('a{s(iv)}', obj)
169 self.assertEqual(variant.get_type_string(), 'a{s(iv)}')
170 self.assertEqual(variant.unpack(), {'a1': (1, True), 'a2': (2, 255)})
172 obj = (1, {'a': {'a1': True, 'a2': False},
177 variant = GLib.Variant('(ia{sa{sb}}s)', obj)
178 self.assertEqual(variant.get_type_string(), '(ia{sa{sb}}s)')
179 self.assertEqual(variant.unpack(), obj)
181 obj = {"frequency": GLib.Variant('t', 738000000),
182 "hierarchy": GLib.Variant('i', 0),
183 "bandwidth": GLib.Variant('x', 8),
184 "code-rate-hp": GLib.Variant('d', 2.0 / 3.0),
185 "constellation": GLib.Variant('s', "QAM16"),
186 "guard-interval": GLib.Variant('u', 4)}
187 variant = GLib.Variant('a{sv}', obj)
188 self.assertEqual(variant.get_type_string(), 'a{sv}')
189 self.assertEqual(variant.unpack(),
190 {"frequency": 738000000,
193 "code-rate-hp": 2.0 / 3.0,
194 "constellation": "QAM16",
198 def test_create_errors(self):
200 self.assertRaises(TypeError, GLib.Variant, 'i', 42, 3)
201 self.assertRaises(TypeError, GLib.Variant, '(i)', (42, 3))
203 # not enough arguments
204 self.assertRaises(TypeError, GLib.Variant, '(ii)', (42,))
207 self.assertRaises(TypeError, GLib.Variant, 'i', 'hello')
208 self.assertRaises(TypeError, GLib.Variant, 's', 42)
209 self.assertRaises(TypeError, GLib.Variant, '(ss)', 'mec', 'mac')
210 self.assertRaises(TypeError, GLib.Variant, '(s)', 'hello')
212 # unimplemented data type
213 self.assertRaises(NotImplementedError, GLib.Variant, 'Q', 1)
215 def test_unpack(self):
217 res = GLib.Variant.new_int32(-42).unpack()
218 self.assertEqual(res, -42)
220 res = GLib.Variant.new_uint64(34359738368).unpack()
221 self.assertEqual(res, 34359738368)
223 res = GLib.Variant.new_boolean(True).unpack()
224 self.assertEqual(res, True)
226 res = GLib.Variant.new_object_path('/foo/Bar').unpack()
227 self.assertEqual(res, '/foo/Bar')
230 res = GLib.Variant('v', GLib.Variant.new_int32(-42)).unpack()
231 self.assertEqual(res, -42)
233 GLib.Variant('v', GLib.Variant('v', GLib.Variant('i', 42)))
234 self.assertEqual(res, -42)
237 res = GLib.Variant.new_tuple(GLib.Variant.new_int32(-1),
238 GLib.Variant.new_string('hello')).unpack()
239 self.assertEqual(res, (-1, 'hello'))
242 vb = GLib.VariantBuilder.new(gi._gi.variant_type_from_string('ai'))
243 vb.add_value(GLib.Variant.new_int32(-1))
244 vb.add_value(GLib.Variant.new_int32(3))
245 res = vb.end().unpack()
246 self.assertEqual(res, [-1, 3])
249 res = GLib.Variant('a{si}', {'key1': 1, 'key2': 2}).unpack()
250 self.assertEqual(res, {'key1': 1, 'key2': 2})
252 def test_iteration(self):
254 vb = GLib.VariantBuilder.new(gi._gi.variant_type_from_string('ai'))
255 vb.add_value(GLib.Variant.new_int32(-1))
256 vb.add_value(GLib.Variant.new_int32(3))
259 self.assertEqual(len(v), 2)
260 self.assertEqual(v[0], -1)
261 self.assertEqual(v[1], 3)
262 self.assertEqual(v[-1], 3)
263 self.assertEqual(v[-2], -1)
264 self.assertRaises(IndexError, v.__getitem__, 2)
265 self.assertRaises(IndexError, v.__getitem__, -3)
266 self.assertRaises(ValueError, v.__getitem__, 'a')
269 self.assertEqual([x for x in v], [-1, 3])
270 self.assertEqual(list(v), [-1, 3])
273 v = GLib.Variant.new_tuple(GLib.Variant.new_int32(-1),
274 GLib.Variant.new_string('hello'))
275 self.assertEqual(len(v), 2)
276 self.assertEqual(v[0], -1)
277 self.assertEqual(v[1], 'hello')
278 self.assertEqual(v[-1], 'hello')
279 self.assertEqual(v[-2], -1)
280 self.assertRaises(IndexError, v.__getitem__, 2)
281 self.assertRaises(IndexError, v.__getitem__, -3)
282 self.assertRaises(ValueError, v.__getitem__, 'a')
285 self.assertEqual([x for x in v], [-1, 'hello'])
286 self.assertEqual(tuple(v), (-1, 'hello'))
288 # dictionary index access
289 vsi = GLib.Variant('a{si}', {'key1': 1, 'key2': 2})
290 vis = GLib.Variant('a{is}', {1: 'val1', 5: 'val2'})
292 self.assertEqual(len(vsi), 2)
293 self.assertEqual(vsi['key1'], 1)
294 self.assertEqual(vsi['key2'], 2)
295 self.assertRaises(KeyError, vsi.__getitem__, 'unknown')
297 self.assertEqual(len(vis), 2)
298 self.assertEqual(vis[1], 'val1')
299 self.assertEqual(vis[5], 'val2')
300 self.assertRaises(KeyError, vsi.__getitem__, 3)
302 # dictionary iteration
303 self.assertEqual(set(vsi.keys()), set(['key1', 'key2']))
304 self.assertEqual(set(vis.keys()), set([1, 5]))
306 # string index access
307 v = GLib.Variant('s', 'hello')
308 self.assertEqual(len(v), 5)
309 self.assertEqual(v[0], 'h')
310 self.assertEqual(v[4], 'o')
311 self.assertEqual(v[-1], 'o')
312 self.assertEqual(v[-5], 'h')
313 self.assertRaises(IndexError, v.__getitem__, 5)
314 self.assertRaises(IndexError, v.__getitem__, -6)
317 self.assertEqual([x for x in v], ['h', 'e', 'l', 'l', 'o'])
319 def test_split_signature(self):
320 self.assertEqual(GLib.Variant.split_signature('()'), [])
322 self.assertEqual(GLib.Variant.split_signature('s'), ['s'])
324 self.assertEqual(GLib.Variant.split_signature('as'), ['as'])
326 self.assertEqual(GLib.Variant.split_signature('(s)'), ['s'])
328 self.assertEqual(GLib.Variant.split_signature('(iso)'), ['i', 's', 'o'])
330 self.assertEqual(GLib.Variant.split_signature('(s(ss)i(ii))'),
331 ['s', '(ss)', 'i', '(ii)'])
333 self.assertEqual(GLib.Variant.split_signature('(as)'), ['as'])
335 self.assertEqual(GLib.Variant.split_signature('(s(ss)iaiaasa(ii))'),
336 ['s', '(ss)', 'i', 'ai', 'aas', 'a(ii)'])
338 self.assertEqual(GLib.Variant.split_signature('(a{iv}(ii)((ss)a{s(ss)}))'),
339 ['a{iv}', '(ii)', '((ss)a{s(ss)})'])
342 v1 = GLib.Variant('s', 'somestring')
343 v2 = GLib.Variant('s', 'somestring')
344 v3 = GLib.Variant('s', 'somestring2')
346 self.assertTrue(v2 in set([v1, v3]))
347 self.assertTrue(v2 in frozenset([v1, v3]))
348 self.assertTrue(v2 in {v1: '1', v3: '2'})
350 def test_compare(self):
351 # Check if identical GVariant are equal
353 def assert_equal(vtype, value):
354 self.assertEqual(GLib.Variant(vtype, value), GLib.Variant(vtype, value))
356 def assert_not_equal(vtype1, value1, vtype2, value2):
357 self.assertNotEqual(GLib.Variant(vtype1, value1), GLib.Variant(vtype2, value2))
359 numbers = ['y', 'n', 'q', 'i', 'u', 'x', 't', 'h', 'd']
361 assert_equal(num, 42)
362 assert_not_equal(num, 42, num, 41)
363 assert_not_equal(num, 42, 's', '42')
365 assert_equal('s', 'something')
366 assert_not_equal('s', 'something', 's', 'somethingelse')
367 assert_not_equal('s', 'something', 'i', 1234)
369 assert_equal('g', 'dustybinqhogx')
370 assert_not_equal('g', 'dustybinqhogx', 'g', 'dustybin')
371 assert_not_equal('g', 'dustybinqhogx', 'i', 1234)
373 assert_equal('o', '/dev/null')
374 assert_not_equal('o', '/dev/null', 'o', '/dev/zero')
375 assert_not_equal('o', '/dev/null', 'i', 1234)
377 assert_equal('(s)', ('strtuple',))
378 assert_not_equal('(s)', ('strtuple',), '(s)', ('strtuple2',))
380 assert_equal('a{si}', {'str': 42})
381 assert_not_equal('a{si}', {'str': 42}, 'a{si}', {'str': 43})
383 assert_equal('v', GLib.Variant('i', 42))
384 assert_not_equal('v', GLib.Variant('i', 42), 'v', GLib.Variant('i', 43))
387 # Check if the GVariant bool matches the unpacked Pythonic bool
389 def assert_equals_bool(vtype, value):
390 self.assertEqual(bool(GLib.Variant(vtype, value)), bool(value))
393 assert_equals_bool('b', True)
394 assert_equals_bool('b', False)
396 numbers = ['y', 'n', 'q', 'i', 'u', 'x', 't', 'h', 'd']
397 for number in numbers:
398 assert_equals_bool(number, 0)
399 assert_equals_bool(number, 1)
401 assert_equals_bool('s', '')
402 assert_equals_bool('g', '')
403 assert_equals_bool('s', 'something')
404 assert_equals_bool('o', '/dev/null')
405 assert_equals_bool('g', 'dustybinqhogx')
408 assert_equals_bool('ab', [True])
409 assert_equals_bool('ab', [False])
410 for number in numbers:
411 assert_equals_bool('a' + number, [])
412 assert_equals_bool('a' + number, [0])
413 assert_equals_bool('as', [])
414 assert_equals_bool('as', [''])
415 assert_equals_bool('ao', [])
416 assert_equals_bool('ao', ['/'])
417 assert_equals_bool('ag', [])
418 assert_equals_bool('ag', [''])
419 assert_equals_bool('aai', [[]])
422 assert_equals_bool('()', ())
423 for number in numbers:
424 assert_equals_bool('(' + number + ')', (0,))
425 assert_equals_bool('(s)', ('',))
426 assert_equals_bool('(o)', ('/',))
427 assert_equals_bool('(g)', ('',))
428 assert_equals_bool('(())', ((),))
431 assert_equals_bool('a{si}', {})
432 assert_equals_bool('a{si}', {'': 0})
434 # complex types, always True
435 assert_equals_bool('(as)', ([],))
436 assert_equals_bool('a{s(i)}', {'': (0,)})
438 # variant types, recursive unpacking
439 assert_equals_bool('v', GLib.Variant('i', 0))
440 assert_equals_bool('v', GLib.Variant('i', 1))
443 v = GLib.Variant('(is)', (1, 'somestring'))
444 self.assertEqual(str(v), "(1, 'somestring')")
445 self.assertEqual(repr(v), "GLib.Variant('(is)', (1, 'somestring'))")