mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #18104: Add idlelib/idle_test/htest.py with a few sample tests to begin
consolidating and improving human-validated tests of Idle. Change other files as needed to work with htest. Running the module as __main__ runs all tests.
This commit is contained in:
parent
23a192d963
commit
06313b79d5
4 changed files with 114 additions and 32 deletions
91
Lib/idlelib/idle_test/htest.py
Normal file
91
Lib/idlelib/idle_test/htest.py
Normal file
|
@ -0,0 +1,91 @@
|
|||
'''Run a human test of Idle wndow, dialog, and other widget classes.
|
||||
|
||||
run(klass) runs a test for one class.
|
||||
runall() runs all the defined tests
|
||||
|
||||
The file wih the widget class should end with
|
||||
if __name__ == '__main__':
|
||||
<unittest, if there is one>
|
||||
from idlelib.idle_test.htest import run
|
||||
run(X)
|
||||
where X is a global object of the module. X must be a callable with a
|
||||
.__name__ attribute that accepts a 'parent' attribute. X will usually be
|
||||
a widget class, but a callable instance with .__name__ or a wrapper
|
||||
function also work. The name of wrapper functions, like _Editor_Window,
|
||||
should start with '_'.
|
||||
|
||||
This file must then contain an instance of this template.
|
||||
_spec = {
|
||||
'file': '',
|
||||
'kwds': {'title': ''},
|
||||
'msg': ""
|
||||
}
|
||||
with X.__name__ prepended to _spec.
|
||||
File (no .py) is used in runall() to import the file and get the class.
|
||||
Kwds is passed to X (**kwds) after 'parent' is added, to initialize X.
|
||||
Msg. displayed is a window with a start button. hint as to how the user
|
||||
might test the widget. Closing The box skips or ends the test.
|
||||
'''
|
||||
from importlib import import_module
|
||||
import tkinter as tk
|
||||
|
||||
# Template for class_spec dicts, copy and uncomment
|
||||
|
||||
_Editor_window_spec = {
|
||||
'file': 'EditorWindow',
|
||||
'kwds': {},
|
||||
'msg': "Test editor functions of interest"
|
||||
}
|
||||
|
||||
_Help_dialog_spec = {
|
||||
'file': 'EditorWindow',
|
||||
'kwds': {},
|
||||
'msg': "If the help text displays, this works"
|
||||
}
|
||||
|
||||
AboutDialog_spec = {
|
||||
'file': 'aboutDialog',
|
||||
'kwds': {'title': 'About test'},
|
||||
'msg': "Try each button"
|
||||
}
|
||||
|
||||
|
||||
GetCfgSectionNameDialog_spec = {
|
||||
'file': 'configSectionNameDialog',
|
||||
'kwds': {'title':'Get Name',
|
||||
'message':'Enter something',
|
||||
'used_names': {'abc'},
|
||||
'_htest': True},
|
||||
'msg': "After the text entered with [Ok] is stripped, <nothing>, "
|
||||
"'abc', or more that 30 chars are errors.\n"
|
||||
"Close 'Get Name' with a valid entry (printed to Shell), [Cancel], or [X]",
|
||||
}
|
||||
|
||||
def run(klas):
|
||||
"Test the widget class klas using _spec dict"
|
||||
root = tk.Tk()
|
||||
klas_spec = globals()[klas.__name__+'_spec']
|
||||
klas_kwds = klas_spec['kwds']
|
||||
klas_kwds['parent'] = root
|
||||
# This presumes that Idle consistently uses 'parent'
|
||||
def run_klas():
|
||||
widget = klas(**klas_kwds)
|
||||
try:
|
||||
print(widget.result)
|
||||
except AttributeError:
|
||||
pass
|
||||
tk.Label(root, text=klas_spec['msg'], justify='left').pack()
|
||||
tk.Button(root, text='Test ' + klas.__name__, command=run_klas).pack()
|
||||
root.mainloop()
|
||||
|
||||
def runall():
|
||||
'Run all tests. Quick and dirty version.'
|
||||
for k, d in globals().items():
|
||||
if k.endswith('_spec'):
|
||||
mod = import_module('idlelib.' + d['file'])
|
||||
klas = getattr(mod, k[:-5])
|
||||
run(klas)
|
||||
|
||||
if __name__ == '__main__':
|
||||
runall()
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue