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