15a493e9dc4f83e7e2a67dc38b7d2b886a6ee8960Terry Jan Reedy'''Test idlelib.redirector.
2223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
3223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy100% coverage
46047b5537226efdcd2e3b460957fb44388ec2e99Terry Jan Reedy'''
5223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyfrom test.support import requires
6223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyimport unittest
7223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyfrom idlelib.idle_test.mock_idle import Func
8223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyfrom tkinter import Tk, Text, TclError
96fa5bdc6e85ec48925bc0d856b134f59d01c300fTerry Jan Reedyfrom idlelib.redirector import WidgetRedirector
10223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
11223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
12223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyclass InitCloseTest(unittest.TestCase):
13223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
14223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    @classmethod
15223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def setUpClass(cls):
16223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        requires('gui')
1775cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.root = Tk()
1800b1e0f7ea1523813e3d407bfdefdf55592566afTerry Jan Reedy        cls.root.withdraw()
1975cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.text = Text(cls.root)
20223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
21223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    @classmethod
22223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def tearDownClass(cls):
2375cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        del cls.text
2475cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.root.destroy()
2575cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        del cls.root
26223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
27223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_init(self):
28223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        redir = WidgetRedirector(self.text)
29223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(redir.widget, self.text)
30223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(redir.tk, self.text.tk)
31223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertRaises(TclError, WidgetRedirector, self.text)
32223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        redir.close()  # restore self.tk, self.text
33223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
34223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_close(self):
35223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        redir = WidgetRedirector(self.text)
36223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        redir.register('insert', Func)
37223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        redir.close()
38223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(redir._operations, {})
39223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertFalse(hasattr(self.text, 'widget'))
40223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
41223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
42223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyclass WidgetRedirectorTest(unittest.TestCase):
43223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
44223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    @classmethod
45223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def setUpClass(cls):
46223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        requires('gui')
4775cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.root = Tk()
4800b1e0f7ea1523813e3d407bfdefdf55592566afTerry Jan Reedy        cls.root.withdraw()
4975cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.text = Text(cls.root)
50223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
51223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    @classmethod
52223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def tearDownClass(cls):
5375cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        del cls.text
546047b5537226efdcd2e3b460957fb44388ec2e99Terry Jan Reedy        cls.root.update_idletasks()
5575cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        cls.root.destroy()
5675cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        del cls.root
57223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
58223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def setUp(self):
59223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.redir = WidgetRedirector(self.text)
60223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.func = Func()
61223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.orig_insert = self.redir.register('insert', self.func)
62223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.text.insert('insert', 'asdf')  # leaves self.text empty
63223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
64223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def tearDown(self):
65223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.text.delete('1.0', 'end')
66223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.redir.close()
67223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
68223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_repr(self):  # partly for 100% coverage
69223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertIn('Redirector', repr(self.redir))
70223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertIn('Original', repr(self.orig_insert))
71223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
72223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_register(self):
73223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.text.get('1.0', 'end'), '\n')
74223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.func.args, ('insert', 'asdf'))
75223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertIn('insert', self.redir._operations)
76223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertIn('insert', self.text.__dict__)
77223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.text.insert, self.func)
78223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
79223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_original_command(self):
80223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.orig_insert.operation, 'insert')
81223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.orig_insert.tk_call, self.text.tk.call)
82223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.orig_insert('insert', 'asdf')
83223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.text.get('1.0', 'end'), 'asdf\n')
84223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
85223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_unregister(self):
86223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertIsNone(self.redir.unregister('invalid operation name'))
87223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.redir.unregister('insert'), self.func)
88223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertNotIn('insert', self.redir._operations)
89223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertNotIn('insert', self.text.__dict__)
90223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
91223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_unregister_no_attribute(self):
92223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        del self.text.insert
93223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.redir.unregister('insert'), self.func)
94223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
95223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_dispatch_intercept(self):
96223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.func.__init__(True)
97223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertTrue(self.redir.dispatch('insert', False))
98223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertFalse(self.func.args[0])
99223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
100223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_dispatch_bypass(self):
101223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.orig_insert('insert', 'asdf')
102223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        # tk.call returns '' where Python would return None
103223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.redir.dispatch('delete', '1.0', 'end'), '')
104223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.text.get('1.0', 'end'), '\n')
105223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
106223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_dispatch_error(self):
107223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.func.__init__(TclError())
108223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.redir.dispatch('insert', False), '')
109223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.redir.dispatch('invalid'), '')
110223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
111223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    def test_command_dispatch(self):
112223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        # Test that .__init__ causes redirection of tk calls
113223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        # through redir.dispatch
11475cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        self.root.call(self.text._w, 'insert', 'hello')
115223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.func.args, ('hello',))
116223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.assertEqual(self.text.get('1.0', 'end'), '\n')
117223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        # Ensure that called through redir .dispatch and not through
118223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        # self.text.insert by having mock raise TclError.
119223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy        self.func.__init__(TclError())
12075cbeb5dac8f4f57777f053eee257dbba5553d98Terry Jan Reedy        self.assertEqual(self.root.call(self.text._w, 'insert', 'boo'), '')
121223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
122223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy
123223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedyif __name__ == '__main__':
124223dd8d7d2a126758f32dd2d1cb5d86e36f39fc8Terry Jan Reedy    unittest.main(verbosity=2)
125