diff -r 17f23cf029cf Lib/idlelib/SearchDialogBase.py --- a/Lib/idlelib/SearchDialogBase.py Thu Aug 29 01:24:39 2013 +0300 +++ b/Lib/idlelib/SearchDialogBase.py Sun Sep 01 00:20:58 2013 -0400 @@ -1,4 +1,5 @@ '''Define SearchDialogBase used by Search, Replace, and Grep dialogs.''' + from tkinter import * class SearchDialogBase: @@ -6,8 +7,8 @@ The wide left column contains: 1 or 2 text entry lines (create_entries, make_entry); - a row of standard radiobuttons (create_option_buttons); - a row of dialog specific radiobuttons (create_other_buttons). + a row of standard Checkbuttons (create_option_buttons); + a row of dialog-specific Radiobuttons (create_other_buttons). The narrow right column contains command buttons (create_command_buttons, make_button). @@ -64,7 +65,7 @@ self.create_entries() self.create_option_buttons() self.create_other_buttons() - return self.create_command_buttons() + self.create_command_buttons() def make_entry(self, label, var): l = Label(self.top, text=label) @@ -155,3 +156,10 @@ b = self.make_button("close", self.close) b.lower() + +if __name__ == '__main__': + from test import support + support.use_resources = ['gui'] + import unittest + unittest.main('idlelib.idle_test.test_searchdialogbase', + verbosity=2, exit=True) diff -r 17f23cf029cf Lib/idlelib/idle_test/test_searchdialogbase.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_searchdialogbase.py Sun Sep 01 00:20:58 2013 -0400 @@ -0,0 +1,194 @@ +import unittest +from test.support import requires +from tkinter import * +from idlelib import SearchDialogBase as sdb +from idlelib.SearchEngine import SearchEngine + +class sdb_func: + def __init__(self): + self.result = None + self.called = False + def __call__(self, *args, **kwds): + self.called = True + return self.result + +class SearchDialogBaseTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.root = Tk() + + @classmethod + def tearDownClass(cls): + cls.root.destroy() + + def setUp(self): + self.text = Text() + self.engine = SearchEngine(root=self.root) + self.dialog = sdb.SearchDialogBase(root=self.root, engine=self.engine) + + def tearDown(self): + self.dialog.close() + + def test_open(self): + self.dialog.default_command = None + + self.dialog.open(self.text) + self.assertEqual(self.dialog.top.state(), 'normal') + self.dialog.close() + + self.dialog.open(text=self.text, searchphrase="hello") + self.assertEqual(self.dialog.ent.get(), 'hello') + self.dialog.close() + + def test_close(self): + self.dialog.default_command = None + self.dialog.open(self.text) + self.dialog.close() + self.assertEqual(self.dialog.top.state(), 'withdrawn') + + def test_create_widgets(self): + self.dialog.create_entries = sdb_func() + self.dialog.create_option_buttons = sdb_func() + self.dialog.create_other_buttons = sdb_func() + self.dialog.create_command_buttons = sdb_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): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + entry = self.dialog.make_entry("Test:", 'hello') + + self.assertIn(entry.get(), 'hello') + self.assertEqual(entry.grid_info()['row'], '0') + self.assertEqual(entry.grid_info()['column'], '1') + self.assertEqual(entry.grid_info()['rowspan'], '1') + self.assertEqual(entry.grid_info()['columnspan'], '1') + self.assertEqual(self.dialog.row, 1) + + labels = self.find_labels() + self.assertIn('Test:', labels) + + def test_make_frame(self): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + frame = self.dialog.make_frame() + self.assertIsInstance(frame, Frame) + + labelledframe = self.dialog.make_frame('testlabel') + self.assertIsInstance(labelledframe, Frame) + labels = self.find_labels() + self.assertIn('testlabel', labels) + + def find_labels(self): + labels = [] + for child in self.dialog.root.winfo_children(): + for grandchild in child.children.values(): + if isinstance(grandchild, Label): + labels.append(grandchild.config()['text'][-1]) + return labels + + 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.config()['text'][-1], 'Test') + + 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 btn_test_setup(self, option_buttons=0, other_buttons=0): + self.dialog.row = 0 + self.dialog.top = Toplevel(self.root) + if option_buttons: + self.dialog.create_option_buttons() + elif other_buttons: + self.dialog.create_other_buttons() + + def test_create_option_buttons(self): + self.btn_test_setup(option_buttons=1) + 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_buttons=1) + self.checkboxtests(flip=1) + + def test_create_other_buttons(self): + self.btn_test_setup(other_buttons=1) + self.radiobuttontests() + + def test_create_other_buttons_flipped(self): + self.engine.backvar.set(1) + self.btn_test_setup(other_buttons=1) + self.radiobuttontests(back=1) + + 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) + + 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 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() + + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2)