Skip to content

Commit 738d6cb

Browse files
committed
gh-89520: IDLE - Factor out shared test code from zzdummy test files
Create ZZDummyMixin in test_zzdummy.py containing shared test methods (checklines, test_init, test_reload, test_z_in_event, test_z_out_event, test_roundtrip). Both ZZDummyTest classes now inherit from the mixin, eliminating ~90 lines of duplication from test_zzdummy_user.py.
1 parent 4f9e553 commit 738d6cb

2 files changed

Lines changed: 87 additions & 161 deletions

File tree

Lib/idlelib/idle_test/test_zzdummy.py

Lines changed: 57 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -38,38 +38,8 @@ def __init__(self, root, text):
3838
self.text.undo_block_stop = mock.Mock()
3939

4040

41-
class ZZDummyTest(unittest.TestCase):
42-
43-
@classmethod
44-
def setUpClass(cls):
45-
requires('gui')
46-
root = cls.root = Tk()
47-
root.withdraw()
48-
text = cls.text = Text(cls.root)
49-
cls.editor = DummyEditwin(root, text)
50-
zzdummy.idleConf.userCfg = testcfg
51-
52-
@classmethod
53-
def tearDownClass(cls):
54-
zzdummy.idleConf.userCfg = usercfg
55-
del cls.editor, cls.text
56-
cls.root.update_idletasks()
57-
for id in cls.root.tk.call('after', 'info'):
58-
cls.root.after_cancel(id) # Need for EditorWindow.
59-
cls.root.destroy()
60-
del cls.root
61-
62-
def setUp(self):
63-
text = self.text
64-
text.insert('1.0', code_sample)
65-
text.undo_block_start.reset_mock()
66-
text.undo_block_stop.reset_mock()
67-
zz = self.zz = zzdummy.ZzDummy(self.editor)
68-
zzdummy.ZzDummy.ztext = '# ignore #'
69-
70-
def tearDown(self):
71-
self.text.delete('1.0', 'end')
72-
del self.zz
41+
class ZZDummyMixin:
42+
"""Shared tests for ZzDummy with default and user configs."""
7343

7444
def checklines(self, text, value):
7545
# Verify that there are lines being checked.
@@ -82,33 +52,15 @@ def checklines(self, text, value):
8252
actual.append(txt.startswith(value))
8353
return actual
8454

85-
def test_exists(self):
86-
self.assertEqual(zzdummy.idleConf.GetSectionList('user', 'extensions'), [])
87-
self.assertEqual(zzdummy.idleConf.GetSectionList('default', 'extensions'), ['AutoComplete', 'CodeContext', 'FormatParagraph', 'ParenMatch', 'ZzDummy', 'ZzDummy_cfgBindings', 'ZzDummy_bindings'])
88-
self.assertIn("ZzDummy", zzdummy.idleConf.GetExtensions(False))
89-
self.assertNotIn("ZzDummy", zzdummy.idleConf.GetExtensions())
90-
self.assertEqual(zzdummy.idleConf.GetExtensionKeys("ZzDummy"), {})
91-
self.assertEqual(zzdummy.idleConf.GetExtensionBindings("ZzDummy"), {'<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
92-
93-
def test_exists_user(self):
94-
zzdummy.idleConf.userCfg["extensions"].read_dict({
95-
"ZzDummy": {'enable': 'True'}
96-
})
97-
self.assertEqual(zzdummy.idleConf.GetSectionList('user', 'extensions'), ["ZzDummy"])
98-
self.assertIn("ZzDummy", zzdummy.idleConf.GetExtensions())
99-
self.assertEqual(zzdummy.idleConf.GetExtensionKeys("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>']})
100-
self.assertEqual(zzdummy.idleConf.GetExtensionBindings("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>'], '<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
101-
# Restore
102-
zzdummy.idleConf.userCfg["extensions"].remove_section("ZzDummy")
103-
10455
def test_init(self):
10556
zz = self.zz
10657
self.assertEqual(zz.editwin, self.editor)
10758
self.assertEqual(zz.text, self.editor.text)
10859

10960
def test_reload(self):
11061
self.assertEqual(self.zz.ztext, '# ignore #')
111-
testcfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam')
62+
zzdummy.idleConf.userCfg['extensions'].SetOption(
63+
'ZzDummy', 'z-text', 'spam')
11264
zzdummy.ZzDummy.reload()
11365
self.assertEqual(self.zz.ztext, 'spam')
11466

@@ -167,5 +119,58 @@ def test_roundtrip(self):
167119
self.assertEqual(text.get('1.0', 'end-1c'), code_sample)
168120

169121

122+
class ZZDummyTest(ZZDummyMixin, unittest.TestCase):
123+
124+
@classmethod
125+
def setUpClass(cls):
126+
requires('gui')
127+
root = cls.root = Tk()
128+
root.withdraw()
129+
text = cls.text = Text(cls.root)
130+
cls.editor = DummyEditwin(root, text)
131+
zzdummy.idleConf.userCfg = testcfg
132+
133+
@classmethod
134+
def tearDownClass(cls):
135+
zzdummy.idleConf.userCfg = usercfg
136+
del cls.editor, cls.text
137+
cls.root.update_idletasks()
138+
for id in cls.root.tk.call('after', 'info'):
139+
cls.root.after_cancel(id) # Need for EditorWindow.
140+
cls.root.destroy()
141+
del cls.root
142+
143+
def setUp(self):
144+
text = self.text
145+
text.insert('1.0', code_sample)
146+
text.undo_block_start.reset_mock()
147+
text.undo_block_stop.reset_mock()
148+
zz = self.zz = zzdummy.ZzDummy(self.editor)
149+
zzdummy.ZzDummy.ztext = '# ignore #'
150+
151+
def tearDown(self):
152+
self.text.delete('1.0', 'end')
153+
del self.zz
154+
155+
def test_exists(self):
156+
self.assertEqual(zzdummy.idleConf.GetSectionList('user', 'extensions'), [])
157+
self.assertEqual(zzdummy.idleConf.GetSectionList('default', 'extensions'), ['AutoComplete', 'CodeContext', 'FormatParagraph', 'ParenMatch', 'ZzDummy', 'ZzDummy_cfgBindings', 'ZzDummy_bindings'])
158+
self.assertIn("ZzDummy", zzdummy.idleConf.GetExtensions(False))
159+
self.assertNotIn("ZzDummy", zzdummy.idleConf.GetExtensions())
160+
self.assertEqual(zzdummy.idleConf.GetExtensionKeys("ZzDummy"), {})
161+
self.assertEqual(zzdummy.idleConf.GetExtensionBindings("ZzDummy"), {'<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
162+
163+
def test_exists_user(self):
164+
zzdummy.idleConf.userCfg["extensions"].read_dict({
165+
"ZzDummy": {'enable': 'True'}
166+
})
167+
self.assertEqual(zzdummy.idleConf.GetSectionList('user', 'extensions'), ["ZzDummy"])
168+
self.assertIn("ZzDummy", zzdummy.idleConf.GetExtensions())
169+
self.assertEqual(zzdummy.idleConf.GetExtensionKeys("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>']})
170+
self.assertEqual(zzdummy.idleConf.GetExtensionBindings("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>'], '<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
171+
# Restore
172+
zzdummy.idleConf.userCfg["extensions"].remove_section("ZzDummy")
173+
174+
170175
if __name__ == '__main__':
171176
unittest.main(verbosity=2)

Lib/idlelib/idle_test/test_zzdummy_user.py

Lines changed: 30 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
"Test zzdummy, coverage 100%."
1+
"Test zzdummy with user config, coverage 100%."
22

33
from idlelib import zzdummy
44
import unittest
55
from test.support import requires
66
from tkinter import Tk, Text
7-
from unittest import mock
87
from idlelib import config
9-
from idlelib import editor
10-
from idlelib import format
8+
9+
from idlelib.idle_test.test_zzdummy import (
10+
ZZDummyMixin, DummyEditwin, code_sample,
11+
)
1112

1213

1314
real_usercfg = zzdummy.idleConf.userCfg
@@ -18,9 +19,12 @@
1819
'extensions': config.IdleUserConfParser(''),
1920
}
2021
test_usercfg["extensions"].read_dict({
21-
"ZzDummy": {'enable': 'True', 'enable_shell': 'False', 'enable_editor': 'True', 'z-text': 'Z'},
22-
"ZzDummy_cfgBindings": {'z-in': '<Control-Shift-KeyRelease-Insert>'},
23-
"ZzDummy_bindings": {'z-out': '<Control-Shift-KeyRelease-Delete>'},
22+
"ZzDummy": {'enable': 'True', 'enable_shell': 'False',
23+
'enable_editor': 'True', 'z-text': 'Z'},
24+
"ZzDummy_cfgBindings": {
25+
'z-in': '<Control-Shift-KeyRelease-Insert>'},
26+
"ZzDummy_bindings": {
27+
'z-out': '<Control-Shift-KeyRelease-Delete>'},
2428
})
2529
real_defaultcfg = zzdummy.idleConf.defaultCfg
2630
test_defaultcfg = {
@@ -33,7 +37,8 @@
3337
"AutoComplete": {'popupwait': '2000'},
3438
"CodeContext": {'maxlines': '15'},
3539
"FormatParagraph": {'max-width': '72'},
36-
"ParenMatch": {'style': 'expression', 'flash-delay': '500', 'bell': 'True'},
40+
"ParenMatch": {'style': 'expression',
41+
'flash-delay': '500', 'bell': 'True'},
3742
})
3843
test_defaultcfg["main"].read_dict({
3944
"Theme": {"default": 1, "name": "IDLE Classic", "name2": ""},
@@ -43,28 +48,9 @@
4348
real_default = real_defaultcfg[key]
4449
value = {name: dict(real_default[name]) for name in real_default}
4550
test_defaultcfg[key].read_dict(value)
46-
code_sample = """\
47-
48-
class C1:
49-
# Class comment.
50-
def __init__(self, a, b):
51-
self.a = a
52-
self.b = b
53-
"""
54-
5551

56-
class DummyEditwin:
57-
get_selection_indices = editor.EditorWindow.get_selection_indices
58-
def __init__(self, root, text):
59-
self.root = root
60-
self.top = root
61-
self.text = text
62-
self.fregion = format.FormatRegion(self)
63-
self.text.undo_block_start = mock.Mock()
64-
self.text.undo_block_stop = mock.Mock()
6552

66-
67-
class ZZDummyTest(unittest.TestCase):
53+
class ZZDummyTest(ZZDummyMixin, unittest.TestCase):
6854

6955
@classmethod
7056
def setUpClass(cls):
@@ -99,88 +85,23 @@ def tearDown(self):
9985
self.text.delete('1.0', 'end')
10086
del self.zz
10187

102-
def checklines(self, text, value):
103-
# Verify that there are lines being checked.
104-
end_line = int(float(text.index('end')))
105-
106-
# Check each line for the starting text.
107-
actual = []
108-
for line in range(1, end_line):
109-
txt = text.get(f'{line}.0', f'{line}.end')
110-
actual.append(txt.startswith(value))
111-
return actual
112-
11388
def test_exists(self):
114-
self.assertEqual(zzdummy.idleConf.GetSectionList('user', 'extensions'), ['ZzDummy', 'ZzDummy_cfgBindings', 'ZzDummy_bindings'])
115-
self.assertEqual(zzdummy.idleConf.GetSectionList('default', 'extensions'), ['AutoComplete', 'CodeContext', 'FormatParagraph', 'ParenMatch'])
116-
self.assertIn("ZzDummy", zzdummy.idleConf.GetExtensions())
117-
self.assertEqual(zzdummy.idleConf.GetExtensionKeys("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>']})
118-
self.assertEqual(zzdummy.idleConf.GetExtensionBindings("ZzDummy"), {'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>'], '<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
119-
120-
def test_init(self):
121-
zz = self.zz
122-
self.assertEqual(zz.editwin, self.editor)
123-
self.assertEqual(zz.text, self.editor.text)
124-
125-
def test_reload(self):
126-
self.assertEqual(self.zz.ztext, '# ignore #')
127-
test_usercfg['extensions'].SetOption('ZzDummy', 'z-text', 'spam')
128-
zzdummy.ZzDummy.reload()
129-
self.assertEqual(self.zz.ztext, 'spam')
130-
131-
def test_z_in_event(self):
132-
eq = self.assertEqual
133-
zz = self.zz
134-
text = zz.text
135-
eq(self.zz.ztext, '# ignore #')
136-
137-
# No lines have the leading text.
138-
expected = [False, False, False, False, False, False, False]
139-
actual = self.checklines(text, zz.ztext)
140-
eq(expected, actual)
141-
142-
text.tag_add('sel', '2.0', '4.end')
143-
eq(zz.z_in_event(), 'break')
144-
expected = [False, True, True, True, False, False, False]
145-
actual = self.checklines(text, zz.ztext)
146-
eq(expected, actual)
147-
148-
text.undo_block_start.assert_called_once()
149-
text.undo_block_stop.assert_called_once()
150-
151-
def test_z_out_event(self):
152-
eq = self.assertEqual
153-
zz = self.zz
154-
text = zz.text
155-
eq(self.zz.ztext, '# ignore #')
156-
157-
# Prepend text.
158-
text.tag_add('sel', '2.0', '5.end')
159-
zz.z_in_event()
160-
text.undo_block_start.reset_mock()
161-
text.undo_block_stop.reset_mock()
162-
163-
# Select a few lines to remove text.
164-
text.tag_remove('sel', '1.0', 'end')
165-
text.tag_add('sel', '3.0', '4.end')
166-
eq(zz.z_out_event(), 'break')
167-
expected = [False, True, False, False, True, False, False]
168-
actual = self.checklines(text, zz.ztext)
169-
eq(expected, actual)
170-
171-
text.undo_block_start.assert_called_once()
172-
text.undo_block_stop.assert_called_once()
173-
174-
def test_roundtrip(self):
175-
# Insert and remove to all code should give back original text.
176-
zz = self.zz
177-
text = zz.text
178-
179-
text.tag_add('sel', '1.0', 'end-1c')
180-
zz.z_in_event()
181-
zz.z_out_event()
182-
183-
self.assertEqual(text.get('1.0', 'end-1c'), code_sample)
89+
self.assertEqual(
90+
zzdummy.idleConf.GetSectionList('user', 'extensions'),
91+
['ZzDummy', 'ZzDummy_cfgBindings', 'ZzDummy_bindings'])
92+
self.assertEqual(
93+
zzdummy.idleConf.GetSectionList('default', 'extensions'),
94+
['AutoComplete', 'CodeContext', 'FormatParagraph',
95+
'ParenMatch'])
96+
self.assertIn("ZzDummy",
97+
zzdummy.idleConf.GetExtensions())
98+
self.assertEqual(
99+
zzdummy.idleConf.GetExtensionKeys("ZzDummy"),
100+
{'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>']})
101+
self.assertEqual(
102+
zzdummy.idleConf.GetExtensionBindings("ZzDummy"),
103+
{'<<z-in>>': ['<Control-Shift-KeyRelease-Insert>'],
104+
'<<z-out>>': ['<Control-Shift-KeyRelease-Delete>']})
184105

185106

186107
if __name__ == '__main__':

0 commit comments

Comments
 (0)