diff options
author | Terry Jan Reedy <tjreedy@udel.edu> | 2014-06-30 20:00:03 -0400 |
---|---|---|
committer | Terry Jan Reedy <tjreedy@udel.edu> | 2014-06-30 20:00:03 -0400 |
commit | e6f5c0cabc84f8951e5bafa59ed016f71bdba94d (patch) | |
tree | 7999a35593fbfaf1670bf95a264bf4be4b4fede5 /Lib/idlelib/idle_test | |
parent | 7591b89be41c5cbb8c94335e54be557e833b9b8e (diff) | |
download | cpython-e6f5c0cabc84f8951e5bafa59ed016f71bdba94d.tar.gz |
Issue #18592: Add unittests for SearchDialogBase. Patch by Phil Webster.
Diffstat (limited to 'Lib/idlelib/idle_test')
-rw-r--r-- | Lib/idlelib/idle_test/test_searchdialogbase.py | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/Lib/idlelib/idle_test/test_searchdialogbase.py b/Lib/idlelib/idle_test/test_searchdialogbase.py new file mode 100644 index 0000000000..df71ba35e3 --- /dev/null +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py @@ -0,0 +1,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) |