Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit ee5ef30

Browse files
authoredJun 15, 2018
bpo-33855: Minimally test all IDLE modules. (pythonGH-7689)
Create a template for minimally testing a tkinter-using module by importing it and instantiating its class(es). Add a test file for all non-startup IDLE modules. Edit existing files and update coverage. This is part 1 of 3, covering the 21 autocomplete to help modules and touching 33 idlelib files.
1 parent 6c5a4b3 commit ee5ef30

34 files changed

+420
-106
lines changed
 

‎Lib/idlelib/autocomplete.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,6 @@ def get_entity(self, name):
226226

227227
AutoComplete.reload()
228228

229-
230229
if __name__ == '__main__':
231230
from unittest import main
232231
main('idlelib.idle_test.test_autocomplete', verbosity=2)

‎Lib/idlelib/autocomplete_w.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,3 +458,10 @@ def hide_window(self):
458458
self.listbox = None
459459
self.autocompletewindow.destroy()
460460
self.autocompletewindow = None
461+
462+
463+
if __name__ == '__main__':
464+
from unittest import main
465+
main('idlelib.idle_test.test_autocomplete_w', verbosity=2, exit=False)
466+
467+
# TODO: autocomplete/w htest here

‎Lib/idlelib/calltip_w.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ def calltip_hide(event):
159159
text.bind("<<calltip-hide>>", calltip_hide)
160160
text.focus_set()
161161

162-
if __name__=='__main__':
162+
if __name__ == '__main__':
163+
from unittest import main
164+
main('idlelib.idle_test.test_calltips', verbosity=2, exit=False)
165+
163166
from idlelib.idle_test.htest import run
164167
run(_calltip_window)

‎Lib/idlelib/colorizer.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -286,9 +286,8 @@ def _color_delegator(parent): # htest #
286286
p.insertfilter(d)
287287

288288
if __name__ == "__main__":
289-
import unittest
290-
unittest.main('idlelib.idle_test.test_colorizer',
291-
verbosity=2, exit=False)
289+
from unittest import main
290+
main('idlelib.idle_test.test_colorizer', verbosity=2, exit=False)
292291

293292
from idlelib.idle_test.htest import run
294293
run(_color_delegator)

‎Lib/idlelib/debugger.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
class Idb(bdb.Bdb):
1313

1414
def __init__(self, gui):
15-
self.gui = gui
15+
self.gui = gui # An instance of Debugger or proxy of remote.
1616
bdb.Bdb.__init__(self)
1717

1818
def user_line(self, frame):
@@ -63,7 +63,7 @@ def __init__(self, pyshell, idb=None):
6363
if idb is None:
6464
idb = Idb(self)
6565
self.pyshell = pyshell
66-
self.idb = idb
66+
self.idb = idb # If passed, a proxy of remote instance.
6767
self.frame = None
6868
self.make_gui()
6969
self.interacting = 0
@@ -542,3 +542,9 @@ def load_dict(self, dict, force=0, rpc_client=None):
542542

543543
def close(self):
544544
self.frame.destroy()
545+
546+
if __name__ == "__main__":
547+
from unittest import main
548+
main('idlelib.idle_test.test_debugger', verbosity=2, exit=False)
549+
550+
# TODO: htest?

‎Lib/idlelib/debugger_r.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,3 +386,8 @@ def restart_subprocess_debugger(rpcclt):
386386
idb_adap_oid_ret = rpcclt.remotecall("exec", "start_the_debugger",\
387387
(gui_adap_oid,), {})
388388
assert idb_adap_oid_ret == idb_adap_oid, 'Idb restarted with different oid'
389+
390+
391+
if __name__ == "__main__":
392+
from unittest import main
393+
main('idlelib.idle_test.test_debugger', verbosity=2, exit=False)

‎Lib/idlelib/debugobj.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def GetSubList(self):
7171

7272
class AtomicObjectTreeItem(ObjectTreeItem):
7373
def IsExpandable(self):
74-
return 0
74+
return False
7575

7676
class SequenceTreeItem(ObjectTreeItem):
7777
def IsExpandable(self):
@@ -135,5 +135,8 @@ def _object_browser(parent): # htest #
135135
node.update()
136136

137137
if __name__ == '__main__':
138+
from unittest import main
139+
main('idlelib.idle_test.test_debugobj', verbosity=2, exit=False)
140+
138141
from idlelib.idle_test.htest import run
139142
run(_object_browser)

‎Lib/idlelib/debugobj_r.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,8 @@ def __getattr__(self, name):
3434
def _GetSubList(self):
3535
sub_list = self.sockio.remotecall(self.oid, "_GetSubList", (), {})
3636
return [StubObjectTreeItem(self.sockio, oid) for oid in sub_list]
37+
38+
39+
if __name__ == '__main__':
40+
from unittest import main
41+
main('idlelib.idle_test.test_debugobj_r', verbosity=2)

‎Lib/idlelib/editor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1706,8 +1706,8 @@ def _editor_window(parent): # htest #
17061706
# edit.text.bind("<<close-window>>", edit.close_event)
17071707

17081708
if __name__ == '__main__':
1709-
import unittest
1710-
unittest.main('idlelib.idle_test.test_editor', verbosity=2, exit=False)
1709+
from unittest import main
1710+
main('idlelib.idle_test.test_editor', verbosity=2, exit=False)
17111711

17121712
from idlelib.idle_test.htest import run
17131713
run(_editor_window)

‎Lib/idlelib/filelist.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import os
1+
"idlelib.filelist"
22

3-
from tkinter import *
4-
import tkinter.messagebox as tkMessageBox
3+
import os
4+
from tkinter import messagebox as tkMessageBox
55

66

77
class FileList:
@@ -111,7 +111,8 @@ def canonize(self, filename):
111111
return os.path.normpath(filename)
112112

113113

114-
def _test():
114+
def _test(): # TODO check and convert to htest
115+
from tkinter import Tk
115116
from idlelib.editor import fixwordbreaks
116117
from idlelib.run import fix_scaling
117118
import sys
@@ -120,13 +121,12 @@ def _test():
120121
fixwordbreaks(root)
121122
root.withdraw()
122123
flist = FileList(root)
123-
if sys.argv[1:]:
124-
for filename in sys.argv[1:]:
125-
flist.open(filename)
126-
else:
127-
flist.new()
124+
flist.new()
128125
if flist.inversedict:
129126
root.mainloop()
130127

131128
if __name__ == '__main__':
132-
_test()
129+
from unittest import main
130+
main('idlelib.idle_test.test_filelist', verbosity=2)
131+
132+
# _test()

‎Lib/idlelib/grep.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ def show_grep_dialog():
193193
button.pack()
194194

195195
if __name__ == "__main__":
196-
import unittest
197-
unittest.main('idlelib.idle_test.test_grep', verbosity=2, exit=False)
196+
from unittest import main
197+
main('idlelib.idle_test.test_grep', verbosity=2, exit=False)
198198

199199
from idlelib.idle_test.htest import run
200200
run(_grep_dialog)

‎Lib/idlelib/help.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,5 +271,8 @@ def show_idlehelp(parent):
271271
HelpWindow(parent, filename, 'IDLE Help (%s)' % python_version())
272272

273273
if __name__ == '__main__':
274+
from unittest import main
275+
main('idlelib.idle_test.test_help', verbosity=2, exit=False)
276+
274277
from idlelib.idle_test.htest import run
275278
run(show_idlehelp)

‎Lib/idlelib/idle_test/template.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"Test , coverage %."
2+
3+
from idlelib import
4+
import unittest
5+
from test.support import requires
6+
from tkinter import Tk
7+
8+
9+
class Test(unittest.TestCase):
10+
11+
@classmethod
12+
def setUpClass(cls):
13+
requires('gui')
14+
cls.root = Tk()
15+
cls.root.withdraw()
16+
17+
@classmethod
18+
def tearDownClass(cls):
19+
cls.root.update_idletasks()
20+
## for id in cls.root.tk.call('after', 'info'):
21+
## cls.root.after_cancel(id) # Need for EditorWindow.
22+
cls.root.destroy()
23+
del cls.root
24+
25+
def test_init(self):
26+
self.assert
27+
28+
29+
if __name__ == '__main__':
30+
unittest.main(verbosity=2)

‎Lib/idlelib/idle_test/test_autocomplete.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
''' Test autocomplete and autocomple_w
1+
"Test autocomplete, coverage 57%."
22

3-
Coverage of autocomple: 56%
4-
'''
53
import unittest
64
from test.support import requires
75
from tkinter import Tk, Text
@@ -11,9 +9,6 @@
119
from idlelib.idle_test.mock_idle import Func
1210
from idlelib.idle_test.mock_tk import Event
1311

14-
class AutoCompleteWindow:
15-
def complete():
16-
return
1712

1813
class DummyEditwin:
1914
def __init__(self, root, text):
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
"Test autocomplete_w, coverage 11%."
2+
3+
import unittest
4+
from test.support import requires
5+
from tkinter import Tk, Text
6+
7+
import idlelib.autocomplete_w as acw
8+
9+
10+
class AutoCompleteWindowTest(unittest.TestCase):
11+
12+
@classmethod
13+
def setUpClass(cls):
14+
requires('gui')
15+
cls.root = Tk()
16+
cls.root.withdraw()
17+
cls.text = Text(cls.root)
18+
cls.acw = acw.AutoCompleteWindow(cls.text)
19+
20+
@classmethod
21+
def tearDownClass(cls):
22+
del cls.text, cls.acw
23+
cls.root.update_idletasks()
24+
cls.root.destroy()
25+
del cls.root
26+
27+
def test_init(self):
28+
self.assertEqual(self.acw.widget, self.text)
29+
30+
31+
if __name__ == '__main__':
32+
unittest.main(verbosity=2)

‎Lib/idlelib/idle_test/test_autoexpand.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
"""Unit tests for idlelib.autoexpand"""
1+
"Test autoexpand, coverage 100%."
2+
3+
from idlelib.autoexpand import AutoExpand
24
import unittest
35
from test.support import requires
46
from tkinter import Text, Tk
5-
#from idlelib.idle_test.mock_tk import Text
6-
from idlelib.autoexpand import AutoExpand
77

88

99
class Dummy_Editwin:
@@ -15,15 +15,27 @@ class AutoExpandTest(unittest.TestCase):
1515

1616
@classmethod
1717
def setUpClass(cls):
18-
if 'tkinter' in str(Text):
19-
requires('gui')
20-
cls.tk = Tk()
21-
cls.text = Text(cls.tk)
22-
else:
23-
cls.text = Text()
18+
requires('gui')
19+
cls.tk = Tk()
20+
cls.text = Text(cls.tk)
2421
cls.auto_expand = AutoExpand(Dummy_Editwin(cls.text))
2522
cls.auto_expand.bell = lambda: None
2623

24+
# If mock_tk.Text._decode understood indexes 'insert' with suffixed 'linestart',
25+
# 'wordstart', and 'lineend', used by autoexpand, we could use the following
26+
# to run these test on non-gui machines (but check bell).
27+
## try:
28+
## requires('gui')
29+
## #raise ResourceDenied() # Uncomment to test mock.
30+
## except ResourceDenied:
31+
## from idlelib.idle_test.mock_tk import Text
32+
## cls.text = Text()
33+
## cls.text.bell = lambda: None
34+
## else:
35+
## from tkinter import Tk, Text
36+
## cls.tk = Tk()
37+
## cls.text = Text(cls.tk)
38+
2739
@classmethod
2840
def tearDownClass(cls):
2941
del cls.text, cls.auto_expand

‎Lib/idlelib/idle_test/test_browser.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,16 @@
1-
""" Test idlelib.browser.
1+
"Test browser, coverage 90%."
22

3-
Coverage: 88%
4-
(Higher, because should exclude 3 lines that .coveragerc won't exclude.)
5-
"""
3+
from idlelib import browser
4+
from test.support import requires
5+
import unittest
6+
from unittest import mock
7+
from idlelib.idle_test.mock_idle import Func
68

79
from collections import deque
810
import os.path
911
import pyclbr
1012
from tkinter import Tk
1113

12-
from test.support import requires
13-
import unittest
14-
from unittest import mock
15-
from idlelib.idle_test.mock_idle import Func
16-
17-
from idlelib import browser
1814
from idlelib import filelist
1915
from idlelib.tree import TreeNode
2016

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
"Test calltip_w, coverage 18%."
2+
3+
from idlelib import calltip_w
4+
import unittest
5+
from test.support import requires
6+
from tkinter import Tk, Text
7+
8+
9+
class CallTipTest(unittest.TestCase):
10+
11+
@classmethod
12+
def setUpClass(cls):
13+
requires('gui')
14+
cls.root = Tk()
15+
cls.root.withdraw()
16+
cls.text = Text(cls.root)
17+
cls.calltip = calltip_w.CallTip(cls.text)
18+
19+
@classmethod
20+
def tearDownClass(cls):
21+
cls.root.update_idletasks()
22+
cls.root.destroy()
23+
del cls.text, cls.root
24+
25+
def test_init(self):
26+
self.assertEqual(self.calltip.widget, self.text)
27+
28+
if __name__ == '__main__':
29+
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)
Please sign in to comment.