diff options
| author | Terry Jan Reedy <tjreedy@udel.edu> | 2014-07-01 00:00:03 (GMT) | 
|---|---|---|
| committer | Terry Jan Reedy <tjreedy@udel.edu> | 2014-07-01 00:00:03 (GMT) | 
| commit | 525168bd74c9969d4c0e5d6ff7d13c5a4804d12a (patch) | |
| tree | 016d908e7af802707eb5979f003a5b9655e8e09c /Lib/idlelib/idle_test/test_searchdialogbase.py | |
| parent | f5ac57dc05818e4fe2ff5118680fe136937d768e (diff) | |
| download | cpython-525168bd74c9969d4c0e5d6ff7d13c5a4804d12a.zip cpython-525168bd74c9969d4c0e5d6ff7d13c5a4804d12a.tar.gz cpython-525168bd74c9969d4c0e5d6ff7d13c5a4804d12a.tar.bz2  | |
Issue #18592: Add unittests for SearchDialogBase. Patch by Phil Webster.
Diffstat (limited to 'Lib/idlelib/idle_test/test_searchdialogbase.py')
| -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 0000000..df71ba3 --- /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)  | 
