1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
|
'''Unittests for idlelib/SearchDialogBase.py
Coverage: 99%. The only thing not covered is inconsequential --
testing skipping of suite when self.needwrapbutton is false.
'''
import unittest
from test.support import requires
from tkinter import Tk, Toplevel, Frame, Label, BooleanVar, StringVar
from idlelib import SearchEngine as se
from idlelib import SearchDialogBase as sdb
from idlelib.idle_test.mock_idle import Func
from idlelib.idle_test.mock_tk import Var, Mbox
# The following could help make some tests gui-free.
# However, they currently make radiobutton tests fail.
##def setUpModule():
## # Replace tk objects used to initialize se.SearchEngine.
## se.BooleanVar = Var
## se.StringVar = Var
##
##def tearDownModule():
## se.BooleanVar = BooleanVar
## se.StringVar = StringVar
class SearchDialogBaseTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
requires('gui')
cls.root = Tk()
@classmethod
def tearDownClass(cls):
cls.root.destroy()
del cls.root
def setUp(self):
self.engine = se.SearchEngine(self.root) # None also seems to work
self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine)
def tearDown(self):
self.dialog.close()
def test_open_and_close(self):
# open calls create_widgets, which needs default_command
self.dialog.default_command = None
# Since text parameter of .open is not used in base class,
# pass dummy 'text' instead of tk.Text().
self.dialog.open('text')
self.assertEqual(self.dialog.top.state(), 'normal')
self.dialog.close()
self.assertEqual(self.dialog.top.state(), 'withdrawn')
self.dialog.open('text', searchphrase="hello")
self.assertEqual(self.dialog.ent.get(), 'hello')
self.dialog.close()
def test_create_widgets(self):
self.dialog.create_entries = Func()
self.dialog.create_option_buttons = Func()
self.dialog.create_other_buttons = Func()
self.dialog.create_command_buttons = Func()
self.dialog.default_command = None
self.dialog.create_widgets()
self.assertTrue(self.dialog.create_entries.called)
self.assertTrue(self.dialog.create_option_buttons.called)
self.assertTrue(self.dialog.create_other_buttons.called)
self.assertTrue(self.dialog.create_command_buttons.called)
def test_make_entry(self):
equal = self.assertEqual
self.dialog.row = 0
self.dialog.top = Toplevel(self.root)
label, entry = self.dialog.make_entry("Test:", 'hello')
equal(label.cget('text'), 'Test:')
self.assertIn(entry.get(), 'hello')
egi = entry.grid_info()
equal(egi['row'], 0)
equal(egi['column'], 1)
equal(egi['rowspan'], 1)
equal(egi['columnspan'], 1)
equal(self.dialog.row, 1)
def test_create_entries(self):
self.dialog.row = 0
self.engine.setpat('hello')
self.dialog.create_entries()
self.assertIn(self.dialog.ent.get(), 'hello')
def test_make_frame(self):
self.dialog.row = 0
self.dialog.top = Toplevel(self.root)
label, frame = self.dialog.make_frame()
self.assertEqual(label, '')
self.assertIsInstance(frame, Frame)
label, labelledframe = self.dialog.make_frame('testlabel')
self.assertEqual(label.cget('text'), 'testlabel')
self.assertIsInstance(labelledframe, Frame)
def btn_test_setup(self, which):
self.dialog.row = 0
self.dialog.top = Toplevel(self.root)
if which == 'option':
self.dialog.create_option_buttons()
elif which == 'other':
self.dialog.create_other_buttons()
else:
raise ValueError('bad which arg %s' % which)
def test_create_option_buttons(self):
self.btn_test_setup('option')
self.checkboxtests()
def test_create_option_buttons_flipped(self):
for var in ('revar', 'casevar', 'wordvar', 'wrapvar'):
Var = getattr(self.engine, var)
Var.set(not Var.get())
self.btn_test_setup('option')
self.checkboxtests(flip=1)
def checkboxtests(self, flip=0):
"""Tests the four checkboxes in the search dialog window."""
engine = self.engine
for child in self.dialog.top.winfo_children():
for grandchild in child.winfo_children():
text = grandchild.config()['text'][-1]
if text == ('Regular', 'expression'):
self.btnstatetest(grandchild, engine.revar, flip)
elif text == ('Match', 'case'):
self.btnstatetest(grandchild, engine.casevar, flip)
elif text == ('Whole', 'word'):
self.btnstatetest(grandchild, engine.wordvar, flip)
elif text == ('Wrap', 'around'):
self.btnstatetest(grandchild, engine.wrapvar, not flip)
def btnstatetest(self, button, var, defaultstate):
self.assertEqual(var.get(), defaultstate)
if defaultstate == 1:
button.deselect()
else:
button.select()
self.assertEqual(var.get(), 1 - defaultstate)
def test_create_other_buttons(self):
self.btn_test_setup('other')
self.radiobuttontests()
def test_create_other_buttons_flipped(self):
self.engine.backvar.set(1)
self.btn_test_setup('other')
self.radiobuttontests(back=1)
def radiobuttontests(self, back=0):
searchupbtn = None
searchdownbtn = None
for child in self.dialog.top.winfo_children():
for grandchild in child.children.values():
text = grandchild.config()['text'][-1]
if text == 'Up':
searchupbtn = grandchild
elif text == 'Down':
searchdownbtn = grandchild
# Defaults to searching downward
self.assertEqual(self.engine.backvar.get(), back)
if back:
searchdownbtn.select()
else:
searchupbtn.select()
self.assertEqual(self.engine.backvar.get(), not back)
searchdownbtn.select()
def test_make_button(self):
self.dialog.top = Toplevel(self.root)
self.dialog.buttonframe = Frame(self.dialog.top)
btn = self.dialog.make_button('Test', self.dialog.close)
self.assertEqual(btn.cget('text'), 'Test')
def test_create_command_buttons(self):
self.dialog.create_command_buttons()
# Look for close button command in buttonframe
closebuttoncommand = ''
for child in self.dialog.buttonframe.winfo_children():
if child.config()['text'][-1] == 'close':
closebuttoncommand = child.config()['command'][-1]
self.assertIn('close', closebuttoncommand)
if __name__ == '__main__':
unittest.main(verbosity=2, exit=2)
|