mirror of
				https://github.com/python/cpython.git
				synced 2025-10-28 04:04:44 +00:00 
			
		
		
		
	
		
			
	
	
		
			199 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			199 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | '''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) |