gh-66819: More IDLE htest updates (#112574)

Revise htest.py docstring and move 2 specs to alphabetical position.
This commit is contained in:
Terry Jan Reedy 2023-12-01 02:02:31 -05:00 committed by GitHub
parent 5b0629966f
commit e44f1940bd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,38 +1,35 @@
'''Run human tests of Idle's window, dialog, and popup widgets.
"""Run human tests of Idle's window, dialog, and popup widgets.
run(*tests)
Create a master Tk window. Within that, run each callable in tests
after finding the matching test spec in this file. If tests is empty,
run an htest for each spec dict in this file after finding the matching
callable in the module named in the spec. Close the window to skip or
end the test.
run(*tests) Create a master Tk() htest window. Within that, run each
callable in tests after finding the matching test spec in this file. If
tests is empty, run an htest for each spec dict in this file after
finding the matching callable in the module named in the spec. Close
the master window to end testing.
In a tested module, let X be a global name bound to a callable (class
or function) whose .__name__ attribute is also X (the usual situation).
The first parameter of X must be 'parent'. When called, the parent
argument will be the root window. X must create a child Toplevel
window (or subclass thereof). The Toplevel may be a test widget or
dialog, in which case the callable is the corresponding class. Or the
Toplevel may contain the widget to be tested or set up a context in
which a test widget is invoked. In this latter case, the callable is a
wrapper function that sets up the Toplevel and other objects. Wrapper
function names, such as _editor_window', should start with '_'.
In a tested module, let X be a global name bound to a callable (class or
function) whose .__name__ attribute is also X (the usual situation). The
first parameter of X must be 'parent'. When called, the parent argument
will be the root window. X must create a child Toplevel(parent) window
(or subclass thereof). The Toplevel may be a test widget or dialog, in
which case the callable is the corresponding class. Or the Toplevel may
contain the widget to be tested or set up a context in which a test
widget is invoked. In this latter case, the callable is a wrapper
function that sets up the Toplevel and other objects. Wrapper function
names, such as _editor_window', should start with '_' and be lowercase.
End the module with
if __name__ == '__main__':
<unittest, if there is one>
<run unittest.main with 'exit=False'>
from idlelib.idle_test.htest import run
run(X)
run(callable) # There could be multiple comma-separated callables.
To have wrapper functions and test invocation code ignored by coveragepy
reports, put '# htest #' on the def statement header line.
def _wrapper(parent): # htest #
Also make sure that the 'if __name__' line matches the above. Then have
make sure that .coveragerc includes the following.
To have wrapper functions ignored by coverage reports, tag the def
header like so: "def _wrapper(parent): # htest #". Use the same tag
for htest lines in widget code. Make sure that the 'if __name__' line
matches the above. Then have make sure that .coveragerc includes the
following:
[report]
exclude_lines =
@ -46,7 +43,7 @@ def _wrapper(parent): # htest #
following template, with X.__name__ prepended to '_spec'.
When all tests are run, the prefix is use to get X.
_spec = {
callable_spec = {
'file': '',
'kwds': {'title': ''},
'msg': ""
@ -54,16 +51,16 @@ def _wrapper(parent): # htest #
file (no .py): run() imports file.py.
kwds: augmented with {'parent':root} and passed to X as **kwds.
title: an example kwd; some widgets need this, delete if not.
title: an example kwd; some widgets need this, delete line if not.
msg: master window hints about testing the widget.
Modules and classes not being tested at the moment:
pyshell.PyShellEditorWindow
debugger.Debugger
autocomplete_w.AutoCompleteWindow
outwin.OutputWindow (indirectly being tested with grep test)
'''
TODO test these modules and classes:
autocomplete_w.AutoCompleteWindow
debugger.Debugger
outwin.OutputWindow (indirectly being tested with grep test)
pyshell.PyShellEditorWindow
"""
import idlelib.pyshell # Set Windows DPI awareness before Tk().
from importlib import import_module
@ -91,15 +88,6 @@ def _wrapper(parent): # htest #
"Force-open-calltip does not work here.\n"
}
_module_browser_spec = {
'file': 'browser',
'kwds': {},
'msg': "Inspect names of module, class(with superclass if "
"applicable), methods and functions.\nToggle nested items.\n"
"Double clicking on items prints a traceback for an exception "
"that is ignored."
}
_color_delegator_spec = {
'file': 'colorizer',
'kwds': {},
@ -109,16 +97,6 @@ def _wrapper(parent): # htest #
"The default color scheme is in idlelib/config-highlight.def"
}
CustomRun_spec = {
'file': 'query',
'kwds': {'title': 'Customize query.py Run',
'_htest': True},
'msg': "Enter with <Return> or [Run]. Print valid entry to Shell\n"
"Arguments are parsed into a list\n"
"Mode is currently restart True or False\n"
"Close dialog with valid entry, <Escape>, [Cancel], [X]"
}
ConfigDialog_spec = {
'file': 'configdialog',
'kwds': {'title': 'ConfigDialogTest',
@ -135,6 +113,16 @@ def _wrapper(parent): # htest #
"changes made have persisted."
}
CustomRun_spec = {
'file': 'query',
'kwds': {'title': 'Customize query.py Run',
'_htest': True},
'msg': "Enter with <Return> or [Run]. Print valid entry to Shell\n"
"Arguments are parsed into a list\n"
"Mode is currently restart True or False\n"
"Close dialog with valid entry, <Escape>, [Cancel], [X]"
}
# TODO Improve message
_dyn_option_menu_spec = {
'file': 'dynoption',
@ -236,6 +224,15 @@ def _wrapper(parent): # htest #
"focusing out of the window\nare sequences to be tested."
}
_module_browser_spec = {
'file': 'browser',
'kwds': {},
'msg': "Inspect names of module, class(with superclass if "
"applicable), methods and functions.\nToggle nested items.\n"
"Double clicking on items prints a traceback for an exception "
"that is ignored."
}
_multistatus_bar_spec = {
'file': 'statusbar',
'kwds': {},