Skip to content

[3.12] gh-66819: More IDLE htest updates(2) (GH-112642) #112643

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 3, 2023
Merged
Show file tree
Hide file tree
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
1 change: 1 addition & 0 deletions Lib/idlelib/browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -254,5 +254,6 @@ class Nested_in_closure: pass
if len(sys.argv) == 1: # If pass file on command line, unittest fails.
from unittest import main
main('idlelib.idle_test.test_browser', verbosity=2, exit=False)

from idlelib.idle_test.htest import run
run(_module_browser)
4 changes: 2 additions & 2 deletions Lib/idlelib/debugobj.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ def make_objecttreeitem(labeltext, object, setfunction=None):
return c(labeltext, object, setfunction)


def _object_browser(parent): # htest #
def _debug_object_browser(parent): # htest #
import sys
from tkinter import Toplevel
top = Toplevel(parent)
Expand All @@ -140,4 +140,4 @@ def _object_browser(parent): # htest #
main('idlelib.idle_test.test_debugobj', verbosity=2, exit=False)

from idlelib.idle_test.htest import run
run(_object_browser)
run(_debug_object_browser)
108 changes: 54 additions & 54 deletions Lib/idlelib/idle_test/htest.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@

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.
first parameter of X must be 'parent' or 'master'. When called, the
first argument will be the root window. X must create a child
Toplevel(parent/master) (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
Expand Down Expand Up @@ -117,12 +118,20 @@
'file': 'query',
'kwds': {'title': 'Customize query.py Run',
'_htest': True},
'msg': "Enter with <Return> or [Run]. Print valid entry to Shell\n"
'msg': "Enter with <Return> or [OK]. 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]"
}

_debug_object_browser_spec = {
'file': 'debugobj',
'kwds': {},
'msg': "Double click on items up to the lowest level.\n"
"Attributes of the objects and related information "
"will be displayed side-by-side at each level."
}

# TODO Improve message
_dyn_option_menu_spec = {
'file': 'dynoption',
Expand Down Expand Up @@ -178,7 +187,7 @@
"Any url ('www...', 'http...') is accepted.\n"
"Test Browse with and without path, as cannot unittest.\n"
"[Ok] or <Return> prints valid entry to shell\n"
"[Cancel] or <Escape> prints None to shell"
"<Escape>, [Cancel], or [X] prints None to shell"
}

_io_binding_spec = {
Expand All @@ -199,60 +208,51 @@
'kwds': {},
'msg': textwrap.dedent("""\
1. Click on the line numbers and drag down below the edge of the
window, moving the mouse a bit and then leaving it there for a while.
The text and line numbers should gradually scroll down, with the
selection updated continuously.
window, moving the mouse a bit and then leaving it there for a
while. The text and line numbers should gradually scroll down,
with the selection updated continuously.

2. With the lines still selected, click on a line number above the
selected lines. Only the line whose number was clicked should be
selected.
2. With the lines still selected, click on a line number above
or below the selected lines. Only the line whose number was
clicked should be selected.

3. Repeat step #1, dragging to above the window. The text and line
numbers should gradually scroll up, with the selection updated
continuously.
3. Repeat step #1, dragging to above the window. The text and
line numbers should gradually scroll up, with the selection
updated continuously.

4. Repeat step #2, clicking a line number below the selection."""),
}

_multi_call_spec = {
'file': 'multicall',
'kwds': {},
'msg': "The following actions should trigger a print to console or IDLE"
" Shell.\nEntering and leaving the text area, key entry, "
"<Control-Key>,\n<Alt-Key-a>, <Control-Key-a>, "
"<Alt-Control-Key-a>, \n<Control-Button-1>, <Alt-Button-1> and "
"focusing out of the window\nare sequences to be tested."
'msg': "The following should trigger a print to console or IDLE Shell.\n"
"Entering and leaving the text area, key entry, <Control-Key>,\n"
"<Alt-Key-a>, <Control-Key-a>, <Alt-Control-Key-a>, \n"
"<Control-Button-1>, <Alt-Button-1> and focusing elsewhere."
}

_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."
'msg': textwrap.dedent("""
"Inspect names of module, class(with superclass if applicable),
"methods and functions. Toggle nested items. Double clicking
"on items prints a traceback for an exception that is ignored.""")
}

_multistatus_bar_spec = {
'file': 'statusbar',
'kwds': {},
'msg': "Ensure presence of multi-status bar below text area.\n"
"Click 'Update Status' to change the multi-status text"
}

_object_browser_spec = {
'file': 'debugobj',
'kwds': {},
'msg': "Double click on items up to the lowest level.\n"
"Attributes of the objects and related information "
"will be displayed side-by-side at each level."
"Click 'Update Status' to change the status text"
}

_path_browser_spec = {
PathBrowser_spec = {
'file': 'pathbrowser',
'kwds': {},
'kwds': {'_htest': True},
'msg': "Test for correct display of all paths in sys.path.\n"
"Toggle nested items up to the lowest level.\n"
"Toggle nested items out to the lowest level.\n"
"Double clicking on an item prints a traceback\n"
"for an exception that is ignored."
}
Expand Down Expand Up @@ -367,11 +367,12 @@
}

def run(*tests):
"Run callables in tests."
root = tk.Tk()
root.title('IDLE htest')
root.resizable(0, 0)

# a scrollable Label like constant width text widget.
# A scrollable Label-like constant width text widget.
frameLabel = tk.Frame(root, padx=10)
frameLabel.pack()
text = tk.Text(frameLabel, wrap='word')
Expand All @@ -381,45 +382,44 @@ def run(*tests):
scrollbar.pack(side='right', fill='y', expand=False)
text.pack(side='left', fill='both', expand=True)

test_list = [] # List of tuples of the form (spec, callable widget)
test_list = [] # Make list of (spec, callable) tuples.
if tests:
for test in tests:
test_spec = globals()[test.__name__ + '_spec']
test_spec['name'] = test.__name__
test_list.append((test_spec, test))
else:
for k, d in globals().items():
if k.endswith('_spec'):
test_name = k[:-5]
test_spec = d
for key, dic in globals().items():
if key.endswith('_spec'):
test_name = key[:-5]
test_spec = dic
test_spec['name'] = test_name
mod = import_module('idlelib.' + test_spec['file'])
test = getattr(mod, test_name)
test_list.append((test_spec, test))
test_list.reverse() # So can pop in proper order in next_test.

test_name = tk.StringVar(root)
callable_object = None
test_kwds = None

def next_test():

nonlocal test_name, callable_object, test_kwds
if len(test_list) == 1:
next_button.pack_forget()
test_spec, callable_object = test_list.pop()
test_kwds = test_spec['kwds']
test_kwds['parent'] = root
test_name.set('Test ' + test_spec['name'])

text.configure(state='normal') # enable text editing
text.delete('1.0','end')
text.insert("1.0",test_spec['msg'])
text.configure(state='disabled') # preserve read-only property
text['state'] = 'normal' # Enable text replacement.
text.delete('1.0', 'end')
text.insert("1.0", test_spec['msg'])
text['state'] = 'disabled' # Restore read-only property.

def run_test(_=None):
widget = callable_object(**test_kwds)
widget = callable_object(root, **test_kwds)
try:
print(widget.result)
print(widget.result) # Only true for query classes(?).
except AttributeError:
pass

Expand Down
9 changes: 5 additions & 4 deletions Lib/idlelib/iomenu.py
Original file line number Diff line number Diff line change
Expand Up @@ -396,10 +396,11 @@ def updaterecentfileslist(self,filename):
def _io_binding(parent): # htest #
from tkinter import Toplevel, Text

root = Toplevel(parent)
root.title("Test IOBinding")
top = Toplevel(parent)
top.title("Test IOBinding")
x, y = map(int, parent.geometry().split('+')[1:])
root.geometry("+%d+%d" % (x, y + 175))
top.geometry("+%d+%d" % (x, y + 175))

class MyEditWin:
def __init__(self, text):
self.text = text
Expand All @@ -423,7 +424,7 @@ def saveas(self, event):
def savecopy(self, event):
self.text.event_generate("<<save-copy-of-window-as-file>>")

text = Text(root)
text = Text(top)
text.pack()
text.focus_set()
editwin = MyEditWin(text)
Expand Down
2 changes: 2 additions & 0 deletions Lib/idlelib/multicall.py
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,8 @@ def _multi_call(parent): # htest #
top.geometry("+%d+%d" % (x, y + 175))
text = MultiCallCreator(tkinter.Text)(top)
text.pack()
text.focus_set()

def bindseq(seq, n=[0]):
def handler(event):
print(seq)
Expand Down
6 changes: 1 addition & 5 deletions Lib/idlelib/pathbrowser.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,13 +99,9 @@ def listmodules(self, allnames):
return sorted


def _path_browser(parent): # htest #
PathBrowser(parent, _htest=True)
parent.mainloop()

if __name__ == "__main__":
from unittest import main
main('idlelib.idle_test.test_pathbrowser', verbosity=2, exit=False)

from idlelib.idle_test.htest import run
run(_path_browser)
run(PathBrowser)
2 changes: 1 addition & 1 deletion Lib/idlelib/query.py
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ def create_extra(self):
sticky='we')

def cli_args_ok(self):
"Validity check and parsing for command line arguments."
"Return command line arg list or None if error."
cli_string = self.entry.get().strip()
try:
cli_args = shlex.split(cli_string, posix=True)
Expand Down
6 changes: 3 additions & 3 deletions Lib/idlelib/sidebar.py
Original file line number Diff line number Diff line change
Expand Up @@ -517,13 +517,13 @@ def update_colors(self):
def _linenumbers_drag_scrolling(parent): # htest #
from idlelib.idle_test.test_sidebar import Dummy_editwin

toplevel = tk.Toplevel(parent)
text_frame = tk.Frame(toplevel)
top = tk.Toplevel(parent)
text_frame = tk.Frame(top)
text_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
text_frame.rowconfigure(1, weight=1)
text_frame.columnconfigure(1, weight=1)

font = idleConf.GetFont(toplevel, 'main', 'EditorWindow')
font = idleConf.GetFont(top, 'main', 'EditorWindow')
text = tk.Text(text_frame, width=80, height=24, wrap=tk.NONE, font=font)
text.grid(row=1, column=1, sticky=tk.NSEW)

Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/statusbar.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ def _multistatus_bar(parent): # htest #
x, y = map(int, parent.geometry().split('+')[1:])
top.geometry("+%d+%d" %(x, y + 175))
top.title("Test multistatus bar")

frame = Frame(top)
text = Text(frame, height=5, width=40)
text.pack()
Expand Down