1 # -*- Mode: Python; py-indent-offset: 4 -*-
2 # vim: tabstop=4 shiftwidth=4 expandtab
10 sys.path.insert(0, "../")
12 from gi.repository import GLib
13 from gi.repository import GObject
14 from gi.repository import Gdk
15 from gi.repository import Gtk
16 import gi.overrides as overrides
19 class TestGLib(unittest.TestCase):
21 def test_gvariant(self):
22 variant = GLib.Variant('i', 42)
23 self.assertTrue(isinstance(variant, GLib.Variant))
24 self.assertEquals(variant.get_int32(), 42)
26 variant = GLib.Variant('(ss)', 'mec', 'mac')
27 self.assertTrue(isinstance(variant, GLib.Variant))
28 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
29 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
30 self.assertEquals(variant.get_child_value(0).get_string(), 'mec')
31 self.assertEquals(variant.get_child_value(1).get_string(), 'mac')
33 variant = GLib.Variant('a{si}', {'key1': 1, 'key2': 2})
34 self.assertTrue(isinstance(variant, GLib.Variant))
35 self.assertTrue(isinstance(variant.get_child_value(0), GLib.Variant))
36 self.assertTrue(isinstance(variant.get_child_value(1), GLib.Variant))
37 # Looks like order is not preserved
38 self.assertEquals(variant.get_child_value(1).get_child_value(0).get_string(), 'key1')
39 self.assertEquals(variant.get_child_value(1).get_child_value(1).get_int32(), 1)
40 self.assertEquals(variant.get_child_value(0).get_child_value(0).get_string(), 'key2')
41 self.assertEquals(variant.get_child_value(0).get_child_value(1).get_int32(), 2)
43 class TestGdk(unittest.TestCase):
46 color = Gdk.Color(100, 200, 300)
47 self.assertEquals(color.red, 100)
48 self.assertEquals(color.green, 200)
49 self.assertEquals(color.blue, 300)
52 event = Gdk.Event.new(Gdk.EventType.CONFIGURE)
53 self.assertEquals(event.type, Gdk.EventType.CONFIGURE)
54 self.assertEquals(event.send_event, 0)
56 event = Gdk.Event.new(Gdk.EventType.DRAG_MOTION)
57 event.x_root, event.y_root = 0, 5
58 self.assertEquals(event.x_root, 0)
59 self.assertEquals(event.y_root, 5)
61 class TestGtk(unittest.TestCase):
62 def test_uimanager(self):
63 self.assertEquals(Gtk.UIManager, overrides.Gtk.UIManager)
65 ui.add_ui_from_string(
68 <menubar name="menubar1"></menubar>
72 menubar = ui.get_widget("/menubar1")
73 self.assertEquals(type(menubar), Gtk.MenuBar)
75 def test_actiongroup(self):
76 self.assertEquals(Gtk.ActionGroup, overrides.Gtk.ActionGroup)
77 action_group = Gtk.ActionGroup (name = 'TestActionGroup')
78 callback_data = "callback data"
80 def test_action_callback_data(action, user_data):
81 self.assertEquals(user_data, callback_data);
83 def test_radio_action_callback_data(action, current, user_data):
84 self.assertEquals(user_data, callback_data);
86 action_group.add_actions ([
87 ('test-action1', None, 'Test Action 1',
88 None, None, test_action_callback_data),
89 ('test-action2', Gtk.STOCK_COPY, 'Test Action 2',
90 None, None, test_action_callback_data)], callback_data)
91 action_group.add_toggle_actions([
92 ('test-toggle-action1', None, 'Test Toggle Action 1',
93 None, None, test_action_callback_data, False),
94 ('test-toggle-action2', Gtk.STOCK_COPY, 'Test Toggle Action 2',
95 None, None, test_action_callback_data, True)], callback_data)
96 action_group.add_radio_actions([
97 ('test-radio-action1', None, 'Test Radio Action 1'),
98 ('test-radio-action2', Gtk.STOCK_COPY, 'Test Radio Action 2')], 1,
99 test_radio_action_callback_data,
102 expected_results = (('test-action1', Gtk.Action),
103 ('test-action2', Gtk.Action),
104 ('test-toggle-action1', Gtk.ToggleAction),
105 ('test-toggle-action2', Gtk.ToggleAction),
106 ('test-radio-action1', Gtk.RadioAction),
107 ('test-radio-action2', Gtk.RadioAction))
109 for action, cmp in zip(action_group.list_actions(), expected_results):
110 a = (action.get_name(), type(action))
111 self.assertEquals(a,cmp)
114 def test_builder(self):
115 self.assertEquals(Gtk.Builder, overrides.Gtk.Builder)
117 class SignalTest(GObject.GObject):
118 __gtype_name__ = "GIOverrideSignalTest"
120 "test-signal": (GObject.SIGNAL_RUN_FIRST,
130 def on_signal_1(self, *args):
133 def on_signal_3(self, *args):
136 signal_checker = SignalCheck()
137 builder = Gtk.Builder()
139 # add object1 to the builder
140 builder.add_from_string(
143 <object class="GIOverrideSignalTest" id="object1">
144 <signal name="test-signal" handler="on_signal_1" />
149 # only add object3 to the builder
150 builder.add_objects_from_string(
153 <object class="GIOverrideSignalTest" id="object2">
154 <signal name="test-signal" handler="on_signal_2" />
156 <object class="GIOverrideSignalTest" id="object3">
157 <signal name="test-signal" handler="on_signal_3" />
159 <object class="GIOverrideSignalTest" id="object4">
160 <signal name="test-signal" handler="on_signal_4" />
168 builder.connect_signals(signal_checker)
170 # call their notify signals and check sentinel
171 objects = builder.get_objects()
172 self.assertEquals(len(objects), 2)
174 obj.emit('test-signal')
176 self.assertEquals(signal_checker.sentinel, 4)
178 def test_dialogs(self):
179 self.assertEquals(Gtk.Dialog, overrides.Gtk.Dialog)
180 self.assertEquals(Gtk.AboutDialog, overrides.Gtk.AboutDialog)
181 self.assertEquals(Gtk.MessageDialog, overrides.Gtk.MessageDialog)
182 self.assertEquals(Gtk.ColorSelectionDialog, overrides.Gtk.ColorSelectionDialog)
183 self.assertEquals(Gtk.FileChooserDialog, overrides.Gtk.FileChooserDialog)
184 self.assertEquals(Gtk.FontSelectionDialog, overrides.Gtk.FontSelectionDialog)
185 self.assertEquals(Gtk.RecentChooserDialog, overrides.Gtk.RecentChooserDialog)
188 dialog = Gtk.Dialog (title='Foo',
189 flags=Gtk.DialogFlags.MODAL,
190 buttons=('test-button1', 1))
192 dialog.add_buttons ('test-button2', 2, Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
194 self.assertEquals('Foo', dialog.get_title())
195 self.assertTrue(dialog.get_modal())
196 button = dialog.get_widget_for_response (1)
197 self.assertEquals('test-button1', button.get_label())
198 button = dialog.get_widget_for_response (2)
199 self.assertEquals('test-button2', button.get_label())
200 button = dialog.get_widget_for_response (Gtk.ResponseType.CLOSE)
201 self.assertEquals(Gtk.STOCK_CLOSE, button.get_label())
204 dialog = Gtk.AboutDialog()
207 dialog = Gtk.MessageDialog (title='message dialog test',
208 flags=Gtk.DialogFlags.MODAL,
209 buttons=Gtk.ButtonsType.OK,
210 message_format='dude!')
212 self.assertEquals('message dialog test', dialog.get_title())
213 self.assertTrue(dialog.get_modal())
214 text = dialog.get_property('text')
215 self.assertEquals('dude!', text)
217 # Gtk.ColorSelectionDialog
218 dialog = Gtk.ColorSelectionDialog("color selection dialog test")
219 self.assertEquals('color selection dialog test', dialog.get_title())
221 # Gtk.FileChooserDialog
222 dialog = Gtk.FileChooserDialog (title='file chooser dialog test',
223 buttons=('test-button1', 1),
224 action=Gtk.FileChooserAction.SAVE)
226 dialog.add_buttons ('test-button2', 2, Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
227 self.assertEquals('file chooser dialog test', dialog.get_title())
228 button = dialog.get_widget_for_response (1)
229 self.assertEquals('test-button1', button.get_label())
230 button = dialog.get_widget_for_response (2)
231 self.assertEquals('test-button2', button.get_label())
232 button = dialog.get_widget_for_response (Gtk.ResponseType.CLOSE)
233 self.assertEquals(Gtk.STOCK_CLOSE, button.get_label())
234 action = dialog.get_property('action')
235 self.assertEquals(Gtk.FileChooserAction.SAVE, action)
238 # Gtk.FontSelectionDialog
239 dialog = Gtk.ColorSelectionDialog("font selection dialog test")
240 self.assertEquals('font selection dialog test', dialog.get_title())
242 # Gtk.RecentChooserDialog
243 test_manager = Gtk.RecentManager()
244 dialog = Gtk.RecentChooserDialog (title='recent chooser dialog test',
245 buttons=('test-button1', 1),
246 manager=test_manager)
248 dialog.add_buttons ('test-button2', 2, Gtk.STOCK_CLOSE, Gtk.ResponseType.CLOSE)
249 self.assertEquals('recent chooser dialog test', dialog.get_title())
250 button = dialog.get_widget_for_response (1)
251 self.assertEquals('test-button1', button.get_label())
252 button = dialog.get_widget_for_response (2)
253 self.assertEquals('test-button2', button.get_label())
254 button = dialog.get_widget_for_response (Gtk.ResponseType.CLOSE)
255 self.assertEquals(Gtk.STOCK_CLOSE, button.get_label())
257 class TestClass(GObject.GObject):
258 __gtype_name__ = "GIOverrideTreeAPITest"
260 def __init__(self, tester, int_value, string_value):
261 super(TestGtk.TestClass, self).__init__()
263 self.int_value = int_value
264 self.string_value = string_value
266 def check(self, int_value, string_value):
267 self.tester.assertEquals(int_value, self.int_value)
268 self.tester.assertEquals(string_value, self.string_value)
270 def test_tree_store(self):
271 self.assertEquals(Gtk.TreeStore, overrides.Gtk.TreeStore)
272 self.assertEquals(Gtk.ListStore, overrides.Gtk.ListStore)
273 self.assertEquals(Gtk.TreeModel, overrides.Gtk.TreeModel)
274 self.assertEquals(Gtk.TreeViewColumn, overrides.Gtk.TreeViewColumn)
276 class TestPyObject(object):
279 test_pyobj = TestPyObject()
280 test_pydict = {1:1, "2":2, "3":"3"}
281 test_pylist = [1,"2", "3"]
282 tree_store = Gtk.TreeStore(int, 'gchararray', TestGtk.TestClass, object, object, object)
286 label = 'this is child #%d' % i
287 testobj = TestGtk.TestClass(self, i, label)
288 parent = tree_store.append(parent, (i,
295 # len gets the number of children in the root node
296 # since we kept appending to the previous node
297 # there should only be one child of the root
298 self.assertEquals(len(tree_store), 1)
300 # walk the tree to see if the values were stored correctly
304 treeiter = tree_store.iter_children(parent)
306 i = tree_store.get_value(treeiter, 0)
307 s = tree_store.get_value(treeiter, 1)
308 obj = tree_store.get_value(treeiter, 2)
309 i = tree_store.get_value(treeiter, 0)
310 s = tree_store.get_value(treeiter, 1)
311 obj = tree_store.get_value(treeiter, 2)
314 pyobj = tree_store.get_value(treeiter, 3)
315 self.assertEquals(pyobj, test_pyobj)
316 pydict = tree_store.get_value(treeiter, 4)
317 self.assertEquals(pydict, test_pydict)
318 pylist = tree_store.get_value(treeiter, 5)
319 self.assertEquals(pylist, test_pylist)
322 treeiter = tree_store.iter_children(parent)
324 self.assertEquals(i, 99)
326 def test_list_store(self):
327 class TestPyObject(object):
330 test_pyobj = TestPyObject()
331 test_pydict = {1:1, "2":2, "3":"3"}
332 test_pylist = [1,"2", "3"]
334 list_store = Gtk.ListStore(int, str, 'GIOverrideTreeAPITest', object, object, object)
336 label = 'this is row #%d' % i
337 testobj = TestGtk.TestClass(self, i, label)
338 parent = list_store.append((i,
345 # add sorted items out of order to test insert* apis
347 label = 'this is row #97'
348 treeiter = list_store.append((i,
350 TestGtk.TestClass(self, i, label),
356 label = 'this is row #99'
357 list_store.insert(9999, (i,
359 TestGtk.TestClass(self, i, label),
365 label = 'this is row #96'
366 list_store.insert_before(treeiter, (i,
368 TestGtk.TestClass(self, i, label),
374 label = 'this is row #98'
375 list_store.insert_after(treeiter, (i,
377 TestGtk.TestClass(self, i, label),
384 label = 'this is row #95'
385 list_store.insert(95, (i,
387 TestGtk.TestClass(self, i, label),
392 self.assertEquals(len(list_store), 100)
394 # walk the list to see if the values were stored correctly
396 treeiter = list_store.get_iter_first()
400 i = list_store.get_value(treeiter, 0)
401 self.assertEquals(i, counter)
402 s = list_store.get_value(treeiter, 1)
403 obj = list_store.get_value(treeiter, 2)
406 pyobj = list_store.get_value(treeiter, 3)
407 self.assertEquals(pyobj, test_pyobj)
408 pydict = list_store.get_value(treeiter, 4)
409 self.assertEquals(pydict, test_pydict)
410 pylist = list_store.get_value(treeiter, 5)
411 self.assertEquals(pylist, test_pylist)
412 treeiter = list_store.iter_next(treeiter)
416 self.assertEquals(i, 99)
418 def test_tree_model(self):
419 tree_store = Gtk.TreeStore(int, str)
421 self.assertTrue(tree_store)
422 self.assertEqual(len(tree_store), 0)
423 self.assertEqual(tree_store.get_iter_first(), None)
425 def get_by_index(row, col=None):
427 return tree_store[row][col]
429 return tree_store[row]
431 self.assertRaises(TypeError, get_by_index, None)
432 self.assertRaises(TypeError, get_by_index, "")
433 self.assertRaises(TypeError, get_by_index, ())
435 self.assertRaises(IndexError, get_by_index, "0")
436 self.assertRaises(IndexError, get_by_index, 0)
437 self.assertRaises(IndexError, get_by_index, (0,))
439 self.assertRaises(ValueError, tree_store.get_iter, "0")
440 self.assertRaises(ValueError, tree_store.get_iter, 0)
441 self.assertRaises(ValueError, tree_store.get_iter, (0,))
443 self.assertRaises(ValueError, tree_store.get_iter_from_string, "0")
445 for row in tree_store:
446 self.fail("Should not be reached")
449 label = 'this is row #%d' % i
450 parent = tree_store.append(None, (i, label,))
451 self.assertNotEquals(parent, None)
453 label = 'this is child #%d of node #%d' % (j, i)
454 child = tree_store.append(parent, (j, label,))
455 self.assertNotEqual(child, None)
457 self.assertTrue(tree_store)
458 self.assertEqual(len(tree_store), 100)
460 for i,row in enumerate(tree_store):
461 self.assertEqual(row.model, tree_store)
462 self.assertEqual(row.parent, None)
464 self.assertEqual(tree_store[i].path, row.path)
465 self.assertEqual(tree_store[str(i)].path, row.path)
466 self.assertEqual(tree_store[(i,)].path, row.path)
468 self.assertEqual(tree_store[i][0], i)
469 self.assertEqual(tree_store[i][1], "this is row #%d" % i)
471 aiter = tree_store.get_iter(i)
472 self.assertEqual(tree_store.get_path(aiter), row.path)
474 aiter = tree_store.get_iter(str(i))
475 self.assertEqual(tree_store.get_path(aiter), row.path)
477 aiter = tree_store.get_iter((i,))
478 self.assertEqual(tree_store.get_path(aiter), row.path)
480 self.assertEqual(tree_store.iter_parent(aiter), row.parent)
482 next = tree_store.iter_next(aiter)
483 if i < len(tree_store) - 1:
484 self.assertEqual(tree_store.get_path(next), row.next.path)
486 self.assertEqual(next, None)
488 self.assertEqual(tree_store.iter_n_children(row.iter), 20)
490 child = tree_store.iter_children(row.iter)
491 for j,childrow in enumerate(row.iterchildren()):
492 child_path = tree_store.get_path(child)
493 self.assertEqual(childrow.path, child_path)
494 self.assertEqual(childrow.parent.path, row.path)
495 self.assertEqual(childrow.path, tree_store[child].path)
496 self.assertEqual(childrow.path, tree_store[child_path].path)
498 self.assertEqual(childrow[0], tree_store[child][0])
499 self.assertEqual(childrow[0], j)
500 self.assertEqual(childrow[1], tree_store[child][1])
501 self.assertEqual(childrow[1], 'this is child #%d of node #%d' % (j, i))
503 self.assertRaises(IndexError, get_by_index, child, 2)
505 tree_store[child][1] = 'this was child #%d of node #%d' % (j, i)
506 self.assertEqual(childrow[1], 'this was child #%d of node #%d' % (j, i))
508 nth_child = tree_store.iter_nth_child(row.iter, j)
509 self.assertEqual(childrow.path, tree_store.get_path(nth_child))
511 childrow2 = tree_store["%d:%d" % (i, j)]
512 self.assertEqual(childrow.path, childrow2.path)
514 childrow2 = tree_store[(i, j,)]
515 self.assertEqual(childrow.path, childrow2.path)
517 child = tree_store.iter_next(child)
519 self.assertEqual(childrow.next.path, tree_store.get_path(child))
521 self.assertEqual(child, childrow.next)
522 self.assertEqual(child, None)
524 self.assertEqual(j, 19)
526 self.assertEqual(i, 99)
529 for i in range(-1,-100,-1):
531 self.assertEqual(tree_store[i][0], i_real)
534 for j in range(-1, -20, -1):
536 path = (i_real, j_real,)
538 self.assertEqual(tree_store[path][-2], j_real)
540 label = 'this was child #%d of node #%d' % (j_real, i_real)
541 self.assertEqual(tree_store[path][-1], label)
543 new_label = 'this still is child #%d of node #%d' % (j_real, i_real)
544 tree_store[path][-1] = new_label
545 self.assertEqual(tree_store[path][-1], new_label)
547 self.assertRaises(IndexError, get_by_index, path, -3)
549 self.assertRaises(IndexError, get_by_index, -101)
551 last_row = tree_store[99]
552 self.assertNotEqual(last_row, None)
554 for i,childrow in enumerate(last_row.iterchildren()):
556 self.assertTrue(tree_store.remove(childrow.iter))
558 self.assertFalse(tree_store.remove(childrow.iter))
560 self.assertEqual(i, 19)
562 self.assertEqual(tree_store.iter_n_children(last_row.iter), 0)
563 for childrow in last_row.iterchildren():
564 self.fail("Should not be reached")
566 def test_tree_view_column(self):
567 cell = Gtk.CellRendererText()
568 column = Gtk.TreeViewColumn(title='This is just a test',
573 def test_text_buffer(self):
574 self.assertEquals(Gtk.TextBuffer, overrides.Gtk.TextBuffer)
575 buffer = Gtk.TextBuffer()
576 tag = buffer.create_tag ('title', font = 'Sans 18')
578 self.assertEquals(tag.props.name, 'title')
579 self.assertEquals(tag.props.font, 'Sans 18')
581 (start, end) = buffer.get_bounds()
583 buffer.insert(end, 'HelloHello')
584 buffer.insert(end, ' Bob')
586 cursor_iter = end.copy()
587 cursor_iter.backward_chars(9)
588 buffer.place_cursor(cursor_iter)
589 buffer.insert_at_cursor(' Jane ')
591 (start, end) = buffer.get_bounds()
592 text = buffer.get_text(start, end, False)
594 self.assertEquals(text, 'Hello Jane Hello Bob')
596 def test_buttons(self):
597 self.assertEquals(Gtk.Button, overrides.Gtk.Button)
600 button = Gtk.Button()
601 button = Gtk.Button(stock=Gtk.STOCK_CLOSE)
602 self.assertEquals(Gtk.STOCK_CLOSE, button.get_label())
603 self.assertTrue(button.get_use_stock())
604 self.assertTrue(button.get_use_underline())
606 def test_inheritance(self):
607 for name in overrides.Gtk.__all__:
608 over = getattr(overrides.Gtk, name)
609 for element in dir(Gtk):
611 klass = getattr(Gtk, element)
612 info = klass.__info__
613 except (NotImplementedError, AttributeError):
616 # Get all parent classes and interfaces klass inherits from
617 if isinstance(info, gi.types.ObjectInfo):
618 classes = list(info.get_interfaces())
619 parent = info.get_parent()
620 while parent.get_name() != "Object":
621 classes.append(parent)
622 parent = parent.get_parent()
623 classes = [kl for kl in classes if kl.get_namespace() == "Gtk"]
628 if kl.get_name() == name:
629 self.assertTrue(issubclass(klass, over,),
630 "%r does not inherit from override %r" % (klass, over,))
632 def test_editable(self):
633 self.assertEquals(Gtk.Editable, overrides.Gtk.Editable)
635 # need to use Gtk.Entry because Editable is an interface
637 pos = entry.insert_text('HeWorld', 0)
638 self.assertEquals(pos, 7)
639 pos = entry.insert_text('llo ', 2)
640 self.assertEquals(pos, 6)
641 text = entry.get_chars(0, 11)
642 self.assertEquals('Hello World', text)