1"""Test textview, coverage 100%. 2 3Since all methods and functions create (or destroy) a ViewWindow, which 4is a widget containing a widget, etcetera, all tests must be gui tests. 5Using mock Text would not change this. Other mocks are used to retrieve 6information about calls. 7""" 8from idlelib import textview as tv 9import unittest 10from test.support import requires 11requires('gui') 12 13import os 14from tkinter import Tk 15from tkinter.ttk import Button 16from idlelib.idle_test.mock_idle import Func 17from idlelib.idle_test.mock_tk import Mbox_func 18 19def setUpModule(): 20 global root 21 root = Tk() 22 root.withdraw() 23 24def tearDownModule(): 25 global root 26 root.update_idletasks() 27 root.destroy() 28 del root 29 30# If we call ViewWindow or wrapper functions with defaults 31# modal=True, _utest=False, test hangs on call to wait_window. 32# Have also gotten tk error 'can't invoke "event" command'. 33 34 35class VW(tv.ViewWindow): # Used in ViewWindowTest. 36 transient = Func() 37 grab_set = Func() 38 wait_window = Func() 39 40 41# Call wrapper class VW with mock wait_window. 42class ViewWindowTest(unittest.TestCase): 43 44 def setUp(self): 45 VW.transient.__init__() 46 VW.grab_set.__init__() 47 VW.wait_window.__init__() 48 49 def test_init_modal(self): 50 view = VW(root, 'Title', 'test text') 51 self.assertTrue(VW.transient.called) 52 self.assertTrue(VW.grab_set.called) 53 self.assertTrue(VW.wait_window.called) 54 view.ok() 55 56 def test_init_nonmodal(self): 57 view = VW(root, 'Title', 'test text', modal=False) 58 self.assertFalse(VW.transient.called) 59 self.assertFalse(VW.grab_set.called) 60 self.assertFalse(VW.wait_window.called) 61 view.ok() 62 63 def test_ok(self): 64 view = VW(root, 'Title', 'test text', modal=False) 65 view.destroy = Func() 66 view.ok() 67 self.assertTrue(view.destroy.called) 68 del view.destroy # Unmask real function. 69 view.destroy() 70 71 72class TextFrameTest(unittest.TestCase): 73 74 @classmethod 75 def setUpClass(cls): 76 cls.root = root = Tk() 77 root.withdraw() 78 cls.frame = tv.TextFrame(root, 'test text') 79 80 @classmethod 81 def tearDownClass(cls): 82 del cls.frame 83 cls.root.update_idletasks() 84 cls.root.destroy() 85 del cls.root 86 87 def test_line1(self): 88 get = self.frame.text.get 89 self.assertEqual(get('1.0', '1.end'), 'test text') 90 91 92# Call ViewWindow with modal=False. 93class ViewFunctionTest(unittest.TestCase): 94 95 @classmethod 96 def setUpClass(cls): 97 cls.orig_error = tv.showerror 98 tv.showerror = Mbox_func() 99 100 @classmethod 101 def tearDownClass(cls): 102 tv.showerror = cls.orig_error 103 del cls.orig_error 104 105 def test_view_text(self): 106 view = tv.view_text(root, 'Title', 'test text', modal=False) 107 self.assertIsInstance(view, tv.ViewWindow) 108 self.assertIsInstance(view.viewframe, tv.ViewFrame) 109 view.viewframe.ok() 110 111 def test_view_file(self): 112 view = tv.view_file(root, 'Title', __file__, 'ascii', modal=False) 113 self.assertIsInstance(view, tv.ViewWindow) 114 self.assertIsInstance(view.viewframe, tv.ViewFrame) 115 get = view.viewframe.textframe.text.get 116 self.assertIn('Test', get('1.0', '1.end')) 117 view.ok() 118 119 def test_bad_file(self): 120 # Mock showerror will be used; view_file will return None. 121 view = tv.view_file(root, 'Title', 'abc.xyz', 'ascii', modal=False) 122 self.assertIsNone(view) 123 self.assertEqual(tv.showerror.title, 'File Load Error') 124 125 def test_bad_encoding(self): 126 p = os.path 127 fn = p.abspath(p.join(p.dirname(__file__), '..', 'CREDITS.txt')) 128 view = tv.view_file(root, 'Title', fn, 'ascii', modal=False) 129 self.assertIsNone(view) 130 self.assertEqual(tv.showerror.title, 'Unicode Decode Error') 131 132 def test_nowrap(self): 133 view = tv.view_text(root, 'Title', 'test', modal=False, wrap='none') 134 text_widget = view.viewframe.textframe.text 135 self.assertEqual(text_widget.cget('wrap'), 'none') 136 137 138# Call ViewWindow with _utest=True. 139class ButtonClickTest(unittest.TestCase): 140 141 def setUp(self): 142 self.view = None 143 self.called = False 144 145 def tearDown(self): 146 if self.view: 147 self.view.destroy() 148 149 def test_view_text_bind_with_button(self): 150 def _command(): 151 self.called = True 152 self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=True) 153 button = Button(root, text='BUTTON', command=_command) 154 button.invoke() 155 self.addCleanup(button.destroy) 156 157 self.assertEqual(self.called, True) 158 self.assertEqual(self.view.title(), 'TITLE_TEXT') 159 self.assertEqual(self.view.viewframe.textframe.text.get('1.0', '1.end'), 160 'COMMAND') 161 162 def test_view_file_bind_with_button(self): 163 def _command(): 164 self.called = True 165 self.view = tv.view_file(root, 'TITLE_FILE', __file__, 166 encoding='ascii', _utest=True) 167 button = Button(root, text='BUTTON', command=_command) 168 button.invoke() 169 self.addCleanup(button.destroy) 170 171 self.assertEqual(self.called, True) 172 self.assertEqual(self.view.title(), 'TITLE_FILE') 173 get = self.view.viewframe.textframe.text.get 174 with open(__file__) as f: 175 self.assertEqual(get('1.0', '1.end'), f.readline().strip()) 176 f.readline() 177 self.assertEqual(get('3.0', '3.end'), f.readline().strip()) 178 179 180if __name__ == '__main__': 181 unittest.main(verbosity=2) 182