17db96d56Sopenharmony_ci"Test zzdummy, coverage 100%." 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_cifrom idlelib import zzdummy 47db96d56Sopenharmony_ciimport unittest 57db96d56Sopenharmony_cifrom test.support import requires 67db96d56Sopenharmony_cifrom tkinter import Tk, Text 77db96d56Sopenharmony_cifrom unittest import mock 87db96d56Sopenharmony_cifrom idlelib import config 97db96d56Sopenharmony_cifrom idlelib import editor 107db96d56Sopenharmony_cifrom idlelib import format 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_ciusercfg = zzdummy.idleConf.userCfg 147db96d56Sopenharmony_citestcfg = { 157db96d56Sopenharmony_ci 'main': config.IdleUserConfParser(''), 167db96d56Sopenharmony_ci 'highlight': config.IdleUserConfParser(''), 177db96d56Sopenharmony_ci 'keys': config.IdleUserConfParser(''), 187db96d56Sopenharmony_ci 'extensions': config.IdleUserConfParser(''), 197db96d56Sopenharmony_ci} 207db96d56Sopenharmony_cicode_sample = """\ 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ciclass C1: 237db96d56Sopenharmony_ci # Class comment. 247db96d56Sopenharmony_ci def __init__(self, a, b): 257db96d56Sopenharmony_ci self.a = a 267db96d56Sopenharmony_ci self.b = b 277db96d56Sopenharmony_ci""" 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_ciclass DummyEditwin: 317db96d56Sopenharmony_ci get_selection_indices = editor.EditorWindow.get_selection_indices 327db96d56Sopenharmony_ci def __init__(self, root, text): 337db96d56Sopenharmony_ci self.root = root 347db96d56Sopenharmony_ci self.top = root 357db96d56Sopenharmony_ci self.text = text 367db96d56Sopenharmony_ci self.fregion = format.FormatRegion(self) 377db96d56Sopenharmony_ci self.text.undo_block_start = mock.Mock() 387db96d56Sopenharmony_ci self.text.undo_block_stop = mock.Mock() 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ci 417db96d56Sopenharmony_ciclass ZZDummyTest(unittest.TestCase): 427db96d56Sopenharmony_ci 437db96d56Sopenharmony_ci @classmethod 447db96d56Sopenharmony_ci def setUpClass(cls): 457db96d56Sopenharmony_ci requires('gui') 467db96d56Sopenharmony_ci root = cls.root = Tk() 477db96d56Sopenharmony_ci root.withdraw() 487db96d56Sopenharmony_ci text = cls.text = Text(cls.root) 497db96d56Sopenharmony_ci cls.editor = DummyEditwin(root, text) 507db96d56Sopenharmony_ci zzdummy.idleConf.userCfg = testcfg 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ci @classmethod 537db96d56Sopenharmony_ci def tearDownClass(cls): 547db96d56Sopenharmony_ci zzdummy.idleConf.userCfg = usercfg 557db96d56Sopenharmony_ci del cls.editor, cls.text 567db96d56Sopenharmony_ci cls.root.update_idletasks() 577db96d56Sopenharmony_ci for id in cls.root.tk.call('after', 'info'): 587db96d56Sopenharmony_ci cls.root.after_cancel(id) # Need for EditorWindow. 597db96d56Sopenharmony_ci cls.root.destroy() 607db96d56Sopenharmony_ci del cls.root 617db96d56Sopenharmony_ci 627db96d56Sopenharmony_ci def setUp(self): 637db96d56Sopenharmony_ci text = self.text 647db96d56Sopenharmony_ci text.insert('1.0', code_sample) 657db96d56Sopenharmony_ci text.undo_block_start.reset_mock() 667db96d56Sopenharmony_ci text.undo_block_stop.reset_mock() 677db96d56Sopenharmony_ci zz = self.zz = zzdummy.ZzDummy(self.editor) 687db96d56Sopenharmony_ci zzdummy.ZzDummy.ztext = '# ignore #' 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci def tearDown(self): 717db96d56Sopenharmony_ci self.text.delete('1.0', 'end') 727db96d56Sopenharmony_ci del self.zz 737db96d56Sopenharmony_ci 747db96d56Sopenharmony_ci def checklines(self, text, value): 757db96d56Sopenharmony_ci # Verify that there are lines being checked. 767db96d56Sopenharmony_ci end_line = int(float(text.index('end'))) 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_ci # Check each line for the starting text. 797db96d56Sopenharmony_ci actual = [] 807db96d56Sopenharmony_ci for line in range(1, end_line): 817db96d56Sopenharmony_ci txt = text.get(f'{line}.0', f'{line}.end') 827db96d56Sopenharmony_ci actual.append(txt.startswith(value)) 837db96d56Sopenharmony_ci return actual 847db96d56Sopenharmony_ci 857db96d56Sopenharmony_ci def test_init(self): 867db96d56Sopenharmony_ci zz = self.zz 877db96d56Sopenharmony_ci self.assertEqual(zz.editwin, self.editor) 887db96d56Sopenharmony_ci self.assertEqual(zz.text, self.editor.text) 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ci def test_reload(self): 917db96d56Sopenharmony_ci self.assertEqual(self.zz.ztext, '# ignore #') 927db96d56Sopenharmony_ci testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam') 937db96d56Sopenharmony_ci zzdummy.ZzDummy.reload() 947db96d56Sopenharmony_ci self.assertEqual(self.zz.ztext, 'spam') 957db96d56Sopenharmony_ci 967db96d56Sopenharmony_ci def test_z_in_event(self): 977db96d56Sopenharmony_ci eq = self.assertEqual 987db96d56Sopenharmony_ci zz = self.zz 997db96d56Sopenharmony_ci text = zz.text 1007db96d56Sopenharmony_ci eq(self.zz.ztext, '# ignore #') 1017db96d56Sopenharmony_ci 1027db96d56Sopenharmony_ci # No lines have the leading text. 1037db96d56Sopenharmony_ci expected = [False, False, False, False, False, False, False] 1047db96d56Sopenharmony_ci actual = self.checklines(text, zz.ztext) 1057db96d56Sopenharmony_ci eq(expected, actual) 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci text.tag_add('sel', '2.0', '4.end') 1087db96d56Sopenharmony_ci eq(zz.z_in_event(), 'break') 1097db96d56Sopenharmony_ci expected = [False, True, True, True, False, False, False] 1107db96d56Sopenharmony_ci actual = self.checklines(text, zz.ztext) 1117db96d56Sopenharmony_ci eq(expected, actual) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci text.undo_block_start.assert_called_once() 1147db96d56Sopenharmony_ci text.undo_block_stop.assert_called_once() 1157db96d56Sopenharmony_ci 1167db96d56Sopenharmony_ci def test_z_out_event(self): 1177db96d56Sopenharmony_ci eq = self.assertEqual 1187db96d56Sopenharmony_ci zz = self.zz 1197db96d56Sopenharmony_ci text = zz.text 1207db96d56Sopenharmony_ci eq(self.zz.ztext, '# ignore #') 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ci # Prepend text. 1237db96d56Sopenharmony_ci text.tag_add('sel', '2.0', '5.end') 1247db96d56Sopenharmony_ci zz.z_in_event() 1257db96d56Sopenharmony_ci text.undo_block_start.reset_mock() 1267db96d56Sopenharmony_ci text.undo_block_stop.reset_mock() 1277db96d56Sopenharmony_ci 1287db96d56Sopenharmony_ci # Select a few lines to remove text. 1297db96d56Sopenharmony_ci text.tag_remove('sel', '1.0', 'end') 1307db96d56Sopenharmony_ci text.tag_add('sel', '3.0', '4.end') 1317db96d56Sopenharmony_ci eq(zz.z_out_event(), 'break') 1327db96d56Sopenharmony_ci expected = [False, True, False, False, True, False, False] 1337db96d56Sopenharmony_ci actual = self.checklines(text, zz.ztext) 1347db96d56Sopenharmony_ci eq(expected, actual) 1357db96d56Sopenharmony_ci 1367db96d56Sopenharmony_ci text.undo_block_start.assert_called_once() 1377db96d56Sopenharmony_ci text.undo_block_stop.assert_called_once() 1387db96d56Sopenharmony_ci 1397db96d56Sopenharmony_ci def test_roundtrip(self): 1407db96d56Sopenharmony_ci # Insert and remove to all code should give back original text. 1417db96d56Sopenharmony_ci zz = self.zz 1427db96d56Sopenharmony_ci text = zz.text 1437db96d56Sopenharmony_ci 1447db96d56Sopenharmony_ci text.tag_add('sel', '1.0', 'end-1c') 1457db96d56Sopenharmony_ci zz.z_in_event() 1467db96d56Sopenharmony_ci zz.z_out_event() 1477db96d56Sopenharmony_ci 1487db96d56Sopenharmony_ci self.assertEqual(text.get('1.0', 'end-1c'), code_sample) 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci 1517db96d56Sopenharmony_ciif __name__ == '__main__': 1527db96d56Sopenharmony_ci unittest.main(verbosity=2) 153