Home | History | Annotate | Download | only in idle_test
      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