diff -r a0e8f2d882a3 Lib/idlelib/WidgetRedirector.py --- a/Lib/idlelib/WidgetRedirector.py Mon Jun 30 20:00:03 2014 -0400 +++ b/Lib/idlelib/WidgetRedirector.py Tue Jul 08 20:04:25 2014 +0530 @@ -42,8 +42,10 @@ def close(self): for operation in list(self._operations): self.unregister(operation) - widget = self.widget; del self.widget - orig = self.orig; del self.orig + widget = self.widget + del self.widget + orig = self.orig + del self.orig tk = widget.tk w = widget._w tk.deletecommand(w) @@ -121,5 +123,9 @@ root.mainloop() if __name__ == "__main__": + import unittest + unittest.main('idlelib.idle_test.test_widgetredir', verbosity=2, + exit=False) + from idlelib.idle_test.htest import run run(_widget_redirector) diff -r a0e8f2d882a3 Lib/idlelib/idle_test/test_widgetredir.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_widgetredir.py Tue Jul 08 20:04:25 2014 +0530 @@ -0,0 +1,58 @@ +"""Unittest for idlelib.WidgetRedirector""" +import unittest +from unittest.mock import Mock +from test.support import requires +from tkinter import Tk, Text +from idlelib.WidgetRedirector import WidgetRedirector + +class WidgetRedirectorTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.tk = Tk() + cls.text = Text(cls.tk) + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + cls.tk.destroy() + + def setUp(self): + self.redir = WidgetRedirector(self.text) + self.my_method = Mock() + self.original_command = self.redir.register('insert', self.my_method) + self.text.insert('insert', 'asdf') + + def tearDown(self): + self.text.delete('1.0', 'end') + self.redir.close() + + def test_register(self): + self.my_method.assert_called_with('insert', 'asdf') + self.assertIn('insert', self.redir._operations) + self.assertTrue(hasattr(self.text, 'insert')) + self.assertEqual(self.text.insert, self.my_method) + self.assertEqual(self.text.get('1.0', 'end'), '\n') + self.assertEqual(self.original_command.operation, 'insert') + self.assertEqual(self.original_command.tk_call, self.text.tk.call) + self.original_command('insert', 'asdf') + self.assertEqual(self.text.get('1.0', 'end'), 'asdf\n') + + def test_unregister(self): + self.assertIsNone(self.redir.unregister('invalid operation name')) + self.assertEqual(self.redir.unregister('insert'), self.my_method) + self.assertNotIn('insert', self.redir._operations) + + def test_dispatch(self): + """Test alternate code path in WidgetRedirector.dispatch""" + # Test that registered function is not passed on to Tk + self.redir.tk.call(str(self.redir.widget), 'insert', 'hello') + self.my_method.assert_called_with('hello') + self.assertEqual(self.text.get('1.0', 'end'), '\n') + + # Ensure catches TclError + self.assertEqual(self.redir.dispatch('invalid'), "") + +if __name__ == '__main__': + unittest.main(verbosity=2)