| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  | """Test textview, coverage 100%.
 | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | Since all methods and functions create (or destroy) a ViewWindow, which | 
					
						
							|  |  |  | is a widget containing a widget, etcetera, all tests must be gui tests. | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  | Using mock Text would not change this.  Other mocks are used to retrieve | 
					
						
							|  |  |  | information about calls. | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -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 os | 
					
						
							| 
									
										
										
										
											2019-07-27 19:57:48 +03:00
										 |  |  | import unittest | 
					
						
							|  |  |  | from tkinter import Tk, TclError, CHAR, NONE, WORD | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | from tkinter.ttk import 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() | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |     root.destroy() | 
					
						
							| 
									
										
										
										
											2014-06-06 17:43:19 -04:00
										 |  |  |     del root | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | # If we call ViewWindow or wrapper functions with defaults | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | # 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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | class VW(tv.ViewWindow):  # Used in ViewWindowTest. | 
					
						
							| 
									
										
										
										
											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-06-29 18:42:17 -04:00
										 |  |  | # Call wrapper class VW with mock wait_window. | 
					
						
							|  |  |  | class ViewWindowTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |     def setUp(self): | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         VW.transient.__init__() | 
					
						
							|  |  |  |         VW.grab_set.__init__() | 
					
						
							|  |  |  |         VW.wait_window.__init__() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  |     def test_init_modal(self): | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         view = VW(root, 'Title', 'test text') | 
					
						
							|  |  |  |         self.assertTrue(VW.transient.called) | 
					
						
							|  |  |  |         self.assertTrue(VW.grab_set.called) | 
					
						
							|  |  |  |         self.assertTrue(VW.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): | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         view = VW(root, 'Title', 'test text', modal=False) | 
					
						
							|  |  |  |         self.assertFalse(VW.transient.called) | 
					
						
							|  |  |  |         self.assertFalse(VW.grab_set.called) | 
					
						
							|  |  |  |         self.assertFalse(VW.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): | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         view = VW(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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-27 19:57:48 +03:00
										 |  |  | class AutoHideScrollbarTest(unittest.TestCase): | 
					
						
							|  |  |  |     # Method set is tested in ScrollableTextFrameTest | 
					
						
							|  |  |  |     def test_forbidden_geometry(self): | 
					
						
							|  |  |  |         scroll = tv.AutoHideScrollbar(root) | 
					
						
							|  |  |  |         self.assertRaises(TclError, scroll.pack) | 
					
						
							|  |  |  |         self.assertRaises(TclError, scroll.place) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ScrollableTextFrameTest(unittest.TestCase): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         cls.root = root = Tk() | 
					
						
							|  |  |  |         root.withdraw() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							|  |  |  |         cls.root.update_idletasks() | 
					
						
							|  |  |  |         cls.root.destroy() | 
					
						
							|  |  |  |         del cls.root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def make_frame(self, wrap=NONE, **kwargs): | 
					
						
							|  |  |  |         frame = tv.ScrollableTextFrame(self.root, wrap=wrap, **kwargs) | 
					
						
							|  |  |  |         def cleanup_frame(): | 
					
						
							|  |  |  |             frame.update_idletasks() | 
					
						
							|  |  |  |             frame.destroy() | 
					
						
							|  |  |  |         self.addCleanup(cleanup_frame) | 
					
						
							|  |  |  |         return frame | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_line1(self): | 
					
						
							|  |  |  |         frame = self.make_frame() | 
					
						
							|  |  |  |         frame.text.insert('1.0', 'test text') | 
					
						
							|  |  |  |         self.assertEqual(frame.text.get('1.0', '1.end'), 'test text') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_horiz_scrollbar(self): | 
					
						
							|  |  |  |         # The horizontal scrollbar should be shown/hidden according to | 
					
						
							|  |  |  |         # the 'wrap' setting: It should only be shown when 'wrap' is | 
					
						
							|  |  |  |         # set to NONE. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # wrap = NONE -> with horizontal scrolling | 
					
						
							|  |  |  |         frame = self.make_frame(wrap=NONE) | 
					
						
							|  |  |  |         self.assertEqual(frame.text.cget('wrap'), NONE) | 
					
						
							|  |  |  |         self.assertIsNotNone(frame.xscroll) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # wrap != NONE -> no horizontal scrolling | 
					
						
							|  |  |  |         for wrap in [CHAR, WORD]: | 
					
						
							|  |  |  |             with self.subTest(wrap=wrap): | 
					
						
							|  |  |  |                 frame = self.make_frame(wrap=wrap) | 
					
						
							|  |  |  |                 self.assertEqual(frame.text.cget('wrap'), wrap) | 
					
						
							|  |  |  |                 self.assertIsNone(frame.xscroll) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ViewFrameTest(unittest.TestCase): | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def setUpClass(cls): | 
					
						
							|  |  |  |         cls.root = root = Tk() | 
					
						
							|  |  |  |         root.withdraw() | 
					
						
							| 
									
										
										
										
											2019-07-27 19:57:48 +03:00
										 |  |  |         cls.frame = tv.ViewFrame(root, 'test text') | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @classmethod | 
					
						
							|  |  |  |     def tearDownClass(cls): | 
					
						
							|  |  |  |         del cls.frame | 
					
						
							|  |  |  |         cls.root.update_idletasks() | 
					
						
							|  |  |  |         cls.root.destroy() | 
					
						
							|  |  |  |         del cls.root | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_line1(self): | 
					
						
							|  |  |  |         get = self.frame.text.get | 
					
						
							|  |  |  |         self.assertEqual(get('1.0', '1.end'), 'test text') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Call ViewWindow 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) | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         self.assertIsInstance(view, tv.ViewWindow) | 
					
						
							|  |  |  |         self.assertIsInstance(view.viewframe, tv.ViewFrame) | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  |         view.viewframe.ok() | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_view_file(self): | 
					
						
							| 
									
										
										
										
											2018-02-12 17:42:41 -05:00
										 |  |  |         view = tv.view_file(root, 'Title', __file__, 'ascii', modal=False) | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         self.assertIsInstance(view, tv.ViewWindow) | 
					
						
							|  |  |  |         self.assertIsInstance(view.viewframe, tv.ViewFrame) | 
					
						
							|  |  |  |         get = view.viewframe.textframe.text.get | 
					
						
							|  |  |  |         self.assertIn('Test', get('1.0', '1.end')) | 
					
						
							| 
									
										
										
										
											2017-05-28 06:50:55 -04:00
										 |  |  |         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. | 
					
						
							| 
									
										
										
										
											2018-02-12 17:42:41 -05:00
										 |  |  |         view = tv.view_file(root, 'Title', 'abc.xyz', 'ascii', 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')) | 
					
						
							|  |  |  |         view = tv.view_file(root, 'Title', fn, 'ascii', modal=False) | 
					
						
							|  |  |  |         self.assertIsNone(view) | 
					
						
							|  |  |  |         self.assertEqual(tv.showerror.title, 'Unicode Decode Error') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 15:10:14 +03:00
										 |  |  |     def test_nowrap(self): | 
					
						
							|  |  |  |         view = tv.view_text(root, 'Title', 'test', modal=False, wrap='none') | 
					
						
							|  |  |  |         text_widget = view.viewframe.textframe.text | 
					
						
							|  |  |  |         self.assertEqual(text_widget.cget('wrap'), 'none') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  | # Call ViewWindow with _utest=True. | 
					
						
							| 
									
										
										
										
											2017-05-17 22:59:46 -04:00
										 |  |  | 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-06-29 18:42:17 -04:00
										 |  |  |         self.assertEqual(self.view.viewframe.textframe.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 | 
					
						
							| 
									
										
										
										
											2018-02-12 17:42:41 -05:00
										 |  |  |             self.view = tv.view_file(root, 'TITLE_FILE', __file__, | 
					
						
							|  |  |  |                                      encoding='ascii', _utest=True) | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  |         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') | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |         get = self.view.viewframe.textframe.text.get | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  |         with open(__file__) as f: | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |             self.assertEqual(get('1.0', '1.end'), f.readline().strip()) | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  |             f.readline() | 
					
						
							| 
									
										
										
										
											2017-06-29 18:42:17 -04:00
										 |  |  |             self.assertEqual(get('3.0', '3.end'), f.readline().strip()) | 
					
						
							| 
									
										
										
										
											2017-05-18 05:51:31 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 03:38:34 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main(verbosity=2) |