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

terry.reedy python-checkins at python.org
Tue May 17 18:19:32 EDT 2016


https://hg.python.org/cpython/rev/c59f3c1a697d
changeset:   101412:c59f3c1a697d
parent:      101410:7ebfda7732d0
parent:      101411:2aee50cb27d0
user:        Terry Jan Reedy <tjreedy at udel.edu>
date:        Tue May 17 18:18:55 2016 -0400
summary:
  Merge with 3.5

files:
  Lib/idlelib/SearchDialog.py                |  28 ++-
  Lib/idlelib/idle_test/test_searchdialog.py |  80 ++++++++++
  2 files changed, 98 insertions(+), 10 deletions(-)


diff --git a/Lib/idlelib/SearchDialog.py b/Lib/idlelib/SearchDialog.py
--- a/Lib/idlelib/SearchDialog.py
+++ b/Lib/idlelib/SearchDialog.py
@@ -4,6 +4,7 @@
 from idlelib.SearchDialogBase import SearchDialogBase
 
 def _setup(text):
+    "Create or find the singleton SearchDialog instance."
     root = text._root()
     engine = SearchEngine.get(root)
     if not hasattr(engine, "_searchdialog"):
@@ -11,13 +12,16 @@
     return engine._searchdialog
 
 def find(text):
+    "Handle the editor edit menu item and corresponding event."
     pat = text.get("sel.first", "sel.last")
-    return _setup(text).open(text,pat)
+    return _setup(text).open(text, pat)  # Open is inherited from SDBase.
 
 def find_again(text):
+    "Handle the editor edit menu item and corresponding event."
     return _setup(text).find_again(text)
 
 def find_selection(text):
+    "Handle the editor edit menu item and corresponding event."
     return _setup(text).find_selection(text)
 
 class SearchDialog(SearchDialogBase):
@@ -66,24 +70,28 @@
             self.engine.setcookedpat(pat)
         return self.find_again(text)
 
-def _search_dialog(parent):
-    root = Tk()
-    root.title("Test SearchDialog")
+
+def _search_dialog(parent):  # htest #
+    '''Display search test box.'''
+    box = Toplevel(parent)
+    box.title("Test SearchDialog")
     width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
-    root.geometry("+%d+%d"%(x, y + 150))
-    text = Text(root)
+    box.geometry("+%d+%d"%(x, y + 150))
+    text = Text(box, inactiveselectbackground='gray')
     text.pack()
-    text.insert("insert","This is a sample string.\n"*10)
+    text.insert("insert","This is a sample string.\n"*5)
 
     def show_find():
         text.tag_add(SEL, "1.0", END)
-        s = _setup(text)
-        s.open(text)
+        _setup(text).open(text)
         text.tag_remove(SEL, "1.0", END)
 
-    button = Button(root, text="Search", command=show_find)
+    button = Button(box, text="Search (selection ignored)", command=show_find)
     button.pack()
 
 if __name__ == '__main__':
+    import unittest
+    unittest.main('idlelib.idle_test.test_searchdialog',
+                  verbosity=2, exit=False)
     from idlelib.idle_test.htest import run
     run(_search_dialog)
diff --git a/Lib/idlelib/idle_test/test_searchdialog.py b/Lib/idlelib/idle_test/test_searchdialog.py
new file mode 100644
--- /dev/null
+++ b/Lib/idlelib/idle_test/test_searchdialog.py
@@ -0,0 +1,80 @@
+"""Test SearchDialog class in SearchDialogue.py"""
+
+# Does not currently test the event handler wrappers.
+# A usage test should simulate clicks and check hilighting.
+# Tests need to be coordinated with SearchDialogBase tests
+# to avoid duplication.
+
+from test.support import requires
+requires('gui')
+
+import unittest
+import tkinter as tk
+from tkinter import BooleanVar
+import idlelib.SearchEngine as se
+import idlelib.SearchDialog as sd
+
+
+class SearchDialogTest(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls.root = tk.Tk()
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.root.destroy()
+        del cls.root
+
+    def setUp(self):
+        self.engine = se.SearchEngine(self.root)
+        self.dialog = sd.SearchDialog(self.root, self.engine)
+        self.text = tk.Text()
+        self.text.insert('1.0', 'Hello World!')
+
+    def test_find_again(self):
+        # Search for various expressions
+        text = self.text
+
+        self.engine.setpat('')
+        self.assertFalse(self.dialog.find_again(text))
+
+        self.engine.setpat('Hello')
+        self.assertTrue(self.dialog.find_again(text))
+
+        self.engine.setpat('Goodbye')
+        self.assertFalse(self.dialog.find_again(text))
+
+        self.engine.setpat('World!')
+        self.assertTrue(self.dialog.find_again(text))
+
+        self.engine.setpat('Hello World!')
+        self.assertTrue(self.dialog.find_again(text))
+
+        # Regular expression
+        self.engine.revar = BooleanVar(self.root, True)
+        self.engine.setpat('W[aeiouy]r')
+        self.assertTrue(self.dialog.find_again(text))
+
+    def test_find_selection(self):
+        # Select some text and make sure it's found
+        text = self.text
+        # Add additional line to find
+        self.text.insert('2.0', 'Hello World!')
+
+        text.tag_add('sel', '1.0', '1.4')       # Select 'Hello'
+        self.assertTrue(self.dialog.find_selection(text))
+
+        text.tag_remove('sel', '1.0', 'end')
+        text.tag_add('sel', '1.6', '1.11')      # Select 'World!'
+        self.assertTrue(self.dialog.find_selection(text))
+
+        text.tag_remove('sel', '1.0', 'end')
+        text.tag_add('sel', '1.0', '1.11')      # Select 'Hello World!'
+        self.assertTrue(self.dialog.find_selection(text))
+
+        # Remove additional line
+        text.delete('2.0', 'end')
+
+if __name__ == '__main__':
+    unittest.main(verbosity=2, exit=2)

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


More information about the Python-checkins mailing list