From b236fe45150ed41e5e052537dc6a213286b9d967 Mon Sep 17 00:00:00 2001 From: Terry Jan Reedy Date: Tue, 17 May 2016 18:18:37 -0400 Subject: =?UTF-8?q?Issue=20#18410:=20Test=20IDLE's=20search=20dialog;=20or?= =?UTF-8?q?iginal=20patch=20by=20Westley=20Mart=C3=ADnez.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/idlelib/SearchDialog.py | 28 +++++++---- Lib/idlelib/idle_test/test_searchdialog.py | 80 ++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 10 deletions(-) create mode 100644 Lib/idlelib/idle_test/test_searchdialog.py diff --git a/Lib/idlelib/SearchDialog.py b/Lib/idlelib/SearchDialog.py index 77ef7b9..765d53f 100644 --- a/Lib/idlelib/SearchDialog.py +++ b/Lib/idlelib/SearchDialog.py @@ -4,6 +4,7 @@ from idlelib import SearchEngine 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 @@ def _setup(text): 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 @@ class SearchDialog(SearchDialogBase): 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 index 0000000..1c06e6c --- /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) -- cgit v0.12