| "Test zzdummy, coverage 100%." |
| |
| from idlelib import zzdummy |
| import unittest |
| from test.support import requires |
| from tkinter import Tk, Text |
| from unittest import mock |
| from idlelib import config |
| from idlelib import editor |
| from idlelib import format |
| |
| |
| usercfg = zzdummy.idleConf.userCfg |
| testcfg = { |
| 'main': config.IdleUserConfParser(''), |
| 'highlight': config.IdleUserConfParser(''), |
| 'keys': config.IdleUserConfParser(''), |
| 'extensions': config.IdleUserConfParser(''), |
| } |
| code_sample = """\ |
| |
| class C1(): |
| # Class comment. |
| def __init__(self, a, b): |
| self.a = a |
| self.b = b |
| """ |
| |
| |
| class DummyEditwin: |
| get_selection_indices = editor.EditorWindow.get_selection_indices |
| def __init__(self, root, text): |
| self.root = root |
| self.top = root |
| self.text = text |
| self.fregion = format.FormatRegion(self) |
| self.text.undo_block_start = mock.Mock() |
| self.text.undo_block_stop = mock.Mock() |
| |
| |
| class ZZDummyTest(unittest.TestCase): |
| |
| @classmethod |
| def setUpClass(cls): |
| requires('gui') |
| root = cls.root = Tk() |
| root.withdraw() |
| text = cls.text = Text(cls.root) |
| cls.editor = DummyEditwin(root, text) |
| zzdummy.idleConf.userCfg = testcfg |
| |
| @classmethod |
| def tearDownClass(cls): |
| zzdummy.idleConf.userCfg = usercfg |
| del cls.editor, cls.text |
| cls.root.update_idletasks() |
| for id in cls.root.tk.call('after', 'info'): |
| cls.root.after_cancel(id) # Need for EditorWindow. |
| cls.root.destroy() |
| del cls.root |
| |
| def setUp(self): |
| text = self.text |
| text.insert('1.0', code_sample) |
| text.undo_block_start.reset_mock() |
| text.undo_block_stop.reset_mock() |
| zz = self.zz = zzdummy.ZzDummy(self.editor) |
| zzdummy.ZzDummy.ztext = '# ignore #' |
| |
| def tearDown(self): |
| self.text.delete('1.0', 'end') |
| del self.zz |
| |
| def checklines(self, text, value): |
| # Verify that there are lines being checked. |
| end_line = int(float(text.index('end'))) |
| |
| # Check each line for the starting text. |
| actual = [] |
| for line in range(1, end_line): |
| txt = text.get(f'{line}.0', f'{line}.end') |
| actual.append(txt.startswith(value)) |
| return actual |
| |
| def test_init(self): |
| zz = self.zz |
| self.assertEqual(zz.editwin, self.editor) |
| self.assertEqual(zz.text, self.editor.text) |
| |
| def test_reload(self): |
| self.assertEqual(self.zz.ztext, '# ignore #') |
| testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam') |
| zzdummy.ZzDummy.reload() |
| self.assertEqual(self.zz.ztext, 'spam') |
| |
| def test_z_in_event(self): |
| eq = self.assertEqual |
| zz = self.zz |
| text = zz.text |
| eq(self.zz.ztext, '# ignore #') |
| |
| # No lines have the leading text. |
| expected = [False, False, False, False, False, False, False] |
| actual = self.checklines(text, zz.ztext) |
| eq(expected, actual) |
| |
| text.tag_add('sel', '2.0', '4.end') |
| eq(zz.z_in_event(), 'break') |
| expected = [False, True, True, True, False, False, False] |
| actual = self.checklines(text, zz.ztext) |
| eq(expected, actual) |
| |
| text.undo_block_start.assert_called_once() |
| text.undo_block_stop.assert_called_once() |
| |
| def test_z_out_event(self): |
| eq = self.assertEqual |
| zz = self.zz |
| text = zz.text |
| eq(self.zz.ztext, '# ignore #') |
| |
| # Prepend text. |
| text.tag_add('sel', '2.0', '5.end') |
| zz.z_in_event() |
| text.undo_block_start.reset_mock() |
| text.undo_block_stop.reset_mock() |
| |
| # Select a few lines to remove text. |
| text.tag_remove('sel', '1.0', 'end') |
| text.tag_add('sel', '3.0', '4.end') |
| eq(zz.z_out_event(), 'break') |
| expected = [False, True, False, False, True, False, False] |
| actual = self.checklines(text, zz.ztext) |
| eq(expected, actual) |
| |
| text.undo_block_start.assert_called_once() |
| text.undo_block_stop.assert_called_once() |
| |
| def test_roundtrip(self): |
| # Insert and remove to all code should give back original text. |
| zz = self.zz |
| text = zz.text |
| |
| text.tag_add('sel', '1.0', 'end-1c') |
| zz.z_in_event() |
| zz.z_out_event() |
| |
| self.assertEqual(text.get('1.0', 'end-1c'), code_sample) |
| |
| |
| if __name__ == '__main__': |
| unittest.main(verbosity=2) |