[Python-checkins] cpython (merge 3.4 -> default): Merge with 3.4

terry.reedy python-checkins at python.org
Sun May 25 00:49:29 CEST 2014


http://hg.python.org/cpython/rev/eb86a3c81dbb
changeset:   90819:eb86a3c81dbb
parent:      90815:95378af02a23
parent:      90818:038cbbef4539
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Sat May 24 18:48:45 2014 -0400
summary:
  Merge with 3.4

files:
  Lib/idlelib/CallTipWindow.py        |   51 +-
  Lib/idlelib/ClassBrowser.py         |   20 +-
  Lib/idlelib/ColorDelegator.py       |   16 +-
  Lib/idlelib/IOBinding.py            |   16 +-
  Lib/idlelib/MultiCall.py            |   12 +-
  Lib/idlelib/MultiStatusBar.py       |   35 +-
  Lib/idlelib/ObjectBrowser.py        |   10 +-
  Lib/idlelib/PathBrowser.py          |   20 +-
  Lib/idlelib/ScrolledList.py         |   19 +-
  Lib/idlelib/ToolTip.py              |   21 +-
  Lib/idlelib/TreeWidget.py           |   32 +-
  Lib/idlelib/WidgetRedirector.py     |   15 +-
  Lib/idlelib/aboutDialog.py          |   11 +-
  Lib/idlelib/configHelpSourceEdit.py |   27 +-
  Lib/idlelib/dynOptionMenuWidget.py  |   26 +-
  Lib/idlelib/idle_test/htest.py      |  214 ++++++++++++++-
  Lib/idlelib/tabbedpages.py          |   10 +-
  Lib/idlelib/textView.py             |   30 +-
  18 files changed, 409 insertions(+), 176 deletions(-)


diff --git a/Lib/idlelib/CallTipWindow.py b/Lib/idlelib/CallTipWindow.py
--- a/Lib/idlelib/CallTipWindow.py
+++ b/Lib/idlelib/CallTipWindow.py
@@ -133,37 +133,36 @@
         return bool(self.tipwindow)
 
 
+def _calltip_window(parent):
+    root = Tk()
+    root.title("Test calltips")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
 
-###############################
-#
-# Test Code
-#
-class container: # Conceptually an editor_window
-    def __init__(self):
-        root = Tk()
-        text = self.text = Text(root)
-        text.pack(side=LEFT, fill=BOTH, expand=1)
-        text.insert("insert", "string.split")
-        root.update()
-        self.calltip = CallTip(text)
+    class MyEditWin: # comparenceptually an editor_window
+        def __init__(self):
+            text = self.text = Text(root)
+            text.pack(side=LEFT, fill=BOTH, expand=1)
+            text.insert("insert", "string.split")
+            root.update()
+            self.calltip = CallTip(text)
 
-        text.event_add("<<calltip-show>>", "(")
-        text.event_add("<<calltip-hide>>", ")")
-        text.bind("<<calltip-show>>", self.calltip_show)
-        text.bind("<<calltip-hide>>", self.calltip_hide)
+            text.event_add("<<calltip-show>>", "(")
+            text.event_add("<<calltip-hide>>", ")")
+            text.bind("<<calltip-show>>", self.calltip_show)
+            text.bind("<<calltip-hide>>", self.calltip_hide)
 
-        text.focus_set()
-        root.mainloop()
+            text.focus_set()
+            root.mainloop()
 
-    def calltip_show(self, event):
-        self.calltip.showtip("Hello world")
+        def calltip_show(self, event):
+            self.calltip.showtip("Hello world", "insert", "end")
 
-    def calltip_hide(self, event):
-        self.calltip.hidetip()
+        def calltip_hide(self, event):
+            self.calltip.hidetip()
 
-def main():
-    # Test code
-    c=container()
+    editwin = MyEditWin()
 
 if __name__=='__main__':
-    main()
+    from idlelib.idle_test.htest import run
+    run(_calltip_window)
diff --git a/Lib/idlelib/ClassBrowser.py b/Lib/idlelib/ClassBrowser.py
--- a/Lib/idlelib/ClassBrowser.py
+++ b/Lib/idlelib/ClassBrowser.py
@@ -13,6 +13,7 @@
 import os
 import sys
 import pyclbr
+import re
 
 from idlelib import PyShell
 from idlelib.WindowList import ListedToplevel
@@ -21,11 +22,15 @@
 
 class ClassBrowser:
 
-    def __init__(self, flist, name, path):
+    def __init__(self, flist, name, path, _htest=False):
         # XXX This API should change, if the file doesn't end in ".py"
         # XXX the code here is bogus!
+        """
+        _htest - bool, change box when location running htest.
+        """
         self.name = name
         self.file = os.path.join(path[0], self.name + ".py")
+        self._htest = _htest
         self.init(flist)
 
     def close(self, event=None):
@@ -40,6 +45,9 @@
         self.top = top = ListedToplevel(flist.root)
         top.protocol("WM_DELETE_WINDOW", self.close)
         top.bind("<Escape>", self.close)
+        if self._htest: # place dialog below parent if running htest
+            top.geometry("+%d+%d" %
+                (flist.root.winfo_rootx(), flist.root.winfo_rooty() + 200))
         self.settitle()
         top.focus_set()
         # create scrolled canvas
@@ -202,7 +210,7 @@
         edit = PyShell.flist.open(self.file)
         edit.gotoline(self.cl.methods[self.name])
 
-def main():
+def _class_browser(parent): #Wrapper for htest
     try:
         file = __file__
     except NameError:
@@ -213,9 +221,9 @@
             file = sys.argv[0]
     dir, file = os.path.split(file)
     name = os.path.splitext(file)[0]
-    ClassBrowser(PyShell.flist, name, [dir])
-    if sys.stdin is sys.__stdin__:
-        mainloop()
+    flist = PyShell.PyShellFileList(parent)
+    ClassBrowser(flist, name, [dir], _htest=True)
 
 if __name__ == "__main__":
-    main()
+    from idlelib.idle_test.htest import run
+    run(_class_browser)
diff --git a/Lib/idlelib/ColorDelegator.py b/Lib/idlelib/ColorDelegator.py
--- a/Lib/idlelib/ColorDelegator.py
+++ b/Lib/idlelib/ColorDelegator.py
@@ -253,17 +253,23 @@
         for tag in self.tagdefs:
             self.tag_remove(tag, "1.0", "end")
 
-def main():
+def _color_delegator(parent):
     from idlelib.Percolator import Percolator
     root = Tk()
-    root.wm_protocol("WM_DELETE_WINDOW", root.quit)
-    text = Text(background="white")
+    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()
+    text = Text(root, background="white")
+    # insert only a sample portion
+    text.insert("insert", source[:690])
     text.pack(expand=1, fill="both")
-    text.focus_set()
     p = Percolator(text)
     d = ColorDelegator()
     p.insertfilter(d)
     root.mainloop()
 
 if __name__ == "__main__":
-    main()
+    from idlelib.idle_test.htest import run
+    run(_color_delegator)
diff --git a/Lib/idlelib/IOBinding.py b/Lib/idlelib/IOBinding.py
--- a/Lib/idlelib/IOBinding.py
+++ b/Lib/idlelib/IOBinding.py
@@ -525,16 +525,17 @@
         if self.editwin.flist:
             self.editwin.update_recent_files_list(filename)
 
-def test():
+def _io_binding(parent):
     root = Tk()
+    root.title("Test IOBinding")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
     class MyEditWin:
         def __init__(self, text):
             self.text = text
             self.flist = None
             self.text.bind("<Control-o>", self.open)
             self.text.bind("<Control-s>", self.save)
-            self.text.bind("<Alt-s>", self.save_as)
-            self.text.bind("<Alt-z>", self.save_a_copy)
         def get_saved(self): return 0
         def set_saved(self, flag): pass
         def reset_undo(self): pass
@@ -542,16 +543,13 @@
             self.text.event_generate("<<open-window-from-file>>")
         def save(self, event):
             self.text.event_generate("<<save-window>>")
-        def save_as(self, event):
-            self.text.event_generate("<<save-window-as-file>>")
-        def save_a_copy(self, event):
-            self.text.event_generate("<<save-copy-of-window-as-file>>")
+
     text = Text(root)
     text.pack()
     text.focus_set()
     editwin = MyEditWin(text)
     io = IOBinding(editwin)
-    root.mainloop()
 
 if __name__ == "__main__":
-    test()
+    from idlelib.idle_test.htest import run
+    run(_io_binding)
diff --git a/Lib/idlelib/MultiCall.py b/Lib/idlelib/MultiCall.py
--- a/Lib/idlelib/MultiCall.py
+++ b/Lib/idlelib/MultiCall.py
@@ -420,9 +420,12 @@
     _multicall_dict[widget] = MultiCall
     return MultiCall
 
-if __name__ == "__main__":
-    # Test
+
+def _multi_call(parent):
     root = tkinter.Tk()
+    root.title("Test MultiCall")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
     text = MultiCallCreator(tkinter.Text)(root)
     text.pack()
     def bindseq(seq, n=[0]):
@@ -438,8 +441,13 @@
     bindseq("<Alt-Control-Key-a>")
     bindseq("<Key-b>")
     bindseq("<Control-Button-1>")
+    bindseq("<Button-2>")
     bindseq("<Alt-Button-1>")
     bindseq("<FocusOut>")
     bindseq("<Enter>")
     bindseq("<Leave>")
     root.mainloop()
+
+if __name__ == "__main__":
+    from idlelib.idle_test.htest import run
+    run(_multi_call)
diff --git a/Lib/idlelib/MultiStatusBar.py b/Lib/idlelib/MultiStatusBar.py
--- a/Lib/idlelib/MultiStatusBar.py
+++ b/Lib/idlelib/MultiStatusBar.py
@@ -17,16 +17,29 @@
             label = self.labels[name]
         label.config(text=text)
 
-def _test():
-    b = Frame()
-    c = Text(b)
-    c.pack(side=TOP)
-    a = MultiStatusBar(b)
-    a.set_label("one", "hello")
-    a.set_label("two", "world")
-    a.pack(side=BOTTOM, fill=X)
-    b.pack()
-    b.mainloop()
+def _multistatus_bar(parent):
+    root = Tk()
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d" %(x, y + 150))
+    root.title("Test multistatus bar")
+    frame = Frame(root)
+    text = Text(frame)
+    text.pack()
+    msb = MultiStatusBar(frame)
+    msb.set_label("one", "hello")
+    msb.set_label("two", "world")
+    msb.pack(side=BOTTOM, fill=X)
+
+    def change():
+        msb.set_label("one", "foo")
+        msb.set_label("two", "bar")
+
+    button = Button(root, text="Update status", command=change)
+    button.pack(side=BOTTOM)
+    frame.pack()
+    frame.mainloop()
+    root.mainloop()
 
 if __name__ == '__main__':
-    _test()
+    from idlelib.idle_test.htest import run
+    run(_multistatus_bar)
diff --git a/Lib/idlelib/ObjectBrowser.py b/Lib/idlelib/ObjectBrowser.py
--- a/Lib/idlelib/ObjectBrowser.py
+++ b/Lib/idlelib/ObjectBrowser.py
@@ -9,6 +9,8 @@
 # XXX TO DO:
 # - for classes/modules, add "open source" to object browser
 
+import re
+
 from idlelib.TreeWidget import TreeItem, TreeNode, ScrolledCanvas
 
 from reprlib import Repr
@@ -119,12 +121,13 @@
         c = ObjectTreeItem
     return c(labeltext, object, setfunction)
 
-# Test script
 
-def _test():
+def _object_browser(parent):
     import sys
     from tkinter import Tk
     root = Tk()
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 100))
     root.configure(bd=0, bg="yellow")
     root.focus_set()
     sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
@@ -135,4 +138,5 @@
     root.mainloop()
 
 if __name__ == '__main__':
-    _test()
+    from idlelib.idle_test.htest import run
+    run(_object_browser)
diff --git a/Lib/idlelib/PathBrowser.py b/Lib/idlelib/PathBrowser.py
--- a/Lib/idlelib/PathBrowser.py
+++ b/Lib/idlelib/PathBrowser.py
@@ -1,13 +1,20 @@
 import os
 import sys
+import re
 import importlib.machinery
 
 from idlelib.TreeWidget import TreeItem
 from idlelib.ClassBrowser import ClassBrowser, ModuleBrowserTreeItem
+from idlelib.PyShell import PyShellFileList
+
 
 class PathBrowser(ClassBrowser):
 
-    def __init__(self, flist):
+    def __init__(self, flist, _htest=False):
+        """
+        _htest - bool, change box location when running htest
+        """
+        self._htest = _htest
         self.init(flist)
 
     def settitle(self):
@@ -87,12 +94,13 @@
         sorted.sort()
         return sorted
 
-def main():
-    from idlelib import PyShell
-    PathBrowser(PyShell.flist)
-    if sys.stdin is sys.__stdin__:
-        mainloop()
+def _path_browser(parent):
+    flist = PyShellFileList(parent)
+    PathBrowser(flist, _htest=True)
 
 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)
diff --git a/Lib/idlelib/ScrolledList.py b/Lib/idlelib/ScrolledList.py
--- a/Lib/idlelib/ScrolledList.py
+++ b/Lib/idlelib/ScrolledList.py
@@ -119,21 +119,22 @@
         pass
 
 
-def test():
+def _scrolled_list(parent):
     root = Tk()
-    root.protocol("WM_DELETE_WINDOW", root.destroy)
+    root.title("Test ScrolledList")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
     class MyScrolledList(ScrolledList):
-        def fill_menu(self): self.menu.add_command(label="pass")
+        def fill_menu(self): self.menu.add_command(label="right click")
         def on_select(self, index): print("select", self.get(index))
         def on_double(self, index): print("double", self.get(index))
-    s = MyScrolledList(root)
+
+    scrolled_list = MyScrolledList(root)
     for i in range(30):
-        s.append("item %02d" % i)
-    return root
+        scrolled_list.append("Item %02d" % i)
 
-def main():
-    root = test()
     root.mainloop()
 
 if __name__ == '__main__':
-    main()
+    from idlelib.idle_test.htest import run
+    run(_scrolled_list)
diff --git a/Lib/idlelib/ToolTip.py b/Lib/idlelib/ToolTip.py
--- a/Lib/idlelib/ToolTip.py
+++ b/Lib/idlelib/ToolTip.py
@@ -76,14 +76,21 @@
         for item in self.items:
             listbox.insert(END, item)
 
-def main():
-    # Test code
+def _tooltip(parent):
     root = Tk()
-    b = Button(root, text="Hello", command=root.destroy)
-    b.pack()
-    root.update()
-    tip = ListboxToolTip(b, ["Hello", "world"])
+    root.title("Test tooltip")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
+    label = Label(root, text="Place your mouse over buttons")
+    label.pack()
+    button1 = Button(root, text="Button 1")
+    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"])
     root.mainloop()
 
 if __name__ == '__main__':
-    main()
+    from idlelib.idle_test.htest import run
+    run(_tooltip)
diff --git a/Lib/idlelib/TreeWidget.py b/Lib/idlelib/TreeWidget.py
--- a/Lib/idlelib/TreeWidget.py
+++ b/Lib/idlelib/TreeWidget.py
@@ -448,29 +448,27 @@
         return "break"
 
 
-# Testing functions
-
-def test():
-    from idlelib import PyShell
-    root = Toplevel(PyShell.root)
-    root.configure(bd=0, bg="yellow")
-    root.focus_set()
+def _tree_widget(parent):
+    root = Tk()
+    root.title("Test TreeWidget")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
+    # test with scrollable canvas
     sc = ScrolledCanvas(root, bg="white", highlightthickness=0, takefocus=1)
-    sc.frame.pack(expand=1, fill="both")
-    item = FileTreeItem("C:/windows/desktop")
+    sc.frame.pack(expand=1, fill="both", side=LEFT)
+    item = FileTreeItem(os.getcwd())
     node = TreeNode(sc.canvas, None, item)
     node.expand()
 
-def test2():
-    # test w/o scrolling canvas
-    root = Tk()
-    root.configure(bd=0)
+    # test without scrollable canvas
     canvas = Canvas(root, bg="white", highlightthickness=0)
-    canvas.pack(expand=1, fill="both")
-    item = FileTreeItem(os.curdir)
+    canvas.pack(expand=0, fill="both", side=RIGHT)
+    item = FileTreeItem(os.getcwd())
     node = TreeNode(canvas, None, item)
     node.update()
-    canvas.focus_set()
+
+    root.mainloop()
 
 if __name__ == '__main__':
-    test()
+    from idlelib.idle_test.htest import run
+    run(_tree_widget)
diff --git a/Lib/idlelib/WidgetRedirector.py b/Lib/idlelib/WidgetRedirector.py
--- a/Lib/idlelib/WidgetRedirector.py
+++ b/Lib/idlelib/WidgetRedirector.py
@@ -104,10 +104,12 @@
         return self.tk_call(self.orig_and_operation + args)
 
 
-def main():
+def _widget_redirector(parent):
     root = Tk()
-    root.wm_protocol("WM_DELETE_WINDOW", root.quit)
-    text = Text()
+    root.title("Test WidgetRedirector")
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
+    text = Text(root)
     text.pack()
     text.focus_set()
     redir = WidgetRedirector(text)
@@ -117,10 +119,7 @@
         previous_tcl_fcn(*args)
     previous_tcl_fcn = redir.register("insert", my_insert)
     root.mainloop()
-    redir.unregister("insert")  # runs after first 'close window'
-    redir.close()
-    root.mainloop()
-    root.destroy()
 
 if __name__ == "__main__":
-    main()
+    from idlelib.idle_test.htest import run
+    run(_widget_redirector)
diff --git a/Lib/idlelib/aboutDialog.py b/Lib/idlelib/aboutDialog.py
--- a/Lib/idlelib/aboutDialog.py
+++ b/Lib/idlelib/aboutDialog.py
@@ -12,11 +12,16 @@
     """Modal about dialog for idle
 
     """
-    def __init__(self, parent, title):
+    def __init__(self, parent, title, _htest=False):
+        """
+        _htest - bool, change box location when running htest
+        """
         Toplevel.__init__(self, parent)
         self.configure(borderwidth=5)
-        self.geometry("+%d+%d" % (parent.winfo_rootx()+30,
-                                  parent.winfo_rooty()+30))
+        # place dialog below parent if running htest
+        self.geometry("+%d+%d" % (
+                        parent.winfo_rootx()+30,
+                        parent.winfo_rooty()+(30 if not _htest else 100)))
         self.bg = "#707070"
         self.fg = "#ffffff"
         self.CreateWidgets()
diff --git a/Lib/idlelib/configHelpSourceEdit.py b/Lib/idlelib/configHelpSourceEdit.py
--- a/Lib/idlelib/configHelpSourceEdit.py
+++ b/Lib/idlelib/configHelpSourceEdit.py
@@ -8,13 +8,14 @@
 import tkinter.filedialog as tkFileDialog
 
 class GetHelpSourceDialog(Toplevel):
-    def __init__(self, parent, title, menuItem='', filePath=''):
+    def __init__(self, parent, title, menuItem='', filePath='', _htest=False):
         """Get menu entry and url/ local file location for Additional Help
 
         User selects a name for the Help resource and provides a web url
         or a local file as its source.  The user can enter a url or browse
         for the file.
 
+        _htest - bool, change box location when running htest
         """
         Toplevel.__init__(self, parent)
         self.configure(borderwidth=5)
@@ -31,12 +32,14 @@
         self.withdraw() #hide while setting geometry
         #needs to be done here so that the winfo_reqwidth is valid
         self.update_idletasks()
-        #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)))))
+        #centre dialog over parent. below parent if running htest.
+        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)))
         self.deiconify() #geometry set, unhide
         self.bind('<Return>', self.Ok)
         self.wait_window()
@@ -159,11 +162,5 @@
         self.destroy()
 
 if __name__ == '__main__':
-    #test the dialog
-    root = Tk()
-    def run():
-        keySeq = ''
-        dlg = GetHelpSourceDialog(root, 'Get Help Source')
-        print(dlg.result)
-    Button(root,text='Dialog', command=run).pack()
-    root.mainloop()
+    from idlelib.idle_test.htest import run
+    run(GetHelpSourceDialog)
diff --git a/Lib/idlelib/dynOptionMenuWidget.py b/Lib/idlelib/dynOptionMenuWidget.py
--- a/Lib/idlelib/dynOptionMenuWidget.py
+++ b/Lib/idlelib/dynOptionMenuWidget.py
@@ -2,9 +2,10 @@
 OptionMenu widget modified to allow dynamic menu reconfiguration
 and setting of highlightthickness
 """
-from tkinter import OptionMenu
-from tkinter import _setit
+from tkinter import OptionMenu, _setit, Tk, StringVar, Button
+
 import copy
+import re
 
 class DynOptionMenu(OptionMenu):
     """
@@ -33,3 +34,24 @@
                     command=_setit(self.variable,item,self.command))
         if value:
             self.variable.set(value)
+
+def _dyn_option_menu(parent):
+    root = Tk()
+    root.title("Tets dynamic option menu")
+    var = StringVar(root)
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 150))
+    var.set("Old option set") #Set the default value
+    dyn = DynOptionMenu(root,var, "old1","old2","old3","old4")
+    dyn.pack()
+
+    def update():
+        dyn.SetMenu(["new1","new2","new3","new4"],value="new option set")
+
+    button = Button(root, text="Change option set", command=update)
+    button.pack()
+    root.mainloop()
+
+if __name__ == '__main__':
+    from idlelib.idle_test.htest import run
+    run(_dyn_option_menu)
diff --git a/Lib/idlelib/idle_test/htest.py b/Lib/idlelib/idle_test/htest.py
--- a/Lib/idlelib/idle_test/htest.py
+++ b/Lib/idlelib/idle_test/htest.py
@@ -35,17 +35,51 @@
 
 AboutDialog_spec = {
     'file': 'aboutDialog',
-    'kwds': {'title': 'About test'},
-    'msg': "Try each button"
+    'kwds': {'title': 'aboutDialog test',
+             '_htest': True,
+             },
+    'msg': "Test every button. Ensure Python, TK and IDLE versions "
+           "are correctly displayed.\n [Close] to exit.",
+     }
+
+_calltip_window_spec = {
+    'file': 'CallTipWindow',
+    'kwds': {},
+    'msg': "Typing '(' should display a calltip.\n"
+           "Typing ') should hide the calltip.\n"
     }
 
+_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",
+     }
 
-_editor_window_spec = {
-    'file': 'EditorWindow',
+_color_delegator_spec = {
+    'file': 'ColorDelegator',
     'kwds': {},
-    'msg': "Test editor functions of interest"
+    'msg': "The text is sample Python code.\n"
+           "Ensure components like comments, keywords, builtins,\n"
+           "string, definitions, and break are correctly colored.\n"
+           "The default color scheme is in idlelib/config-highlight.def"
     }
 
+_dyn_option_menu_spec = {
+    'file': 'dynOptionMenuWidget',
+    'kwds': {},
+    'msg': "Select one of the many options in the 'old option set'.\n"
+           "Click the button to change the option set.\n"
+           "Select one of the many options in the 'new option set'."
+    }
+
+#_editor_window_spec = {
+#   'file': 'EditorWindow',
+#    'kwds': {},
+#    'msg': "Test editor functions of interest"
+#    }
+
 GetCfgSectionNameDialog_spec = {
     'file': 'configSectionNameDialog',
     'kwds': {'title':'Get Name',
@@ -54,7 +88,19 @@
              '_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]",
+           "Close 'Get Name' with a valid entry (printed to Shell), "
+           "[Cancel], or [X]",
+    }
+GetHelpSourceDialog_spec = {
+    'file': 'configHelpSourceEdit',
+    'kwds': {'title': 'Get helpsource',
+             '_htest': True},
+    'msg': "Enter menu item name and help file path\n "
+           "<nothing> and more than 30 chars are invalid menu item names.\n"
+           "<nothing>, file does not exist are invalid path items.\n"
+           "Test for incomplete web address for help file path.\n"
+           "A valid entry will be printed to shell with [0k].\n"
+           "[Cancel] will print None to shell",
     }
 
 _help_dialog_spec = {
@@ -63,30 +109,152 @@
     'msg': "If the help text displays, this works"
     }
 
-def run(test):
-    "Display a widget with callable *test* using a _spec dict"
+_io_binding_spec = {
+    'file': 'IOBinding',
+    'kwds': {},
+    'msg': "Test the following bindings\n"
+           "<Control-o> to display open window from file dialog.\n"
+           "<Control-s> 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, <Control-Key>,\n"
+           "<Alt-Key-a>, <Control-Key-a>, <Alt-Control-Key-a>, \n"
+           "<Control-Button-1>, <Alt-Button-1> and focussing out of the window\n"
+           "are sequences to be tested."
+    }
+
+_multistatus_bar_spec = {
+    'file': 'MultiStatusBar',
+    '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': 'ObjectBrowser',
+    'kwds': {},
+    'msg': "Double click on items upto the lowest level.\n"
+           "Attributes of the objects and related information "
+           "will be displayed side-by-side at each level."
+    }
+
+_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."
+    }
+
+_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."
+    }
+
+_tabbed_pages_spec = {
+    'file': 'tabbedpages',
+    'kwds': {},
+    'msg': "Toggle between the two tabs 'foo' and 'bar'\n"
+           "Add a tab by entering a suitable name for it.\n"
+           "Remove an existing tab by entering its name.\n"
+           "Remove all existing tabs.\n"
+           "<nothing> is an invalid add page and remove page name.\n"
+    }
+
+TextViewer_spec = {
+    'file': 'textView',
+    'kwds': {'title': 'Test textView',
+             'text':'The quick brown fox jumps over the lazy dog.\n'*35,
+             '_htest': True},
+    'msg': "Test for read-only property of text.\n"
+           "Text is selectable. Window is scrollable.",
+     }
+
+_tooltip_spec = {
+    'file': 'ToolTip',
+    'kwds': {},
+    'msg': "Place mouse cursor over both the buttons\n"
+           "A tooltip should appear with some text."
+    }
+
+_tree_widget_spec = {
+    'file': 'TreeWidget',
+    'kwds': {},
+    'msg': "You should see two canvas' 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."
+    }
+
+_widget_redirector_spec = {
+    'file': 'WidgetRedirector',
+    'kwds': {},
+    'msg': "Every text insert should be printed to console."
+    }
+
+def run(test=None):
     root = tk.Tk()
-    test_spec = globals()[test.__name__ + '_spec']
-    test_kwds = test_spec['kwds']
-    test_kwds['parent'] = root
+    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))
+    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))
+
+    help_string = tk.StringVar('')
+    test_name = tk.StringVar('')
+    callable_object = None
+    test_kwds = None
+
+
+    def next():
+        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()
+        help_string.set(test_spec['msg'])
+        test_name.set('test ' + test_spec['name'])
+        callable_object = test
+
 
     def run_test():
-        widget = test(**test_kwds)
+        widget = callable_object(**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()
+
+    label = tk.Label(root, textvariable=help_string, justify='left')
+    label.pack()
+    button = tk.Button(root, textvariable=test_name, command=run_test)
+    button.pack()
+    next_button = tk.Button(root, text="Next", command=next)
+    next_button.pack()
+
+    next()
+
     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()
+    run()
diff --git a/Lib/idlelib/tabbedpages.py b/Lib/idlelib/tabbedpages.py
--- a/Lib/idlelib/tabbedpages.py
+++ b/Lib/idlelib/tabbedpages.py
@@ -467,9 +467,12 @@
 
         self._tab_set.set_selected_tab(page_name)
 
-if __name__ == '__main__':
+def _tabbed_pages(parent):
     # test dialog
     root=Tk()
+    width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
+    root.geometry("+%d+%d"%(x, y + 175))
+    root.title("Test tabbed pages")
     tabPage=TabbedPageSet(root, page_names=['Foobar','Baz'], n_rows=0,
                           expand_tabs=False,
                           )
@@ -488,3 +491,8 @@
     labelPgName.pack(padx=5)
     entryPgName.pack(padx=5)
     root.mainloop()
+
+
+if __name__ == '__main__':
+    from idlelib.idle_test.htest import run
+    run(_tabbed_pages)
diff --git a/Lib/idlelib/textView.py b/Lib/idlelib/textView.py
--- a/Lib/idlelib/textView.py
+++ b/Lib/idlelib/textView.py
@@ -9,15 +9,17 @@
     """A simple text viewer dialog for IDLE
 
     """
-    def __init__(self, parent, title, text, modal=True):
+    def __init__(self, parent, title, text, modal=True, _htest=False):
         """Show the given text in a scrollable window with a 'close' button
 
+        _htest - bool, change box location when running htest
         """
         Toplevel.__init__(self, parent)
         self.configure(borderwidth=5)
+        # place dialog below parent if running htest
         self.geometry("=%dx%d+%d+%d" % (625, 500,
-                                        parent.winfo_rootx() + 10,
-                                        parent.winfo_rooty() + 10))
+                           parent.winfo_rootx() + 10,
+                           parent.winfo_rooty() + (10 if not _htest else 100)))
         #elguavas - config placeholders til config stuff completed
         self.bg = '#ffffff'
         self.fg = '#000000'
@@ -74,24 +76,6 @@
     else:
         return view_text(parent, title, contents, modal)
 
-
 if __name__ == '__main__':
-    #test the dialog
-    root=Tk()
-    root.title('textView test')
-    filename = './textView.py'
-    with open(filename, 'r') as f:
-        text = f.read()
-    btn1 = Button(root, text='view_text',
-                  command=lambda:view_text(root, 'view_text', text))
-    btn1.pack(side=LEFT)
-    btn2 = Button(root, text='view_file',
-                  command=lambda:view_file(root, 'view_file', filename))
-    btn2.pack(side=LEFT)
-    btn3 = Button(root, text='nonmodal view_text',
-                  command=lambda:view_text(root, 'nonmodal view_text', text,
-                                           modal=False))
-    btn3.pack(side=LEFT)
-    close = Button(root, text='Close', command=root.destroy)
-    close.pack(side=RIGHT)
-    root.mainloop()
+    from idlelib.idle_test.htest import run
+    run(TextViewer)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list