1 # -*- Mode: Python; py-indent-offset: 4 -*-
3 # vim: tabstop=4 shiftwidth=4 expandtab
8 sys.path.insert(0, "../")
9 from sys import getrefcount
14 from gi.repository import GObject
15 from gi.repository import GLib
16 from gi.repository import Gio
17 from gi.repository import Regress as Everything
19 if sys.version_info < (3, 0):
20 UNICHAR = "\xe2\x99\xa5"
21 PY2_UNICODE_UNICHAR = unicode(UNICHAR, 'UTF-8')
26 class TestEverything(unittest.TestCase):
28 def test_cairo_context(self):
29 context = Everything.test_cairo_context_full_return()
30 self.assertTrue(isinstance(context, cairo.Context))
32 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
33 context = cairo.Context(surface)
34 Everything.test_cairo_context_none_in(context)
36 def test_cairo_surface(self):
37 surface = Everything.test_cairo_surface_none_return()
38 self.assertTrue(isinstance(surface, cairo.ImageSurface))
39 self.assertTrue(isinstance(surface, cairo.Surface))
40 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
41 self.assertEqual(surface.get_width(), 10)
42 self.assertEqual(surface.get_height(), 10)
44 surface = Everything.test_cairo_surface_full_return()
45 self.assertTrue(isinstance(surface, cairo.ImageSurface))
46 self.assertTrue(isinstance(surface, cairo.Surface))
47 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
48 self.assertEqual(surface.get_width(), 10)
49 self.assertEqual(surface.get_height(), 10)
51 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
52 Everything.test_cairo_surface_none_in(surface)
54 surface = Everything.test_cairo_surface_full_out()
55 self.assertTrue(isinstance(surface, cairo.ImageSurface))
56 self.assertTrue(isinstance(surface, cairo.Surface))
57 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
58 self.assertEqual(surface.get_width(), 10)
59 self.assertEqual(surface.get_height(), 10)
61 def test_unichar(self):
62 self.assertEqual("c", Everything.test_unichar("c"))
64 if sys.version_info < (3, 0):
65 self.assertEqual(UNICHAR, Everything.test_unichar(PY2_UNICODE_UNICHAR))
66 self.assertEqual(UNICHAR, Everything.test_unichar(UNICHAR))
67 self.assertRaises(TypeError, Everything.test_unichar, "")
68 self.assertRaises(TypeError, Everything.test_unichar, "morethanonechar")
70 def test_floating(self):
71 e = Everything.TestFloating()
72 self.assertEqual(e.__grefcount__, 1)
74 e = GObject.new(Everything.TestFloating)
75 self.assertEqual(e.__grefcount__, 1)
77 e = Everything.TestFloating.new()
78 self.assertEqual(e.__grefcount__, 1)
80 def test_caller_allocates(self):
81 struct_a = Everything.TestStructA()
82 struct_a.some_int = 10
83 struct_a.some_int8 = 21
84 struct_a.some_double = 3.14
85 struct_a.some_enum = Everything.TestEnum.VALUE3
87 struct_a_clone = struct_a.clone()
88 self.assertTrue(struct_a != struct_a_clone)
89 self.assertEqual(struct_a.some_int, struct_a_clone.some_int)
90 self.assertEqual(struct_a.some_int8, struct_a_clone.some_int8)
91 self.assertEqual(struct_a.some_double, struct_a_clone.some_double)
92 self.assertEqual(struct_a.some_enum, struct_a_clone.some_enum)
94 struct_b = Everything.TestStructB()
95 struct_b.some_int8 = 8
96 struct_b.nested_a.some_int = 20
97 struct_b.nested_a.some_int8 = 12
98 struct_b.nested_a.some_double = 333.3333
99 struct_b.nested_a.some_enum = Everything.TestEnum.VALUE2
101 struct_b_clone = struct_b.clone()
102 self.assertTrue(struct_b != struct_b_clone)
103 self.assertEqual(struct_b.some_int8, struct_b_clone.some_int8)
104 self.assertEqual(struct_b.nested_a.some_int, struct_b_clone.nested_a.some_int)
105 self.assertEqual(struct_b.nested_a.some_int8, struct_b_clone.nested_a.some_int8)
106 self.assertEqual(struct_b.nested_a.some_double, struct_b_clone.nested_a.some_double)
107 self.assertEqual(struct_b.nested_a.some_enum, struct_b_clone.nested_a.some_enum)
109 def test_wrong_type_of_arguments(self):
111 Everything.test_int8()
113 (e_type, e) = sys.exc_info()[:2]
114 self.assertEqual(e.args, ("test_int8() takes exactly 1 argument (0 given)",))
116 def test_gtypes(self):
117 gchararray_gtype = GObject.type_from_name('gchararray')
118 gtype = Everything.test_gtype(str)
119 self.assertEqual(gchararray_gtype, gtype)
120 gtype = Everything.test_gtype('gchararray')
121 self.assertEqual(gchararray_gtype, gtype)
122 gobject_gtype = GObject.GObject.__gtype__
123 gtype = Everything.test_gtype(GObject.GObject)
124 self.assertEqual(gobject_gtype, gtype)
125 gtype = Everything.test_gtype('GObject')
126 self.assertEqual(gobject_gtype, gtype)
127 self.assertRaises(TypeError, Everything.test_gtype, 'invalidgtype')
129 class NotARegisteredClass(object):
132 self.assertRaises(TypeError, Everything.test_gtype, NotARegisteredClass)
134 class ARegisteredClass(GObject.GObject):
135 __gtype_name__ = 'EverythingTestsARegisteredClass'
137 gtype = Everything.test_gtype('EverythingTestsARegisteredClass')
138 self.assertEqual(ARegisteredClass.__gtype__, gtype)
139 gtype = Everything.test_gtype(ARegisteredClass)
140 self.assertEqual(ARegisteredClass.__gtype__, gtype)
141 self.assertRaises(TypeError, Everything.test_gtype, 'ARegisteredClass')
144 attr_list = dir(Everything)
146 # test that typelib attributes are listed
147 self.assertTrue('TestStructA' in attr_list)
149 # test that class attributes and methods are listed
150 self.assertTrue('__class__' in attr_list)
151 self.assertTrue('__dir__' in attr_list)
152 self.assertTrue('__repr__' in attr_list)
154 # test that instance members are listed
155 self.assertTrue('_namespace' in attr_list)
156 self.assertTrue('_version' in attr_list)
158 # test that there are no duplicates returned
159 self.assertEqual(len(attr_list), len(set(attr_list)))
161 def test_ptrarray(self):
163 result = Everything.test_garray_container_return()
164 self.assertEqual(result, ['regress'])
168 result = Everything.test_garray_full_return()
169 self.assertEqual(result, ['regress'])
172 def test_hash_return(self):
173 result = Everything.test_ghash_gvalue_return()
174 self.assertEqual(result['integer'], 12)
175 self.assertEqual(result['boolean'], True)
176 self.assertEqual(result['string'], 'some text')
177 self.assertEqual(result['strings'], ['first', 'second', 'third'])
178 self.assertEqual(result['flags'], Everything.TestFlags.FLAG1 | Everything.TestFlags.FLAG3)
179 self.assertEqual(result['enum'], Everything.TestEnum.VALUE2)
182 def test_hash_in(self):
183 # specifying a simple string array for "strings" does not work due to
184 # https://bugzilla.gnome.org/show_bug.cgi?id=666636
185 # workaround by explicitly building a GStrv object
187 __gtype__ = GObject.type_from_name('GStrv')
189 data = {'integer': 12,
191 'string': 'some text',
192 'strings': GStrv(['first', 'second', 'third']),
193 'flags': Everything.TestFlags.FLAG1 | Everything.TestFlags.FLAG3,
194 'enum': Everything.TestEnum.VALUE2,
196 Everything.test_ghash_gvalue_in(data)
199 def test_struct_gpointer(self):
201 self.assertEqual(l1.data, None)
202 init_refcount = getrefcount(l1)
205 self.assertEqual(l1.data, 'foo')
208 self.assertEqual(l1.data, l2.data)
209 self.assertEqual(getrefcount(l1), init_refcount + 1)
213 self.assertEqual(l1.data, 'foo')
214 self.assertEqual(l2.data, 'foo')
215 self.assertEqual(l3.data, 'bar')
216 self.assertEqual(getrefcount(l1), init_refcount + 1)
217 self.assertEqual(getrefcount(l3), init_refcount)
220 class TestNullableArgs(unittest.TestCase):
221 def test_in_nullable_hash(self):
222 Everything.test_ghash_null_in(None)
224 def test_in_nullable_list(self):
225 Everything.test_gslist_null_in(None)
226 Everything.test_glist_null_in(None)
227 Everything.test_gslist_null_in([])
228 Everything.test_glist_null_in([])
230 def test_in_nullable_array(self):
231 Everything.test_array_int_null_in(None)
232 Everything.test_array_int_null_in([])
234 def test_in_nullable_string(self):
235 Everything.test_utf8_null_in(None)
237 def test_in_nullable_object(self):
238 Everything.func_obj_null_in(None)
240 def test_out_nullable_hash(self):
241 self.assertEqual(None, Everything.test_ghash_null_out())
243 def test_out_nullable_list(self):
244 self.assertEqual([], Everything.test_gslist_null_out())
245 self.assertEqual([], Everything.test_glist_null_out())
247 def test_out_nullable_array(self):
248 self.assertEqual([], Everything.test_array_int_null_out())
250 def test_out_nullable_string(self):
251 self.assertEqual(None, Everything.test_utf8_null_out())
253 def test_out_nullable_object(self):
254 self.assertEqual(None, Everything.TestObj.null_out())
257 class TestCallbacks(unittest.TestCase):
259 main_loop = GObject.MainLoop()
261 def test_callback(self):
262 TestCallbacks.called = False
265 TestCallbacks.called = True
267 Everything.test_simple_callback(callback)
268 self.assertTrue(TestCallbacks.called)
270 def test_callback_exception(self):
272 This test ensures that we get errors from callbacks correctly
273 and in particular that we do not segv when callbacks fail
277 self.fail('unexpected surviving zero divsion:' + str(x))
279 # note that we do NOT expect the ZeroDivisionError to be propagated
280 # through from the callback, as it crosses the Python<->C boundary
281 # twice. (See GNOME #616279)
282 Everything.test_simple_callback(callback)
284 def test_double_callback_exception(self):
286 This test ensures that we get errors from callbacks correctly
287 and in particular that we do not segv when callbacks fail
291 self.fail('unexpected surviving zero divsion:' + str(x))
294 Everything.test_boolean(True)
295 Everything.test_boolean(False)
296 Everything.test_simple_callback(badcallback())
298 # note that we do NOT expect the ZeroDivisionError to be propagated
299 # through from the callback, as it crosses the Python<->C boundary
300 # twice. (See GNOME #616279)
301 Everything.test_simple_callback(callback)
303 def test_return_value_callback(self):
304 TestCallbacks.called = False
307 TestCallbacks.called = True
310 self.assertEqual(Everything.test_callback(callback), 44)
311 self.assertTrue(TestCallbacks.called)
313 def test_callback_async(self):
314 TestCallbacks.called = False
317 TestCallbacks.called = True
320 Everything.test_callback_async(callback, 44)
321 i = Everything.test_callback_thaw_async()
322 self.assertEqual(44, i)
323 self.assertTrue(TestCallbacks.called)
325 def test_callback_scope_call(self):
326 TestCallbacks.called = 0
329 TestCallbacks.called += 1
332 Everything.test_multi_callback(callback)
333 self.assertEqual(TestCallbacks.called, 2)
335 def test_callback_userdata(self):
336 TestCallbacks.called = 0
338 def callback(userdata):
339 self.assertEqual(userdata, "Test%d" % TestCallbacks.called)
340 TestCallbacks.called += 1
341 return TestCallbacks.called
344 val = Everything.test_callback_user_data(callback, "Test%d" % i)
345 self.assertEqual(val, i + 1)
347 self.assertEqual(TestCallbacks.called, 100)
349 def test_callback_userdata_refcount(self):
350 TestCallbacks.called = False
352 def callback(userdata):
353 TestCallbacks.called = True
356 ud = "Test User Data"
358 start_ref_count = getrefcount(ud)
360 Everything.test_callback_destroy_notify(callback, ud)
362 Everything.test_callback_thaw_notifications()
363 end_ref_count = getrefcount(ud)
365 self.assertEqual(start_ref_count, end_ref_count)
367 def test_async_ready_callback(self):
368 TestCallbacks.called = False
369 TestCallbacks.main_loop = GObject.MainLoop()
371 def callback(obj, result, user_data):
372 TestCallbacks.main_loop.quit()
373 TestCallbacks.called = True
375 Everything.test_async_ready_callback(callback)
377 TestCallbacks.main_loop.run()
379 self.assertTrue(TestCallbacks.called)
381 def test_callback_destroy_notify(self):
382 def callback(user_data):
383 TestCallbacks.called = True
386 TestCallbacks.called = False
387 self.assertEqual(Everything.test_callback_destroy_notify(callback, 42), 42)
388 self.assertTrue(TestCallbacks.called)
389 self.assertEqual(Everything.test_callback_thaw_notifications(), 42)
391 def test_callback_in_methods(self):
392 object_ = Everything.TestObj()
395 TestCallbacks.called = True
398 TestCallbacks.called = False
399 object_.instance_method_callback(callback)
400 self.assertTrue(TestCallbacks.called)
402 TestCallbacks.called = False
403 Everything.TestObj.static_method_callback(callback)
404 self.assertTrue(TestCallbacks.called)
406 def callbackWithUserData(user_data):
407 TestCallbacks.called = True
410 TestCallbacks.called = False
411 Everything.TestObj.new_callback(callbackWithUserData, None)
412 self.assertTrue(TestCallbacks.called)
414 def test_callback_none(self):
415 # make sure this doesn't assert or crash
416 Everything.test_simple_callback(None)
418 def test_callback_gerror(self):
420 self.assertEqual(error.message, 'regression test error')
421 self.assertTrue('g-io' in error.domain)
422 self.assertEqual(error.code, Gio.IOErrorEnum.NOT_SUPPORTED)
423 TestCallbacks.called = True
425 TestCallbacks.called = False
426 Everything.test_gerror_callback(callback)
427 self.assertTrue(TestCallbacks.called)
429 def test_callback_null_gerror(self):
431 self.assertEqual(error, None)
432 TestCallbacks.called = True
434 TestCallbacks.called = False
435 Everything.test_null_gerror_callback(callback)
436 self.assertTrue(TestCallbacks.called)
438 def test_callback_owned_gerror(self):
440 self.assertEqual(error.message, 'regression test owned error')
441 self.assertTrue('g-io' in error.domain)
442 self.assertEqual(error.code, Gio.IOErrorEnum.PERMISSION_DENIED)
443 TestCallbacks.called = True
445 TestCallbacks.called = False
446 Everything.test_owned_gerror_callback(callback)
447 self.assertTrue(TestCallbacks.called)
449 def test_callback_hashtable(self):
451 self.assertEqual(data, mydict)
453 TestCallbacks.called = True
455 mydict = {'foo': 1, 'bar': 2}
456 TestCallbacks.called = False
457 Everything.test_hash_table_callback(mydict, callback)
458 self.assertTrue(TestCallbacks.called)
459 self.assertEqual(mydict, {'foo': 1, 'bar': 2, 'new': 42})
462 class TestClosures(unittest.TestCase):
463 def test_int_arg(self):
469 result = Everything.test_closure_one_arg(callback, 42)
470 self.assertTrue(self.called)
471 self.assertEqual(result, 43)
473 # https://bugzilla.gnome.org/show_bug.cgi?id=656554
475 @unittest.expectedFailure
476 def test_variant(self):
477 def callback(variant):
478 self.assertEqual(variant.get_type_string(), 'i')
480 return GLib.Variant('i', variant.get_int32() + 1)
483 result = Everything.test_closure_variant(callback, GLib.Variant('i', 42))
484 self.assertTrue(self.called)
485 self.assertEqual(result.get_type_string(), 'i')
486 self.assertEqual(result.get_int32(), 43)
489 class TestProperties(unittest.TestCase):
491 def test_basic(self):
492 object_ = Everything.TestObj()
494 self.assertEqual(object_.props.int, 0)
495 object_.props.int = 42
496 self.assertTrue(isinstance(object_.props.int, int))
497 self.assertEqual(object_.props.int, 42)
499 self.assertEqual(object_.props.float, 0.0)
500 object_.props.float = 42.42
501 self.assertTrue(isinstance(object_.props.float, float))
502 self.assertAlmostEquals(object_.props.float, 42.42, places=5)
504 self.assertEqual(object_.props.double, 0.0)
505 object_.props.double = 42.42
506 self.assertTrue(isinstance(object_.props.double, float))
507 self.assertAlmostEquals(object_.props.double, 42.42, places=5)
509 self.assertEqual(object_.props.string, None)
510 object_.props.string = 'mec'
511 self.assertTrue(isinstance(object_.props.string, str))
512 self.assertEqual(object_.props.string, 'mec')
514 self.assertEqual(object_.props.gtype, GObject.TYPE_INVALID)
515 object_.props.gtype = int
516 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
518 def test_hash_table(self):
519 object_ = Everything.TestObj()
520 self.assertEqual(object_.props.hash_table, None)
522 object_.props.hash_table = {'mec': 56}
523 self.assertTrue(isinstance(object_.props.hash_table, dict))
524 self.assertEqual(list(object_.props.hash_table.items())[0], ('mec', 56))
527 object_ = Everything.TestObj()
528 self.assertEqual(object_.props.list, [])
530 object_.props.list = ['1', '2', '3']
531 self.assertTrue(isinstance(object_.props.list, list))
532 self.assertEqual(object_.props.list, ['1', '2', '3'])
534 def test_boxed(self):
535 object_ = Everything.TestObj()
536 self.assertEqual(object_.props.boxed, None)
538 boxed = Everything.TestBoxed()
540 object_.props.boxed = boxed
542 self.assertTrue(isinstance(object_.props.boxed, Everything.TestBoxed))
543 self.assertEqual(object_.props.boxed.some_int8, 42)
545 def test_gtype(self):
546 object_ = Everything.TestObj()
547 self.assertEqual(object_.props.gtype, GObject.TYPE_INVALID)
548 object_.props.gtype = int
549 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
551 object_ = Everything.TestObj(gtype=int)
552 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
553 object_.props.gtype = str
554 self.assertEqual(object_.props.gtype, GObject.TYPE_STRING)
557 class TestTortureProfile(unittest.TestCase):
558 def test_torture_profile(self):
562 object_ = Everything.TestObj()
563 sys.stdout.write("\ttorture test 1 (10000 iterations): ")
565 start_time = time.clock()
566 for i in range(10000):
567 (y, z, q) = object_.torture_signature_0(5000,
571 end_time = time.clock()
572 delta_time = end_time - start_time
573 total_time += delta_time
574 print("%f secs" % delta_time)
576 sys.stdout.write("\ttorture test 2 (10000 iterations): ")
578 start_time = time.clock()
579 for i in range(10000):
580 (y, z, q) = Everything.TestObj().torture_signature_0(
581 5000, "Torture Test 2", 12345)
583 end_time = time.clock()
584 delta_time = end_time - start_time
585 total_time += delta_time
586 print("%f secs" % delta_time)
588 sys.stdout.write("\ttorture test 3 (10000 iterations): ")
589 start_time = time.clock()
590 for i in range(10000):
592 (y, z, q) = object_.torture_signature_1(
593 5000, "Torture Test 3", 12345)
596 end_time = time.clock()
597 delta_time = end_time - start_time
598 total_time += delta_time
599 print("%f secs" % delta_time)
601 sys.stdout.write("\ttorture test 4 (10000 iterations): ")
603 def callback(userdata):
606 userdata = [1, 2, 3, 4]
607 start_time = time.clock()
608 for i in range(10000):
609 (y, z, q) = Everything.test_torture_signature_2(
610 5000, callback, userdata, "Torture Test 4", 12345)
611 end_time = time.clock()
612 delta_time = end_time - start_time
613 total_time += delta_time
614 print("%f secs" % delta_time)
616 print("\tTotal: %f sec" % total_time)
619 class TestAdvancedInterfaces(unittest.TestCase):
620 def test_array_objs(self):
621 obj1, obj2 = Everything.test_array_fixed_out_objects()
622 self.assertTrue(isinstance(obj1, Everything.TestObj))
623 self.assertTrue(isinstance(obj2, Everything.TestObj))
624 self.assertNotEqual(obj1, obj2)
626 def test_obj_skip_return_val(self):
627 obj = Everything.TestObj()
628 ret = obj.skip_return_val(50, 42.0, 60, 2, 3)
629 self.assertEqual(len(ret), 3)
630 self.assertEqual(ret[0], 51)
631 self.assertEqual(ret[1], 61)
632 self.assertEqual(ret[2], 32)
634 def test_obj_skip_return_val_no_out(self):
635 obj = Everything.TestObj()
636 # raises an error for 0, succeeds for any other value
637 self.assertRaises(GLib.GError, obj.skip_return_val_no_out, 0)
639 ret = obj.skip_return_val_no_out(1)
640 self.assertEqual(ret, None)
643 class TestSignals(unittest.TestCase):
644 def test_object_param_signal(self):
645 obj = Everything.TestObj()
647 def callback(obj, obj_param):
648 self.assertEqual(obj_param.props.int, 3)
649 self.assertGreater(obj_param.__grefcount__, 1)
651 obj.connect('sig-with-obj', callback)
652 obj.emit_sig_with_obj()