1 '''Test idlelib.textview. 2 3 Since all methods and functions create (or destroy) a TextViewer, which 4 is a widget containing multiple widgets, all tests must be gui tests. 5 Using mock Text would not change this. Other mocks are used to retrieve 6 information about calls. 7 8 Coverage: 94%. 9 ''' 10 from idlelib import textview as tv 11 from test.support import requires 12 requires('gui') 13 14 import unittest 15 import os 16 from tkinter import Tk 17 from idlelib.idle_test.mock_idle import Func 18 from idlelib.idle_test.mock_tk import Mbox_func 19 20 def setUpModule(): 21 global root 22 root = Tk() 23 root.withdraw() 24 25 def tearDownModule(): 26 global root 27 root.update_idletasks() 28 root.destroy() # Pyflakes falsely sees root as undefined. 29 del root 30 31 32 class TV(tv.TextViewer): # Used in TextViewTest. 33 transient = Func() 34 grab_set = Func() 35 wait_window = Func() 36 37 class TextViewTest(unittest.TestCase): 38 39 def setUp(self): 40 TV.transient.__init__() 41 TV.grab_set.__init__() 42 TV.wait_window.__init__() 43 44 def test_init_modal(self): 45 view = TV(root, 'Title', 'test text') 46 self.assertTrue(TV.transient.called) 47 self.assertTrue(TV.grab_set.called) 48 self.assertTrue(TV.wait_window.called) 49 view.Ok() 50 51 def test_init_nonmodal(self): 52 view = TV(root, 'Title', 'test text', modal=False) 53 self.assertFalse(TV.transient.called) 54 self.assertFalse(TV.grab_set.called) 55 self.assertFalse(TV.wait_window.called) 56 view.Ok() 57 58 def test_ok(self): 59 view = TV(root, 'Title', 'test text', modal=False) 60 view.destroy = Func() 61 view.Ok() 62 self.assertTrue(view.destroy.called) 63 del view.destroy # Unmask real function. 64 view.destroy() 65 66 67 class ViewFunctionTest(unittest.TestCase): 68 69 @classmethod 70 def setUpClass(cls): 71 cls.orig_error = tv.showerror 72 tv.showerror = Mbox_func() 73 74 @classmethod 75 def tearDownClass(cls): 76 tv.showerror = cls.orig_error 77 del cls.orig_error 78 79 def test_view_text(self): 80 # If modal True, get tk error 'can't invoke "event" command'. 81 view = tv.view_text(root, 'Title', 'test text', modal=False) 82 self.assertIsInstance(view, tv.TextViewer) 83 view.Ok() 84 85 def test_view_file(self): 86 test_dir = os.path.dirname(__file__) 87 testfile = os.path.join(test_dir, 'test_textview.py') 88 view = tv.view_file(root, 'Title', testfile, modal=False) 89 self.assertIsInstance(view, tv.TextViewer) 90 self.assertIn('Test', view.textView.get('1.0', '1.end')) 91 view.Ok() 92 93 # Mock showerror will be used; view_file will return None. 94 testfile = os.path.join(test_dir, '../notthere.py') 95 view = tv.view_file(root, 'Title', testfile, modal=False) 96 self.assertIsNone(view) 97 98 99 if __name__ == '__main__': 100 unittest.main(verbosity=2) 101