diff options
author | Larry Hastings <larry@hastings.org> | 2014-05-17 21:05:10 -0700 |
---|---|---|
committer | Larry Hastings <larry@hastings.org> | 2014-05-17 21:05:10 -0700 |
commit | 3a260d228b32b04a88d947b887bf81759e8e5f10 (patch) | |
tree | e4a34e9cbbf877cf021ffba743ddbf54e17526b7 /Lib/idlelib/idle_test/htest.py | |
parent | 2110603344316d927e6d639275c12f5da78601d5 (diff) | |
parent | b1a1ec3151155a1ae65831793b4a5b7a87d9d09f (diff) | |
download | cpython-3a260d228b32b04a88d947b887bf81759e8e5f10.tar.gz cpython-3a260d228b32b04a88d947b887bf81759e8e5f10.zip |
Merge.
Diffstat (limited to 'Lib/idlelib/idle_test/htest.py')
-rw-r--r-- | Lib/idlelib/idle_test/htest.py | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py new file mode 100644 index 00000000000..001f7ee07ee --- /dev/null +++ b/Lib/idlelib/idle_test/htest.py @@ -0,0 +1,93 @@ +'''Run human tests of Idle's window, dialog, and popup widgets. + +run(test): run *test*, a callable that causes a widget to be displayed. +runall(): run all tests defined in this file. + +Let X be a global name bound to a widget callable. End the module with + +if __name__ == '__main__': + <unittest, if there is one> + from idlelib.idle_test.htest import run + run(X) + +The X object must have a .__name__ attribute and a 'parent' parameter. +X will often 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 contain a matching instance of the folling template, +with X.__name__ prepended, as in '_Editor_window_spec ...'. + +_spec = { + 'file': '', + 'kwds': {'title': ''}, + 'msg': "" + } + +file (no .py): used in runall() to import the file and get X. +kwds: passed to X (**kwds), after 'parent' is added, to initialize X. +title: an example; used for some widgets, delete if not. +msg: displayed in a master window. Hints as to how the user might + test the widget. Close the window to skip or end the test. +''' +from importlib import import_module +import tkinter as tk + + +_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(test): + "Display a widget with callable *test* using a _spec dict" + root = tk.Tk() + test_spec = globals()[test.__name__ + '_spec'] + test_kwds = test_spec['kwds'] + test_kwds['parent'] = root + + def run_test(): + widget = test(**test_kwds) + try: + print(widget.result) + except AttributeError: + pass + tk.Label(root, text=test_spec['msg'], justify='left').pack() + tk.Button(root, text='Test ' + test.__name__, command=run_test).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']) + test = getattr(mod, k[:-5]) + run(test) + +if __name__ == '__main__': + runall() |