• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"Test searchbase, coverage 98%."
2# The only thing not covered is inconsequential --
3# testing skipping of suite when self.needwrapbutton is false.
4
5import unittest
6from test.support import requires
7from tkinter import Text, Tk, Toplevel
8from tkinter.ttk import Frame
9from idlelib import searchengine as se
10from idlelib import searchbase as sdb
11from idlelib.idle_test.mock_idle import Func
12## from idlelib.idle_test.mock_tk import Var
13
14# The ## imports above & following could help make some tests gui-free.
15# However, they currently make radiobutton tests fail.
16##def setUpModule():
17##    # Replace tk objects used to initialize se.SearchEngine.
18##    se.BooleanVar = Var
19##    se.StringVar = Var
20##
21##def tearDownModule():
22##    se.BooleanVar = BooleanVar
23##    se.StringVar = StringVar
24
25
26class SearchDialogBaseTest(unittest.TestCase):
27
28    @classmethod
29    def setUpClass(cls):
30        requires('gui')
31        cls.root = Tk()
32
33    @classmethod
34    def tearDownClass(cls):
35        cls.root.update_idletasks()
36        cls.root.destroy()
37        del cls.root
38
39    def setUp(self):
40        self.engine = se.SearchEngine(self.root)  # None also seems to work
41        self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine)
42
43    def tearDown(self):
44        self.dialog.close()
45
46    def test_open_and_close(self):
47        # open calls create_widgets, which needs default_command
48        self.dialog.default_command = None
49
50        toplevel = Toplevel(self.root)
51        text = Text(toplevel)
52        self.dialog.open(text)
53        self.assertEqual(self.dialog.top.state(), 'normal')
54        self.dialog.close()
55        self.assertEqual(self.dialog.top.state(), 'withdrawn')
56
57        self.dialog.open(text, searchphrase="hello")
58        self.assertEqual(self.dialog.ent.get(), 'hello')
59        toplevel.update_idletasks()
60        toplevel.destroy()
61
62    def test_create_widgets(self):
63        self.dialog.create_entries = Func()
64        self.dialog.create_option_buttons = Func()
65        self.dialog.create_other_buttons = Func()
66        self.dialog.create_command_buttons = Func()
67
68        self.dialog.default_command = None
69        self.dialog.create_widgets()
70
71        self.assertTrue(self.dialog.create_entries.called)
72        self.assertTrue(self.dialog.create_option_buttons.called)
73        self.assertTrue(self.dialog.create_other_buttons.called)
74        self.assertTrue(self.dialog.create_command_buttons.called)
75
76    def test_make_entry(self):
77        equal = self.assertEqual
78        self.dialog.row = 0
79        self.dialog.frame = Frame(self.root)
80        entry, label = self.dialog.make_entry("Test:", 'hello')
81        equal(label['text'], 'Test:')
82
83        self.assertIn(entry.get(), 'hello')
84        egi = entry.grid_info()
85        equal(int(egi['row']), 0)
86        equal(int(egi['column']), 1)
87        equal(int(egi['rowspan']), 1)
88        equal(int(egi['columnspan']), 1)
89        equal(self.dialog.row, 1)
90
91    def test_create_entries(self):
92        self.dialog.frame = Frame(self.root)
93        self.dialog.row = 0
94        self.engine.setpat('hello')
95        self.dialog.create_entries()
96        self.assertIn(self.dialog.ent.get(), 'hello')
97
98    def test_make_frame(self):
99        self.dialog.row = 0
100        self.dialog.frame = Frame(self.root)
101        frame, label = self.dialog.make_frame()
102        self.assertEqual(label, '')
103        self.assertEqual(str(type(frame)), "<class 'tkinter.ttk.Frame'>")
104        # self.assertIsInstance(frame, Frame) fails when test is run by
105        # test_idle not run from IDLE editor.  See issue 33987 PR.
106
107        frame, label = self.dialog.make_frame('testlabel')
108        self.assertEqual(label['text'], 'testlabel')
109
110    def btn_test_setup(self, meth):
111        self.dialog.frame = Frame(self.root)
112        self.dialog.row = 0
113        return meth()
114
115    def test_create_option_buttons(self):
116        e = self.engine
117        for state in (0, 1):
118            for var in (e.revar, e.casevar, e.wordvar, e.wrapvar):
119                var.set(state)
120            frame, options = self.btn_test_setup(
121                    self.dialog.create_option_buttons)
122            for spec, button in zip (options, frame.pack_slaves()):
123                var, label = spec
124                self.assertEqual(button['text'], label)
125                self.assertEqual(var.get(), state)
126
127    def test_create_other_buttons(self):
128        for state in (False, True):
129            var = self.engine.backvar
130            var.set(state)
131            frame, others = self.btn_test_setup(
132                self.dialog.create_other_buttons)
133            buttons = frame.pack_slaves()
134            for spec, button in zip(others, buttons):
135                val, label = spec
136                self.assertEqual(button['text'], label)
137                if val == state:
138                    # hit other button, then this one
139                    # indexes depend on button order
140                    self.assertEqual(var.get(), state)
141
142    def test_make_button(self):
143        self.dialog.frame = Frame(self.root)
144        self.dialog.buttonframe = Frame(self.dialog.frame)
145        btn = self.dialog.make_button('Test', self.dialog.close)
146        self.assertEqual(btn['text'], 'Test')
147
148    def test_create_command_buttons(self):
149        self.dialog.frame = Frame(self.root)
150        self.dialog.create_command_buttons()
151        # Look for close button command in buttonframe
152        closebuttoncommand = ''
153        for child in self.dialog.buttonframe.winfo_children():
154            if child['text'] == 'Close':
155                closebuttoncommand = child['command']
156        self.assertIn('close', closebuttoncommand)
157
158
159if __name__ == '__main__':
160    unittest.main(verbosity=2, exit=2)
161