| 
									
										
										
										
											2016-06-03 23:58:37 -04:00
										 |  |  | '''Test idlelib.textview.
 | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | Since all methods and functions create (or destroy) a TextViewer, which | 
					
						
							|  |  |  | is a widget containing multiple widgets, all tests must be gui tests. | 
					
						
							|  |  |  | Using mock Text would not change this.  Other mocks are used to retrieve | 
					
						
							|  |  |  | information about calls. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | Coverage: 100%. | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | '''
 | 
					
						
							| 
									
										
										
										
											2016-06-10 18:19:21 -04:00
										 |  |  | from idlelib import textview as tv | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | from test.support import requires | 
					
						
							|  |  |  | requires('gui') | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | import unittest | 
					
						
							|  |  |  | import os | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  | from tkinter import Tk, Button | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | from idlelib.idle_test.mock_idle import Func | 
					
						
							| 
									
										
										
										
											2016-06-22 04:24:27 -04:00
										 |  |  | from idlelib.idle_test.mock_tk import Mbox_func | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | def setUpModule(): | 
					
						
							|  |  |  |     global root | 
					
						
							|  |  |  |     root = Tk() | 
					
						
							| 
									
										
										
										
											2016-08-31 21:03:16 -04:00
										 |  |  |     root.withdraw() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | def tearDownModule(): | 
					
						
							| 
									
										
										
										
											2016-08-10 15:15:25 -04:00
										 |  |  |     global root | 
					
						
							| 
									
										
										
										
											2016-06-03 23:53:56 -04:00
										 |  |  |     root.update_idletasks() | 
					
						
							| 
									
										
										
										
											2016-08-31 21:03:16 -04:00
										 |  |  |     root.destroy()  # Pyflakes falsely sees root as undefined. | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |     del root | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | # If we call TextViewer or wrapper functions with defaults | 
					
						
							|  |  |  | # modal=True, _utest=False, test hangs on call to wait_window. | 
					
						
							|  |  |  | # Have also gotten tk error 'can't invoke "event" command'. | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-31 21:03:16 -04:00
										 |  |  | class TV(tv.TextViewer):  # Used in TextViewTest. | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |     transient = Func() | 
					
						
							|  |  |  |     grab_set = Func() | 
					
						
							|  |  |  |     wait_window = Func() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | # Call wrapper class with mock wait_window. | 
					
						
							|  |  |  | class TextViewTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |     def setUp(self): | 
					
						
							|  |  |  |         TV.transient.__init__() | 
					
						
							|  |  |  |         TV.grab_set.__init__() | 
					
						
							|  |  |  |         TV.wait_window.__init__() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |     def test_init_modal(self): | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |         view = TV(root, 'Title', 'test text') | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertTrue(TV.transient.called) | 
					
						
							|  |  |  |         self.assertTrue(TV.grab_set.called) | 
					
						
							|  |  |  |         self.assertTrue(TV.wait_window.called) | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         view.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_init_nonmodal(self): | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |         view = TV(root, 'Title', 'test text', modal=False) | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertFalse(TV.transient.called) | 
					
						
							|  |  |  |         self.assertFalse(TV.grab_set.called) | 
					
						
							|  |  |  |         self.assertFalse(TV.wait_window.called) | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         view.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_ok(self): | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |         view = TV(root, 'Title', 'test text', modal=False) | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         view.destroy = Func() | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         view.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertTrue(view.destroy.called) | 
					
						
							| 
									
										
										
										
											2016-08-31 21:03:16 -04:00
										 |  |  |         del view.destroy  # Unmask real function. | 
					
						
							|  |  |  |         view.destroy() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | # Call TextViewer with modal=False. | 
					
						
							| 
									
										
										
										
											2016-06-22 04:24:27 -04:00
										 |  |  | class ViewFunctionTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							| 
									
										
										
										
											2016-06-22 04:24:27 -04:00
										 |  |  |         cls.orig_error = tv.showerror | 
					
						
							|  |  |  |         tv.showerror = Mbox_func() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							| 
									
										
										
										
											2016-06-22 04:24:27 -04:00
										 |  |  |         tv.showerror = cls.orig_error | 
					
						
							|  |  |  |         del cls.orig_error | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_view_text(self): | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |         view = tv.view_text(root, 'Title', 'test text', modal=False) | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertIsInstance(view, tv.TextViewer) | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         view.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_view_file(self): | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  |         view = tv.view_file(root, 'Title', __file__, modal=False) | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertIsInstance(view, tv.TextViewer) | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         self.assertIn('Test', view.text.get('1.0', '1.end')) | 
					
						
							|  |  |  |         view.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  |     def test_bad_file(self): | 
					
						
							| 
									
										
										
										
											2016-08-31 21:09:02 -04:00
										 |  |  |         # Mock showerror will be used; view_file will return None. | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  |         view = tv.view_file(root, 'Title', 'abc.xyz', modal=False) | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |         self.assertIsNone(view) | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  |         self.assertEqual(tv.showerror.title, 'File Load Error') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_bad_encoding(self): | 
					
						
							|  |  |  |         p = os.path | 
					
						
							|  |  |  |         fn = p.abspath(p.join(p.dirname(__file__), '..', 'CREDITS.txt')) | 
					
						
							|  |  |  |         tv.showerror.title = None | 
					
						
							|  |  |  |         view = tv.view_file(root, 'Title', fn, 'ascii', modal=False) | 
					
						
							|  |  |  |         self.assertIsNone(view) | 
					
						
							|  |  |  |         self.assertEqual(tv.showerror.title, 'Unicode Decode Error') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | # Call TextViewer with _utest=True. | 
					
						
							|  |  |  | class ButtonClickTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.view = None | 
					
						
							|  |  |  |         self.called = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         if self.view: | 
					
						
							|  |  |  |             self.view.destroy() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_view_text_bind_with_button(self): | 
					
						
							|  |  |  |         def _command(): | 
					
						
							|  |  |  |             self.called = True | 
					
						
							|  |  |  |             self.view = tv.view_text(root, 'TITLE_TEXT', 'COMMAND', _utest=True) | 
					
						
							|  |  |  |         button = Button(root, text='BUTTON', command=_command) | 
					
						
							|  |  |  |         button.invoke() | 
					
						
							|  |  |  |         self.addCleanup(button.destroy) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(self.called, True) | 
					
						
							|  |  |  |         self.assertEqual(self.view.title(), 'TITLE_TEXT') | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         self.assertEqual(self.view.text.get('1.0', '1.end'), 'COMMAND') | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_view_file_bind_with_button(self): | 
					
						
							|  |  |  |         def _command(): | 
					
						
							|  |  |  |             self.called = True | 
					
						
							|  |  |  |             self.view = tv.view_file(root, 'TITLE_FILE', __file__, _utest=True) | 
					
						
							|  |  |  |         button = Button(root, text='BUTTON', command=_command) | 
					
						
							|  |  |  |         button.invoke() | 
					
						
							|  |  |  |         self.addCleanup(button.destroy) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.assertEqual(self.called, True) | 
					
						
							|  |  |  |         self.assertEqual(self.view.title(), 'TITLE_FILE') | 
					
						
							|  |  |  |         with open(__file__) as f: | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |             self.assertEqual(self.view.text.get('1.0', '1.end'), | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  |                              f.readline().strip()) | 
					
						
							|  |  |  |             f.readline() | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |             self.assertEqual(self.view.text.get('3.0', '3.end'), | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  |                              f.readline().strip()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main(verbosity=2) |