From 0b7e950b799b6904e4656fe756776ace36a2cf1a Mon Sep 17 00:00:00 2001 From: Vincent Vinet Date: Wed, 25 Mar 2009 17:51:58 +0000 Subject: Fix max_depth recursion limit in gtkutils register_signals and add test cases corresponding to the bug --- (limited to 'src/sugar/tutorius') diff --git a/src/sugar/tutorius/gtkutils.py b/src/sugar/tutorius/gtkutils.py index c5c1e12..1870dc4 100644 --- a/src/sugar/tutorius/gtkutils.py +++ b/src/sugar/tutorius/gtkutils.py @@ -158,7 +158,11 @@ def register_signals(target, handler, prefix=None, max_depth=None): [p for p in (prefix, target.get_name()) \ if not (p is None or p in IGNORED_WIDGETS)] \ ) - ret += register_signals(child, handler, pre, max_depth-1) + if max_depth is None: + dep = None + else: + dep = max_depth - 1 + ret += register_signals(child, handler, pre, dep) name = ".".join( \ [p for p in (prefix, target.get_name()) \ if not (p is None or p in IGNORED_WIDGETS)] \ diff --git a/src/sugar/tutorius/tests/gtkutilstests.py b/src/sugar/tutorius/tests/gtkutilstests.py index 36e76fe..fb9a20b 100644 --- a/src/sugar/tutorius/tests/gtkutilstests.py +++ b/src/sugar/tutorius/tests/gtkutilstests.py @@ -28,7 +28,19 @@ import logging import gtk, gobject from sugar.tutorius.gtkutils import find_widget, register_signals_numbered, register_signals +class SignalCatcher(object): + def __init__(self): + self.data = [] + def callback(self, *args): + self.data = args + +def disconnect_handlers(hlist): + for widget, handler in hlist: + try: + widget.handler_disconnect(handler) + except: + pass class GtkUtilsTests(unittest.TestCase): def __init__(self,*args): @@ -84,10 +96,27 @@ class GtkUtilsTests(unittest.TestCase): def test_named(self): #def register_signals(target, handler, prefix=None, max_depth=None): - pass + s=SignalCatcher() + handler_list = register_signals(self.top, s.callback, max_depth=0) + + #remove duplicates in widget list + widget_list = dict.fromkeys([w for w, h in handler_list]).keys() + + assert len(widget_list) == 1, "register_signals should not have recursed (%d objects registered)" % len(widget_list) + + while gtk.events_pending(): + gtk.main_iteration(block=False) def test_numbered(self): + s=SignalCatcher() #def register_signals_numbered(target, handler, prefix="0", max_depth=None): + handler_list = register_signals_numbered(self.top, s.callback, max_depth=0) + + #remove duplicates in widget list + widget_list = dict.fromkeys([w for w, h in handler_list]).keys() + + assert len(widget_list) == 1, "register_signals should not have recursed (%d objects registered)" % len(widget_list) + while gtk.events_pending(): gtk.main_iteration(block=False) -- cgit v0.9.1