1 # -*- Mode: Python; py-indent-offset: 4 -*-
3 # vim: tabstop=4 shiftwidth=4 expandtab
9 from sys import getrefcount
19 from gi.repository import GObject
20 from gi.repository import GLib
21 from gi.repository import Gio
22 from gi.repository import Regress as Everything
25 from gi.repository import Gtk
30 if sys.version_info < (3, 0):
31 UNICHAR = "\xe2\x99\xa5"
32 PY2_UNICODE_UNICHAR = unicode(UNICHAR, 'UTF-8')
37 class TestEverything(unittest.TestCase):
39 @unittest.skipUnless(has_cairo, 'built without cairo support')
40 def test_cairo_context(self):
41 context = Everything.test_cairo_context_full_return()
42 self.assertTrue(isinstance(context, cairo.Context))
44 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
45 context = cairo.Context(surface)
46 Everything.test_cairo_context_none_in(context)
48 @unittest.skipUnless(has_cairo, 'built without cairo support')
49 def test_cairo_surface(self):
50 surface = Everything.test_cairo_surface_none_return()
51 self.assertTrue(isinstance(surface, cairo.ImageSurface))
52 self.assertTrue(isinstance(surface, cairo.Surface))
53 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
54 self.assertEqual(surface.get_width(), 10)
55 self.assertEqual(surface.get_height(), 10)
57 surface = Everything.test_cairo_surface_full_return()
58 self.assertTrue(isinstance(surface, cairo.ImageSurface))
59 self.assertTrue(isinstance(surface, cairo.Surface))
60 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
61 self.assertEqual(surface.get_width(), 10)
62 self.assertEqual(surface.get_height(), 10)
64 surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, 10, 10)
65 Everything.test_cairo_surface_none_in(surface)
67 surface = Everything.test_cairo_surface_full_out()
68 self.assertTrue(isinstance(surface, cairo.ImageSurface))
69 self.assertTrue(isinstance(surface, cairo.Surface))
70 self.assertEqual(surface.get_format(), cairo.FORMAT_ARGB32)
71 self.assertEqual(surface.get_width(), 10)
72 self.assertEqual(surface.get_height(), 10)
74 def test_unichar(self):
75 self.assertEqual("c", Everything.test_unichar("c"))
77 if sys.version_info < (3, 0):
78 self.assertEqual(UNICHAR, Everything.test_unichar(PY2_UNICODE_UNICHAR))
79 self.assertEqual(UNICHAR, Everything.test_unichar(UNICHAR))
80 self.assertRaises(TypeError, Everything.test_unichar, "")
81 self.assertRaises(TypeError, Everything.test_unichar, "morethanonechar")
83 def test_floating(self):
84 e = Everything.TestFloating()
85 self.assertEqual(e.__grefcount__, 1)
87 e = GObject.new(Everything.TestFloating)
88 self.assertEqual(e.__grefcount__, 1)
90 e = Everything.TestFloating.new()
91 self.assertEqual(e.__grefcount__, 1)
93 def test_caller_allocates(self):
94 struct_a = Everything.TestStructA()
95 struct_a.some_int = 10
96 struct_a.some_int8 = 21
97 struct_a.some_double = 3.14
98 struct_a.some_enum = Everything.TestEnum.VALUE3
100 struct_a_clone = struct_a.clone()
101 self.assertTrue(struct_a != struct_a_clone)
102 self.assertEqual(struct_a.some_int, struct_a_clone.some_int)
103 self.assertEqual(struct_a.some_int8, struct_a_clone.some_int8)
104 self.assertEqual(struct_a.some_double, struct_a_clone.some_double)
105 self.assertEqual(struct_a.some_enum, struct_a_clone.some_enum)
107 struct_b = Everything.TestStructB()
108 struct_b.some_int8 = 8
109 struct_b.nested_a.some_int = 20
110 struct_b.nested_a.some_int8 = 12
111 struct_b.nested_a.some_double = 333.3333
112 struct_b.nested_a.some_enum = Everything.TestEnum.VALUE2
114 struct_b_clone = struct_b.clone()
115 self.assertTrue(struct_b != struct_b_clone)
116 self.assertEqual(struct_b.some_int8, struct_b_clone.some_int8)
117 self.assertEqual(struct_b.nested_a.some_int, struct_b_clone.nested_a.some_int)
118 self.assertEqual(struct_b.nested_a.some_int8, struct_b_clone.nested_a.some_int8)
119 self.assertEqual(struct_b.nested_a.some_double, struct_b_clone.nested_a.some_double)
120 self.assertEqual(struct_b.nested_a.some_enum, struct_b_clone.nested_a.some_enum)
122 def test_wrong_type_of_arguments(self):
124 Everything.test_int8()
126 (e_type, e) = sys.exc_info()[:2]
127 self.assertEqual(e.args, ("test_int8() takes exactly 1 argument (0 given)",))
129 def test_gtypes(self):
130 gchararray_gtype = GObject.type_from_name('gchararray')
131 gtype = Everything.test_gtype(str)
132 self.assertEqual(gchararray_gtype, gtype)
133 gtype = Everything.test_gtype('gchararray')
134 self.assertEqual(gchararray_gtype, gtype)
135 gobject_gtype = GObject.GObject.__gtype__
136 gtype = Everything.test_gtype(GObject.GObject)
137 self.assertEqual(gobject_gtype, gtype)
138 gtype = Everything.test_gtype('GObject')
139 self.assertEqual(gobject_gtype, gtype)
140 self.assertRaises(TypeError, Everything.test_gtype, 'invalidgtype')
142 class NotARegisteredClass(object):
145 self.assertRaises(TypeError, Everything.test_gtype, NotARegisteredClass)
147 class ARegisteredClass(GObject.GObject):
148 __gtype_name__ = 'EverythingTestsARegisteredClass'
150 gtype = Everything.test_gtype('EverythingTestsARegisteredClass')
151 self.assertEqual(ARegisteredClass.__gtype__, gtype)
152 gtype = Everything.test_gtype(ARegisteredClass)
153 self.assertEqual(ARegisteredClass.__gtype__, gtype)
154 self.assertRaises(TypeError, Everything.test_gtype, 'ARegisteredClass')
157 attr_list = dir(Everything)
159 # test that typelib attributes are listed
160 self.assertTrue('TestStructA' in attr_list)
162 # test that class attributes and methods are listed
163 self.assertTrue('__class__' in attr_list)
164 self.assertTrue('__dir__' in attr_list)
165 self.assertTrue('__repr__' in attr_list)
167 # test that instance members are listed
168 self.assertTrue('_namespace' in attr_list)
169 self.assertTrue('_version' in attr_list)
171 # test that there are no duplicates returned
172 self.assertEqual(len(attr_list), len(set(attr_list)))
174 def test_ptrarray(self):
176 result = Everything.test_garray_container_return()
177 self.assertEqual(result, ['regress'])
181 result = Everything.test_garray_full_return()
182 self.assertEqual(result, ['regress'])
185 def test_hash_return(self):
186 result = Everything.test_ghash_gvalue_return()
187 self.assertEqual(result['integer'], 12)
188 self.assertEqual(result['boolean'], True)
189 self.assertEqual(result['string'], 'some text')
190 self.assertEqual(result['strings'], ['first', 'second', 'third'])
191 self.assertEqual(result['flags'], Everything.TestFlags.FLAG1 | Everything.TestFlags.FLAG3)
192 self.assertEqual(result['enum'], Everything.TestEnum.VALUE2)
195 def test_hash_in(self):
196 # specifying a simple string array for "strings" does not work due to
197 # https://bugzilla.gnome.org/show_bug.cgi?id=666636
198 # workaround by explicitly building a GStrv object
200 __gtype__ = GObject.TYPE_STRV
202 data = {'integer': 12,
204 'string': 'some text',
205 'strings': GStrv(['first', 'second', 'third']),
206 'flags': Everything.TestFlags.FLAG1 | Everything.TestFlags.FLAG3,
207 'enum': Everything.TestEnum.VALUE2,
209 Everything.test_ghash_gvalue_in(data)
212 def test_struct_gpointer(self):
214 self.assertEqual(l1.data, None)
215 init_refcount = getrefcount(l1)
218 self.assertEqual(l1.data, 'foo')
221 self.assertEqual(l1.data, l2.data)
222 self.assertEqual(getrefcount(l1), init_refcount + 1)
226 self.assertEqual(l1.data, 'foo')
227 self.assertEqual(l2.data, 'foo')
228 self.assertEqual(l3.data, 'bar')
229 self.assertEqual(getrefcount(l1), init_refcount + 1)
230 self.assertEqual(getrefcount(l3), init_refcount)
232 def test_struct_opaque(self):
233 # we should get a sensible error message
235 Everything.TestBoxedPrivate()
236 self.fail('allocating disguised struct without default constructor unexpectedly succeeded')
238 (e_type, e_value, e_tb) = sys.exc_info()
239 self.assertEqual(e_type, TypeError)
240 self.assertTrue('TestBoxedPrivate' in str(e_value), str(e_value))
241 self.assertTrue('override' in str(e_value), str(e_value))
242 self.assertTrue('constructor' in str(e_value), str(e_value))
243 tb = ''.join(traceback.format_exception(e_type, e_value, e_tb))
244 self.assertTrue('tests/test_everything.py", line' in tb, tb)
247 class TestNullableArgs(unittest.TestCase):
248 def test_in_nullable_hash(self):
249 Everything.test_ghash_null_in(None)
251 def test_in_nullable_list(self):
252 Everything.test_gslist_null_in(None)
253 Everything.test_glist_null_in(None)
254 Everything.test_gslist_null_in([])
255 Everything.test_glist_null_in([])
257 def test_in_nullable_array(self):
258 Everything.test_array_int_null_in(None)
259 Everything.test_array_int_null_in([])
261 def test_in_nullable_string(self):
262 Everything.test_utf8_null_in(None)
264 def test_in_nullable_object(self):
265 Everything.func_obj_null_in(None)
267 def test_out_nullable_hash(self):
268 self.assertEqual(None, Everything.test_ghash_null_out())
270 def test_out_nullable_list(self):
271 self.assertEqual([], Everything.test_gslist_null_out())
272 self.assertEqual([], Everything.test_glist_null_out())
274 def test_out_nullable_array(self):
275 self.assertEqual([], Everything.test_array_int_null_out())
277 def test_out_nullable_string(self):
278 self.assertEqual(None, Everything.test_utf8_null_out())
280 def test_out_nullable_object(self):
281 self.assertEqual(None, Everything.TestObj.null_out())
284 class TestCallbacks(unittest.TestCase):
286 main_loop = GObject.MainLoop()
288 def test_callback(self):
289 TestCallbacks.called = False
292 TestCallbacks.called = True
294 Everything.test_simple_callback(callback)
295 self.assertTrue(TestCallbacks.called)
297 def test_callback_exception(self):
299 This test ensures that we get errors from callbacks correctly
300 and in particular that we do not segv when callbacks fail
304 self.fail('unexpected surviving zero divsion:' + str(x))
306 # note that we do NOT expect the ZeroDivisionError to be propagated
307 # through from the callback, as it crosses the Python<->C boundary
308 # twice. (See GNOME #616279)
309 Everything.test_simple_callback(callback)
311 def test_double_callback_exception(self):
313 This test ensures that we get errors from callbacks correctly
314 and in particular that we do not segv when callbacks fail
318 self.fail('unexpected surviving zero divsion:' + str(x))
321 Everything.test_boolean(True)
322 Everything.test_boolean(False)
323 Everything.test_simple_callback(badcallback())
325 # note that we do NOT expect the ZeroDivisionError to be propagated
326 # through from the callback, as it crosses the Python<->C boundary
327 # twice. (See GNOME #616279)
328 Everything.test_simple_callback(callback)
330 def test_return_value_callback(self):
331 TestCallbacks.called = False
334 TestCallbacks.called = True
337 self.assertEqual(Everything.test_callback(callback), 44)
338 self.assertTrue(TestCallbacks.called)
340 def test_callback_async(self):
341 TestCallbacks.called = False
344 TestCallbacks.called = True
347 Everything.test_callback_async(callback, 44)
348 i = Everything.test_callback_thaw_async()
349 self.assertEqual(44, i)
350 self.assertTrue(TestCallbacks.called)
352 def test_callback_scope_call(self):
353 TestCallbacks.called = 0
356 TestCallbacks.called += 1
359 Everything.test_multi_callback(callback)
360 self.assertEqual(TestCallbacks.called, 2)
362 def test_callback_userdata(self):
363 TestCallbacks.called = 0
365 def callback(userdata):
366 self.assertEqual(userdata, "Test%d" % TestCallbacks.called)
367 TestCallbacks.called += 1
368 return TestCallbacks.called
371 val = Everything.test_callback_user_data(callback, "Test%d" % i)
372 self.assertEqual(val, i + 1)
374 self.assertEqual(TestCallbacks.called, 100)
376 def test_callback_userdata_refcount(self):
377 TestCallbacks.called = False
379 def callback(userdata):
380 TestCallbacks.called = True
383 ud = "Test User Data"
385 start_ref_count = getrefcount(ud)
387 Everything.test_callback_destroy_notify(callback, ud)
389 Everything.test_callback_thaw_notifications()
390 end_ref_count = getrefcount(ud)
392 self.assertEqual(start_ref_count, end_ref_count)
394 def test_async_ready_callback(self):
395 TestCallbacks.called = False
396 TestCallbacks.main_loop = GObject.MainLoop()
398 def callback(obj, result, user_data):
399 TestCallbacks.main_loop.quit()
400 TestCallbacks.called = True
402 Everything.test_async_ready_callback(callback)
404 TestCallbacks.main_loop.run()
406 self.assertTrue(TestCallbacks.called)
408 def test_callback_destroy_notify(self):
409 def callback(user_data):
410 TestCallbacks.called = True
413 TestCallbacks.called = False
414 self.assertEqual(Everything.test_callback_destroy_notify(callback, 42), 42)
415 self.assertTrue(TestCallbacks.called)
416 self.assertEqual(Everything.test_callback_thaw_notifications(), 42)
418 def test_callback_in_methods(self):
419 object_ = Everything.TestObj()
422 TestCallbacks.called = True
425 TestCallbacks.called = False
426 object_.instance_method_callback(callback)
427 self.assertTrue(TestCallbacks.called)
429 TestCallbacks.called = False
430 Everything.TestObj.static_method_callback(callback)
431 self.assertTrue(TestCallbacks.called)
433 def callbackWithUserData(user_data):
434 TestCallbacks.called = True
437 TestCallbacks.called = False
438 Everything.TestObj.new_callback(callbackWithUserData, None)
439 self.assertTrue(TestCallbacks.called)
441 def test_callback_none(self):
442 # make sure this doesn't assert or crash
443 Everything.test_simple_callback(None)
445 def test_callback_gerror(self):
447 self.assertEqual(error.message, 'regression test error')
448 self.assertTrue('g-io' in error.domain)
449 self.assertEqual(error.code, Gio.IOErrorEnum.NOT_SUPPORTED)
450 TestCallbacks.called = True
452 TestCallbacks.called = False
453 Everything.test_gerror_callback(callback)
454 self.assertTrue(TestCallbacks.called)
456 def test_callback_null_gerror(self):
458 self.assertEqual(error, None)
459 TestCallbacks.called = True
461 TestCallbacks.called = False
462 Everything.test_null_gerror_callback(callback)
463 self.assertTrue(TestCallbacks.called)
465 def test_callback_owned_gerror(self):
467 self.assertEqual(error.message, 'regression test owned error')
468 self.assertTrue('g-io' in error.domain)
469 self.assertEqual(error.code, Gio.IOErrorEnum.PERMISSION_DENIED)
470 TestCallbacks.called = True
472 TestCallbacks.called = False
473 Everything.test_owned_gerror_callback(callback)
474 self.assertTrue(TestCallbacks.called)
476 def test_callback_hashtable(self):
478 self.assertEqual(data, mydict)
480 TestCallbacks.called = True
482 mydict = {'foo': 1, 'bar': 2}
483 TestCallbacks.called = False
484 Everything.test_hash_table_callback(mydict, callback)
485 self.assertTrue(TestCallbacks.called)
486 self.assertEqual(mydict, {'foo': 1, 'bar': 2, 'new': 42})
489 class TestClosures(unittest.TestCase):
490 def test_int_arg(self):
496 result = Everything.test_closure_one_arg(callback, 42)
497 self.assertTrue(self.called)
498 self.assertEqual(result, 43)
500 def test_variant(self):
501 def callback(variant):
505 self.assertEqual(variant.get_type_string(), 'i')
506 return GLib.Variant('i', variant.get_int32() + 1)
509 result = Everything.test_closure_variant(callback, GLib.Variant('i', 42))
510 self.assertTrue(self.called)
511 self.assertEqual(result.get_type_string(), 'i')
512 self.assertEqual(result.get_int32(), 43)
515 result = Everything.test_closure_variant(callback, None)
516 self.assertTrue(self.called)
517 self.assertEqual(result, None)
520 self.assertRaises(TypeError, Everything.test_closure_variant, callback, 'foo')
521 self.assertFalse(self.called)
524 class TestProperties(unittest.TestCase):
526 def test_basic(self):
527 object_ = Everything.TestObj()
529 self.assertEqual(object_.props.int, 0)
530 object_.props.int = 42
531 self.assertTrue(isinstance(object_.props.int, int))
532 self.assertEqual(object_.props.int, 42)
534 self.assertEqual(object_.props.float, 0.0)
535 object_.props.float = 42.42
536 self.assertTrue(isinstance(object_.props.float, float))
537 self.assertAlmostEqual(object_.props.float, 42.42, places=5)
539 self.assertEqual(object_.props.double, 0.0)
540 object_.props.double = 42.42
541 self.assertTrue(isinstance(object_.props.double, float))
542 self.assertAlmostEqual(object_.props.double, 42.42, places=5)
544 self.assertEqual(object_.props.string, None)
545 object_.props.string = 'mec'
546 self.assertTrue(isinstance(object_.props.string, str))
547 self.assertEqual(object_.props.string, 'mec')
549 self.assertEqual(object_.props.gtype, GObject.TYPE_INVALID)
550 object_.props.gtype = int
551 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
553 def test_hash_table(self):
554 object_ = Everything.TestObj()
555 self.assertEqual(object_.props.hash_table, None)
557 object_.props.hash_table = {'mec': 56}
558 self.assertTrue(isinstance(object_.props.hash_table, dict))
559 self.assertEqual(list(object_.props.hash_table.items())[0], ('mec', 56))
562 object_ = Everything.TestObj()
563 self.assertEqual(object_.props.list, [])
565 object_.props.list = ['1', '2', '3']
566 self.assertTrue(isinstance(object_.props.list, list))
567 self.assertEqual(object_.props.list, ['1', '2', '3'])
569 def test_boxed(self):
570 object_ = Everything.TestObj()
571 self.assertEqual(object_.props.boxed, None)
573 boxed = Everything.TestBoxed()
575 object_.props.boxed = boxed
577 self.assertTrue(isinstance(object_.props.boxed, Everything.TestBoxed))
578 self.assertEqual(object_.props.boxed.some_int8, 42)
580 def test_boxed_equality(self):
581 boxed = Everything.TestBoxedC()
582 # TestBoxedC uses refcounting, so we know that
583 # the pointer is the same when copied
585 self.assertEqual(boxed, copy)
586 self.assertNotEqual(id(boxed), id(copy))
588 def test_gtype(self):
589 object_ = Everything.TestObj()
590 self.assertEqual(object_.props.gtype, GObject.TYPE_INVALID)
591 object_.props.gtype = int
592 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
594 object_ = Everything.TestObj(gtype=int)
595 self.assertEqual(object_.props.gtype, GObject.TYPE_INT)
596 object_.props.gtype = str
597 self.assertEqual(object_.props.gtype, GObject.TYPE_STRING)
600 class TestTortureProfile(unittest.TestCase):
601 def test_torture_profile(self):
605 object_ = Everything.TestObj()
606 sys.stdout.write("\ttorture test 1 (10000 iterations): ")
608 start_time = time.clock()
609 for i in range(10000):
610 (y, z, q) = object_.torture_signature_0(5000,
614 end_time = time.clock()
615 delta_time = end_time - start_time
616 total_time += delta_time
617 print("%f secs" % delta_time)
619 sys.stdout.write("\ttorture test 2 (10000 iterations): ")
621 start_time = time.clock()
622 for i in range(10000):
623 (y, z, q) = Everything.TestObj().torture_signature_0(
624 5000, "Torture Test 2", 12345)
626 end_time = time.clock()
627 delta_time = end_time - start_time
628 total_time += delta_time
629 print("%f secs" % delta_time)
631 sys.stdout.write("\ttorture test 3 (10000 iterations): ")
632 start_time = time.clock()
633 for i in range(10000):
635 (y, z, q) = object_.torture_signature_1(
636 5000, "Torture Test 3", 12345)
639 end_time = time.clock()
640 delta_time = end_time - start_time
641 total_time += delta_time
642 print("%f secs" % delta_time)
644 sys.stdout.write("\ttorture test 4 (10000 iterations): ")
646 def callback(userdata):
649 userdata = [1, 2, 3, 4]
650 start_time = time.clock()
651 for i in range(10000):
652 (y, z, q) = Everything.test_torture_signature_2(
653 5000, callback, userdata, "Torture Test 4", 12345)
654 end_time = time.clock()
655 delta_time = end_time - start_time
656 total_time += delta_time
657 print("%f secs" % delta_time)
659 print("\tTotal: %f sec" % total_time)
662 class TestAdvancedInterfaces(unittest.TestCase):
663 def test_array_objs(self):
664 obj1, obj2 = Everything.test_array_fixed_out_objects()
665 self.assertTrue(isinstance(obj1, Everything.TestObj))
666 self.assertTrue(isinstance(obj2, Everything.TestObj))
667 self.assertNotEqual(obj1, obj2)
669 def test_obj_skip_return_val(self):
670 obj = Everything.TestObj()
671 ret = obj.skip_return_val(50, 42.0, 60, 2, 3)
672 self.assertEqual(len(ret), 3)
673 self.assertEqual(ret[0], 51)
674 self.assertEqual(ret[1], 61)
675 self.assertEqual(ret[2], 32)
677 def test_obj_skip_return_val_no_out(self):
678 obj = Everything.TestObj()
679 # raises an error for 0, succeeds for any other value
680 self.assertRaises(GLib.GError, obj.skip_return_val_no_out, 0)
682 ret = obj.skip_return_val_no_out(1)
683 self.assertEqual(ret, None)
686 class TestSignals(unittest.TestCase):
687 def test_object_param_signal(self):
688 obj = Everything.TestObj()
690 def callback(obj, obj_param):
691 self.assertEqual(obj_param.props.int, 3)
692 self.assertGreater(obj_param.__grefcount__, 1)
696 obj.connect('sig-with-obj', callback)
697 obj.emit_sig_with_obj()
698 self.assertTrue(obj.called)
700 def test_int64_param_from_py(self):
701 obj = Everything.TestObj()
703 def callback(obj, i):
707 obj.callback_i = None
708 obj.connect('sig-with-int64-prop', callback)
709 rv = obj.emit('sig-with-int64-prop', GObject.G_MAXINT64)
710 self.assertEqual(rv, GObject.G_MAXINT64)
711 self.assertEqual(obj.callback_i, GObject.G_MAXINT64)
713 def test_uint64_param_from_py(self):
714 obj = Everything.TestObj()
716 def callback(obj, i):
720 obj.callback_i = None
721 obj.connect('sig-with-uint64-prop', callback)
722 rv = obj.emit('sig-with-uint64-prop', GObject.G_MAXUINT64)
723 self.assertEqual(rv, GObject.G_MAXUINT64)
724 self.assertEqual(obj.callback_i, GObject.G_MAXUINT64)
726 def test_int64_param_from_c(self):
727 obj = Everything.TestObj()
729 def callback(obj, i):
733 obj.callback_i = None
735 obj.connect('sig-with-int64-prop', callback)
736 obj.emit_sig_with_int64()
737 self.assertEqual(obj.callback_i, GObject.G_MAXINT64)
739 def test_uint64_param_from_c(self):
740 obj = Everything.TestObj()
742 def callback(obj, i):
746 obj.callback_i = None
748 obj.connect('sig-with-uint64-prop', callback)
749 obj.emit_sig_with_uint64()
750 self.assertEqual(obj.callback_i, GObject.G_MAXUINT64)
753 class TestPango(unittest.TestCase):
754 @unittest.skipUnless(Gtk, 'Gtk not available')
755 def test_cairo_font_options(self):
756 screen = Gtk.Window().get_screen()
757 font_opts = screen.get_font_options()
758 self.assertEqual(type(font_opts.get_subpixel_order()), int)