Skip to content

gh-66819: More IDLE htest updates #112574

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 1, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 52 additions & 55 deletions Lib/idlelib/idle_test/htest.py
Original file line number Diff line number Diff line change
@@ -1,38 +1,35 @@
'''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.

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 '_'.
"""Run human tests of Idle's window, dialog, and popup widgets.

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(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 =
Expand All @@ -46,24 +43,24 @@ 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': ""
}

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
Expand Down Expand Up @@ -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': {},
Expand All @@ -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',
Expand All @@ -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',
Expand Down Expand Up @@ -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': {},
Expand Down