From a2fc99eceae7b3dacc1e7280cc01c3b877ce55ab Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Sun, 25 May 2014 18:44:05 -0400 Subject: Issue #21477: Idle htest: modify run; add more tests. Patch by Saimadhav Heblikar. 2.7 version will follow. --- Lib/idlelib/ClassBrowser.py | 2 +- Lib/idlelib/ColorDelegator.py | 6 +-- Lib/idlelib/EditorWindow.py | 9 ++-- Lib/idlelib/PathBrowser.py | 2 +- Lib/idlelib/Percolator.py | 50 ++++++++++++------ Lib/idlelib/StackViewer.py | 30 +++++++++++ Lib/idlelib/ToolTip.py | 5 +- Lib/idlelib/idle_test/htest.py | 109 +++++++++++++++++++++++++++------------- Lib/idlelib/keybindingDialog.py | 26 +++++----- 9 files changed, 160 insertions(+), 79 deletions(-) diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py index a6e6c4a..ee1a70f 100644 --- a/Lib/idlelib/ClassBrowser.py +++ b/Lib/idlelib/ClassBrowser.py @@ -13,7 +13,6 @@ XXX TO DO: import os import sys import pyclbr -import re from idlelib import PyShell from idlelib.WindowList import ListedToplevel @@ -223,6 +222,7 @@ def _class_browser(parent): #Wrapper for htest name = os.path.splitext(file)[0] flist = PyShell.PyShellFileList(parent) ClassBrowser(flist, name, [dir], _htest=True) + parent.mainloop() if __name__ == "__main__": from idlelib.idle_test.htest import run diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py index d75a3c4..424755f 100644 --- a/Lib/idlelib/ColorDelegator.py +++ b/Lib/idlelib/ColorDelegator.py @@ -259,11 +259,9 @@ def _color_delegator(parent): root.title("Test ColorDelegator") width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) root.geometry("+%d+%d"%(x, y + 150)) - with open(__file__, 'r') as f: - source = f.read() + source = "if somename: x = 'abc' # comment\nprint" text = Text(root, background="white") - # insert only a sample portion - text.insert("insert", source[:690]) + text.insert("insert", source) text.pack(expand=1, fill="both") p = Percolator(text) d = ColorDelegator() diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py index 6b59023..f3df8ea 100644 --- a/Lib/idlelib/EditorWindow.py +++ b/Lib/idlelib/EditorWindow.py @@ -1705,18 +1705,15 @@ def fixwordbreaks(root): def _editor_window(parent): root = parent fixwordbreaks(root) -## root.withdraw() if sys.argv[1:]: filename = sys.argv[1] else: filename = None macosxSupport.setupApp(root, None) edit = EditorWindow(root=root, filename=filename) -## edit.set_close_hook(root.quit) -## edit.text.bind("<>", edit.close_event) + edit.text.bind("<>", edit.close_event) + parent.mainloop() if __name__ == '__main__': from idlelib.idle_test.htest import run - if len(sys.argv) <= 1: - run(_help_dialog) - run(_editor_window) + run(_help_dialog, _editor_window) diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py index 9404868..58ff830 100644 --- a/Lib/idlelib/PathBrowser.py +++ b/Lib/idlelib/PathBrowser.py @@ -1,6 +1,5 @@ import os import sys -import re import importlib.machinery from idlelib.TreeWidget import TreeItem @@ -97,6 +96,7 @@ class DirBrowserTreeItem(TreeItem): def _path_browser(parent): flist = PyShellFileList(parent) PathBrowser(flist, _htest=True) + parent.mainloop() if __name__ == "__main__": from unittest import main diff --git a/Lib/idlelib/Percolator.py b/Lib/idlelib/Percolator.py index c91de38..9e93319 100644 --- a/Lib/idlelib/Percolator.py +++ b/Lib/idlelib/Percolator.py @@ -51,8 +51,9 @@ class Percolator: f.setdelegate(filter.delegate) filter.setdelegate(None) -def main(): - import tkinter as Tk +def _percolator(parent): + import tkinter as tk + import re class Tracer(Delegator): def __init__(self, name): self.name = name @@ -63,22 +64,41 @@ def main(): def delete(self, *args): print(self.name, ": delete", args) self.delegate.delete(*args) - root = Tk.Tk() - root.wm_protocol("WM_DELETE_WINDOW", root.quit) - text = Tk.Text() - text.pack() - text.focus_set() + root = tk.Tk() + root.title("Test Percolator") + width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) + root.geometry("+%d+%d"%(x, y + 150)) + text = tk.Text(root) p = Percolator(text) t1 = Tracer("t1") t2 = Tracer("t2") - p.insertfilter(t1) - p.insertfilter(t2) - root.mainloop() # click close widget to continue... - p.removefilter(t2) - root.mainloop() - p.insertfilter(t2) - p.removefilter(t1) + + def toggle1(): + if var1.get() == 0: + var1.set(1) + p.insertfilter(t1) + elif var1.get() == 1: + var1.set(0) + p.removefilter(t1) + + def toggle2(): + if var2.get() == 0: + var2.set(1) + p.insertfilter(t2) + elif var2.get() == 1: + var2.set(0) + p.removefilter(t2) + + text.pack() + var1 = tk.IntVar() + cb1 = tk.Checkbutton(root, text="Tracer1", command=toggle1, variable=var1) + cb1.pack() + var2 = tk.IntVar() + cb2 = tk.Checkbutton(root, text="Tracer2", command=toggle2, variable=var2) + cb2.pack() + root.mainloop() if __name__ == "__main__": - main() + from idlelib.idle_test.htest import run + run(_percolator) diff --git a/Lib/idlelib/StackViewer.py b/Lib/idlelib/StackViewer.py index 4ef2d31..ed2c9e7 100644 --- a/Lib/idlelib/StackViewer.py +++ b/Lib/idlelib/StackViewer.py @@ -1,9 +1,12 @@ import os import sys import linecache +import re +import tkinter as tk from idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas from idlelib.ObjectBrowser import ObjectTreeItem, make_objecttreeitem +from idlelib.PyShell import PyShellFileList def StackBrowser(root, flist=None, tb=None, top=None): if top is None: @@ -120,3 +123,30 @@ class VariablesTreeItem(ObjectTreeItem): item = make_objecttreeitem(key + " =", value, setfunction) sublist.append(item) return sublist + +def _stack_viewer(parent): + root = tk.Tk() + root.title("Test StackViewer") + width, height, x, y = list(map(int, re.split('[x+]', parent.geometry()))) + root.geometry("+%d+%d"%(x, y + 150)) + flist = PyShellFileList(root) + try: # to obtain a traceback object + a + except: + exc_type, exc_value, exc_tb = sys.exc_info() + + # inject stack trace to sys + sys.last_type = exc_type + sys.last_value = exc_value + sys.last_traceback = exc_tb + + StackBrowser(root, flist=flist, top=root, tb=exc_tb) + + # restore sys to original state + del sys.last_type + del sys.last_value + del sys.last_traceback + +if __name__ == '__main__': + from idlelib.idle_test.htest import run + run(_stack_viewer) diff --git a/Lib/idlelib/ToolTip.py b/Lib/idlelib/ToolTip.py index e7bc81e..964107e 100644 --- a/Lib/idlelib/ToolTip.py +++ b/Lib/idlelib/ToolTip.py @@ -87,8 +87,9 @@ def _tooltip(parent): button2 = Button(root, text="Button 2") button1.pack() button2.pack() - ToolTip(button1, "This is calltip text for button1.") - ListboxToolTip(button2, ["This is","calltip text","for button2"]) + ToolTip(button1, "This is tooltip text for button1.") + ListboxToolTip(button2, ["This is","multiple line", + "tooltip text","for button2"]) root.mainloop() if __name__ == '__main__': diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py index 4735e9e..c5101ff 100644 --- a/Lib/idlelib/idle_test/htest.py +++ b/Lib/idlelib/idle_test/htest.py @@ -53,8 +53,9 @@ _class_browser_spec = { 'file': 'ClassBrowser', 'kwds': {}, 'msg': "Inspect names of module, class(with superclass if " - "applicable), methods and functions.\nToggle nested items." - "\nN.S: Double click on items does not work", + "applicable), methods and functions.\nToggle nested items.\n" + "Double clicking on items prints a traceback print a traceback " + "for an exception that is ignored." } _color_delegator_spec = { @@ -74,11 +75,11 @@ _dyn_option_menu_spec = { "Select one of the many options in the 'new option set'." } -#_editor_window_spec = { -# 'file': 'EditorWindow', -# 'kwds': {}, -# 'msg': "Test editor functions of interest" -# } +_editor_window_spec = { + 'file': 'EditorWindow', + 'kwds': {}, + 'msg': "Test editor functions of interest." + } GetCfgSectionNameDialog_spec = { 'file': 'configSectionNameDialog', @@ -91,6 +92,7 @@ GetCfgSectionNameDialog_spec = { "Close 'Get Name' with a valid entry (printed to Shell), " "[Cancel], or [X]", } + GetHelpSourceDialog_spec = { 'file': 'configHelpSourceEdit', 'kwds': {'title': 'Get helpsource', @@ -103,10 +105,27 @@ GetHelpSourceDialog_spec = { "[Cancel] will print None to shell", } +# Update once issue21519 is resolved. +GetKeysDialog_spec = { + 'file': 'keybindingDialog', + 'kwds': {'title': 'Test keybindings', + 'action': 'find-again', + 'currentKeySequences': [''] , + '_htest': True, + }, + 'msg': "Test for different key modifier sequences.\n" + " is invalid.\n" + "No modifier key is invalid.\n" + "Shift key with [a-z],[0-9], function key, move key, tab, space" + "is invalid.\nNo validitity checking if advanced key binding " + "entry is used." + } + _help_dialog_spec = { 'file': 'EditorWindow', 'kwds': {}, - 'msg': "If the help text displays, this works" + 'msg': "If the help text displays, this works.\n" + "Text is selectable. Window is scrollable." } _io_binding_spec = { @@ -115,17 +134,16 @@ _io_binding_spec = { 'msg': "Test the following bindings\n" " to display open window from file dialog.\n" " to save the file\n" - } _multi_call_spec = { 'file': 'MultiCall', 'kwds': {}, - 'msg': "The following actions should trigger a print to console.\n" - "Entering and leaving the text area, key entry, ,\n" - ", , , \n" - ", and focussing out of the window\n" - "are sequences to be tested." + 'msg': "The following actions should trigger a print to console or IDLE" + " Shell.\nEntering and leaving the text area, key entry, " + ",\n, , " + ", \n, and " + "focusing out of the window\nare sequences to be tested." } _multistatus_bar_spec = { @@ -146,18 +164,38 @@ _object_browser_spec = { _path_browser_spec = { 'file': 'PathBrowser', 'kwds': {}, - 'msg': "Test for correct display of all paths in sys.path." - "\nToggle nested items upto the lowest level." - "\nN.S: Double click on items does not work." + 'msg': "Test for correct display of all paths in sys.path.\n" + "Toggle nested items upto the lowest level.\n" + "Double clicking on an item prints a traceback\n" + "for an exception that is ignored." + } + +_percolator_spec = { + 'file': 'Percolator', + 'kwds': {}, + 'msg': "There are two tracers which can be toggled using a checkbox.\n" + "Toggling a tracer 'on' by checking it should print tracer" + "output to the console or to the IDLE shell.\n" + "If both the tracers are 'on', the output from the tracer which " + "was switched 'on' later, should be printed first\n" + "Test for actions like text entry, and removal." } _scrolled_list_spec = { 'file': 'ScrolledList', 'kwds': {}, 'msg': "You should see a scrollable list of items\n" - "Selecting an item will print it to console.\n" - "Double clicking an item will print it to console\n" - "Right click on an item will display a popup." + "Selecting (clicking) or double clicking an item " + "prints the name to the console or Idle shell.\n" + "Right clicking an item will display a popup." + } + +_stack_viewer_spec = { + 'file': 'StackViewer', + 'kwds': {}, + 'msg': "A stacktrace for a NameError exception.\n" + "Expand 'idlelib ...' and ''.\n" + "Check that exc_value, exc_tb, and exc_type are correct.\n" } _tabbed_pages_spec = { @@ -189,7 +227,7 @@ _tooltip_spec = { _tree_widget_spec = { 'file': 'TreeWidget', 'kwds': {}, - 'msg': "You should see two canvas' side-by-side.\n" + 'msg': "You should see two canvases side-by-side.\n" "The left canvas is scrollable.\n" "The right canvas is not scrollable.\n" "Click on folders upto to the lowest level." @@ -198,29 +236,27 @@ _tree_widget_spec = { _widget_redirector_spec = { 'file': 'WidgetRedirector', 'kwds': {}, - 'msg': "Every text insert should be printed to console." + 'msg': "Every text insert should be printed to the console." + "or the IDLE shell." } -def run(test=None): +def run(*tests): root = tk.Tk() - test_list = [] # List of tuples of the form (spec, kwds, callable widget) - if test: - test_spec = globals()[test.__name__ + '_spec'] - test_spec['name'] = test.__name__ - test_kwds = test_spec['kwds'] - test_kwds['parent'] = root - test_list.append((test_spec, test_kwds, test)) + test_list = [] # List of tuples of the form (spec, callable widget) + 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 test_spec['name'] = test_name - test_kwds = test_spec['kwds'] - test_kwds['parent'] = root mod = import_module('idlelib.' + test_spec['file']) test = getattr(mod, test_name) - test_list.append((test_spec, test_kwds, test)) + test_list.append((test_spec, test)) help_string = tk.StringVar('') test_name = tk.StringVar('') @@ -232,10 +268,11 @@ def run(test=None): nonlocal help_string, test_name, callable_object, test_kwds if len(test_list) == 1: next_button.pack_forget() - test_spec, test_kwds, test = test_list.pop() + test_spec, callable_object = test_list.pop() + test_kwds = test_spec['kwds'] + test_kwds['parent'] = root help_string.set(test_spec['msg']) - test_name.set('test ' + test_spec['name']) - callable_object = test + test_name.set('Test ' + test_spec['name']) def run_test(): diff --git a/Lib/idlelib/keybindingDialog.py b/Lib/idlelib/keybindingDialog.py index db88cb4..e6438bf 100644 --- a/Lib/idlelib/keybindingDialog.py +++ b/Lib/idlelib/keybindingDialog.py @@ -7,12 +7,13 @@ import string import sys class GetKeysDialog(Toplevel): - def __init__(self,parent,title,action,currentKeySequences): + def __init__(self,parent,title,action,currentKeySequences,_htest=False): """ action - string, the name of the virtual event these keys will be mapped to currentKeys - list, a list of all key sequence lists currently mapped to virtual events, for overlap checking + _htest - bool, change box location when running htest """ Toplevel.__init__(self, parent) self.configure(borderwidth=5) @@ -38,11 +39,14 @@ class GetKeysDialog(Toplevel): self.LoadFinalKeyList() self.withdraw() #hide while setting geometry self.update_idletasks() - self.geometry("+%d+%d" % - ((parent.winfo_rootx()+((parent.winfo_width()/2) - -(self.winfo_reqwidth()/2)), - parent.winfo_rooty()+((parent.winfo_height()/2) - -(self.winfo_reqheight()/2)) )) ) #centre dialog over parent + self.geometry( + "+%d+%d" % ( + parent.winfo_rootx() + + (parent.winfo_width()/2 - self.winfo_reqwidth()/2), + parent.winfo_rooty() + + ((parent.winfo_height()/2 - self.winfo_reqheight()/2) + if not _htest else 150) + ) ) #centre dialog over parent (or below htest box) self.deiconify() #geometry set, unhide self.wait_window() @@ -258,11 +262,5 @@ class GetKeysDialog(Toplevel): return keysOK if __name__ == '__main__': - #test the dialog - root=Tk() - def run(): - keySeq='' - dlg=GetKeysDialog(root,'Get Keys','find-again',[]) - print(dlg.result) - Button(root,text='Dialog',command=run).pack() - root.mainloop() + from idlelib.idle_test.htest import run + run(GetKeysDialog) -- cgit v0.12