1'''Test the functions and main class method of textView.py.'''
2
3import unittest
4import os
5from test.test_support import requires
6from Tkinter import Tk
7from idlelib import textView as tv
8from idlelib.idle_test.mock_idle import Func
9from idlelib.idle_test.mock_tk import Mbox
10
11
12class TV(tv.TextViewer):  # Use in TextViewTest
13    transient = Func()
14    grab_set = Func()
15    wait_window = Func()
16
17class textviewClassTest(unittest.TestCase):
18
19    @classmethod
20    def setUpClass(cls):
21        requires('gui')
22        cls.root = Tk()
23        cls.root.withdraw()
24
25    @classmethod
26    def tearDownClass(cls):
27        cls.root.destroy()
28        del cls.root
29
30    def setUp(self):
31        TV.transient.__init__()
32        TV.grab_set.__init__()
33        TV.wait_window.__init__()
34
35    def test_init_modal(self):
36        view = TV(self.root, 'Title', 'test text')
37        self.assertTrue(TV.transient.called)
38        self.assertTrue(TV.grab_set.called)
39        self.assertTrue(TV.wait_window.called)
40        view.Ok()
41
42    def test_init_nonmodal(self):
43        view = TV(self.root, 'Title', 'test text', modal=False)
44        self.assertFalse(TV.transient.called)
45        self.assertFalse(TV.grab_set.called)
46        self.assertFalse(TV.wait_window.called)
47        view.Ok()
48
49    def test_ok(self):
50        view = TV(self.root, 'Title', 'test text', modal=False)
51        view.destroy = Func()
52        view.Ok()
53        self.assertTrue(view.destroy.called)
54        del view.destroy  # Unmask the real function.
55        view.destroy()
56
57
58class ViewFunctionTest(unittest.TestCase):
59
60    @classmethod
61    def setUpClass(cls):
62        requires('gui')
63        cls.root = Tk()
64        cls.root.withdraw()
65        cls.orig_mbox = tv.tkMessageBox
66        tv.tkMessageBox = Mbox
67
68    @classmethod
69    def tearDownClass(cls):
70        cls.root.destroy()
71        del cls.root
72        tv.tkMessageBox = cls.orig_mbox
73        del cls.orig_mbox
74
75    def test_view_text(self):
76        # If modal True, get tkinter error 'can't invoke "event" command'.
77        view = tv.view_text(self.root, 'Title', 'test text', modal=False)
78        self.assertIsInstance(view, tv.TextViewer)
79        view.Ok()
80
81    def test_view_file(self):
82        test_dir = os.path.dirname(__file__)
83        testfile = os.path.join(test_dir, 'test_textview.py')
84        view = tv.view_file(self.root, 'Title', testfile, modal=False)
85        self.assertIsInstance(view, tv.TextViewer)
86        self.assertIn('Test', view.textView.get('1.0', '1.end'))
87        view.Ok()
88
89        # Mock messagebox will be used; view_file will return None.
90        testfile = os.path.join(test_dir, '../notthere.py')
91        view = tv.view_file(self.root, 'Title', testfile, modal=False)
92        self.assertIsNone(view)
93
94
95if __name__ == '__main__':
96    unittest.main(verbosity=2)
97