Skip to content

Commit

Permalink
bpo-30853: IDLE - touch-up configdialog.VarTrace and tests. (#2936)
Browse files Browse the repository at this point in the history
Add clear method for tests.  Adjust tests to use global instance.
Remove unneeded ConfigDialog method.
  • Loading branch information
terryjreedy committed Jul 28, 2017
1 parent 5b59154 commit 5d0f30a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 deletions.
10 changes: 5 additions & 5 deletions Lib/idlelib/configdialog.py
Expand Up @@ -99,7 +99,6 @@ def create_widgets(self):
create_page_extensions
create_action_buttons
load_configs: Load pages except for extensions.
remove_var_callbacks
activate_config_changes: Tell editors to reload.
"""
self.tab_pages = TabbedPageSet(self,
Expand Down Expand Up @@ -133,10 +132,6 @@ def load_configs(self):
self.load_general_cfg()
# note: extension page handled separately

def remove_var_callbacks(self):
"Remove callbacks to prevent memory leaks."
tracers.detach()

def create_action_buttons(self):
"""Return frame of action buttons for dialog.
Expand Down Expand Up @@ -1846,6 +1841,11 @@ def __init__(self):
self.untraced = []
self.traced = []

def clear(self):
"Clear lists (for tests)."
self.untraced.clear()
self.traced.clear()

def add(self, var, callback):
"""Add (var, callback) tuple to untraced list.
Expand Down
29 changes: 18 additions & 11 deletions Lib/idlelib/idle_test/test_configdialog.py
Expand Up @@ -11,7 +11,7 @@
from idlelib.idle_test.mock_idle import Func
from tkinter import Tk, IntVar, BooleanVar, DISABLED, NORMAL
from idlelib import config
from idlelib.configdialog import ConfigDialog, idleConf, changes, VarTrace
from idlelib.configdialog import idleConf, changes, tracers

# Tests should not depend on fortuitous user configurations.
# They must not affect actual user .cfg files.
Expand All @@ -35,12 +35,12 @@ def setUpModule():
idleConf.userCfg = testcfg
root = Tk()
# root.withdraw() # Comment out, see issue 30870
dialog = ConfigDialog(root, 'Test', _utest=True)
dialog = configdialog.ConfigDialog(root, 'Test', _utest=True)

def tearDownModule():
global root, dialog
idleConf.userCfg = usercfg
dialog.remove_var_callbacks()
tracers.detach()
del dialog
root.update_idletasks()
root.destroy()
Expand Down Expand Up @@ -423,14 +423,14 @@ def test_update_help_changes(self):
d.update_help_changes = Func()


class TestVarTrace(unittest.TestCase):
class VarTraceTest(unittest.TestCase):

def setUp(self):
changes.clear()
tracers.clear()
self.v1 = IntVar(root)
self.v2 = BooleanVar(root)
self.called = 0
self.tracers = VarTrace()

def tearDown(self):
del self.v1, self.v2
Expand All @@ -442,11 +442,19 @@ def var_changed_boolean(self, *params):
pass

def test_init(self):
self.assertEqual(self.tracers.untraced, [])
self.assertEqual(self.tracers.traced, [])
tracers.__init__()
self.assertEqual(tracers.untraced, [])
self.assertEqual(tracers.traced, [])

def test_clear(self):
tracers.untraced.append(0)
tracers.traced.append(1)
tracers.clear()
self.assertEqual(tracers.untraced, [])
self.assertEqual(tracers.traced, [])

def test_add(self):
tr = self.tracers
tr = tracers
func = Func()
cb = tr.make_callback = mock.Mock(return_value=func)

Expand All @@ -469,8 +477,7 @@ def test_add(self):
del tr.make_callback

def test_make_callback(self):
tr = self.tracers
cb = tr.make_callback(self.v1, ('main', 'section', 'option'))
cb = tracers.make_callback(self.v1, ('main', 'section', 'option'))
self.assertTrue(callable(cb))
self.v1.set(42)
# Not attached, so set didn't invoke the callback.
Expand All @@ -481,7 +488,7 @@ def test_make_callback(self):
self.assertEqual(changes['main']['section']['option'], '42')

def test_attach_detach(self):
tr = self.tracers
tr = tracers
v1 = tr.add(self.v1, self.var_changed_increment)
v2 = tr.add(self.v2, self.var_changed_boolean)
expected = [(v1, self.var_changed_increment),
Expand Down

0 comments on commit 5d0f30a

Please sign in to comment.