# Test for Bug #162874 import gc import unittest from common import gtk, gobject class ActionGroupTest(unittest.TestCase): ui0 = ''' ''' def build_gui(self): # Create the toplevel window window = gtk.Window() vbox = gtk.VBox() window.add(vbox) # Create a UIManager instance uimanager = gtk.UIManager() self.uimanager = uimanager # Create the base ActionGroup actiongroup = gtk.ActionGroup('UIMergeExampleBase') actiongroup.add_actions([('File', None, '_File'), ('Sound', None, '_Sound'), ('RadioBand', None, '_Radio Band')]) uimanager.insert_action_group(actiongroup, 0) # Create an ActionGroup actiongroup0 = gtk.ActionGroup('UIMergeExample0') # Create a ToggleAction, etc. actiongroup0.add_toggle_actions([('Mute', None, '_Mute', 'm', 'Mute the volume', self.cb)]) # Create actions actiongroup0.add_actions([('Quit', gtk.STOCK_QUIT, '_Quit me!', None, 'Quit the Program', self.cb)]) # Create some RadioActions actiongroup0.add_radio_actions([('AM', None, '_AM', 'a', 'AM Radio', 0), ('FM', None, '_FM', 'f', 'FM Radio', 1), ('SSB', None, '_SSB', 'b', 'SSB Radio', 2), ], 0, self.cb) # Add the actiongroup to the uimanager uimanager.insert_action_group(actiongroup0, 1) self.ag0 = actiongroup0 del actiongroup0 # Add a UI description self.merge_id0 = uimanager.add_ui_from_string(self.ui0) # Create a MenuBar menubar = uimanager.get_widget('/MenuBar') vbox.pack_start(menubar, False) # Create a Toolbar toolbar = uimanager.get_widget('/Toolbar') vbox.pack_start(toolbar, False) gobject.timeout_add(50, self.timeout_cb) gtk.main() return def timeout_cb(self): ag0 = self.ag0 uimanager = self.uimanager del self.ag0, self.uimanager uimanager.remove_ui(self.merge_id0) uimanager.remove_action_group(ag0) if gobject.pygobject_version >= (2,13): ag0ref = ag0.weak_ref() del ag0 self.assertEqual(ag0ref(), None) else: gc.collect() # Clean out unreachable objects del ag0 self.assertEqual(gc.collect(), 1) # Collect just the ActionGroup uimanager.ensure_update() self.assertEqual(gc.collect(), 6) # Now the GtkActions have lost their last # GObject reference; they should be collected. # We have a ToggleAction, an Action and a # RadioAction, plus self.cb is bound in three # closures. gtk.main_quit() def setUp(self): gc.collect() def testActionGroups(self): self.build_gui() def cb(self, action): return class ActionTest(unittest.TestCase): def testActionSubclass(self): class MyAction(gtk.Action): __gtype_name__ = 'MyAction' def __init__(self): self._activated = False gtk.Action.__init__(self, "name", "label", "tooltip", "stock_id") def do_activate(self): self._activated = True myaction = MyAction() myaction.activate() self.assertEqual(myaction._activated, True) def testSetItemClasses(self): class MyAction(gtk.Action): def __init__(self): gtk.Action.__init__(self, 'name', 'label', None, None) def set_menu_item_type(type): MyAction.set_menu_item_type(type) def set_tool_item_type(type): MyAction.set_tool_item_type(type) self.assertRaises(TypeError, lambda: set_menu_item_type(None)) self.assertRaises(TypeError, lambda: set_menu_item_type(gtk.Button)) set_menu_item_type(gtk.ImageMenuItem) self.assert_(isinstance(MyAction().create_menu_item(), gtk.ImageMenuItem)) self.assertRaises(TypeError, lambda: set_tool_item_type(None)) self.assertRaises(TypeError, lambda: set_tool_item_type(gtk.Button)) set_tool_item_type(gtk.SeparatorToolItem) self.assert_(isinstance(MyAction().create_tool_item(), gtk.SeparatorToolItem)) if __name__ == '__main__': unittest.main()