diff -r a5e62fa97eba Lib/idlelib/SearchEngine.py --- a/Lib/idlelib/SearchEngine.py Wed Jul 17 22:20:37 2013 -0400 +++ b/Lib/idlelib/SearchEngine.py Wed Jul 17 23:24:52 2013 -0400 @@ -218,3 +218,8 @@ def get_line_col(index): line, col = map(int, index.split(".")) # Fails on invalid index return line, col + +if __name__ == "__main__": + from test import support; support.use_resources = ['gui'] + import unittest + unittest.main('idlelib.idle_test.test_searchengine', verbosity=2, exit=False) diff -r a5e62fa97eba Lib/idlelib/idle_test/mock_tk.py --- a/Lib/idlelib/idle_test/mock_tk.py Wed Jul 17 22:20:37 2013 -0400 +++ b/Lib/idlelib/idle_test/mock_tk.py Wed Jul 17 23:24:52 2013 -0400 @@ -141,6 +141,12 @@ return None else: index = self.tags['sel.last'] + elif index == 'end-1c': + # need to implement a more flexible way for dealing with indices + # and modifier expressions + line = max(len(self.data) - 2, 1) + char = max(len(self.data[line]) - 1, 0) + return line, char line, char = index.split('.') line = int(line) diff -r a5e62fa97eba Lib/idlelib/idle_test/test_searchengine.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_searchengine.py Wed Jul 17 23:24:52 2013 -0400 @@ -0,0 +1,94 @@ +import unittest +from test.support import requires +from idlelib.idle_test.mock_tk import Text, Var +import idlelib.SearchEngine as se +import re + +class Dummy_searchengine(se.SearchEngine): + def __init__(self): + self.patvar = Var(True) # search pattern + self.revar = Var(True) # regular expression? + self.casevar = Var(True) # match case? + self.wordvar = Var(True) # match whole word? + self.wrapvar = Var(True) # wrap around buffer? + self.wrapvar.set(1) # (on by default) + self.backvar = Var(False) # search backwards? + +searchengine = Dummy_searchengine() + +class SearchEngineTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + cls.text = Text() + cls.searchengine = searchengine + + def test_search_text(self): + testtext = ( + "from string import Template\n" + "s = Template('$who likes $what')\n" + "s.substitute(who='tim', what='kung pao')\n" + "d = dict(who='tim')\n" + "Template('Give $who $100').substitute(d)\n" + "Template('$who likes $what').substitute(d)\n" + "Template('$who likes $what').safe_substitute(d)\n") + + self.text.insert('1.0', testtext) + pat = re.compile("substitute") + + # Search forward from cursor at 1.0 + self.text.tag_add('insert', '1.0') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + # searchresult is a tuple in the form (lineno, matchobject) + self.assertEqual(searchresult[0], 3) # test line match + self.assertEqual(searchresult[1].span()[0], 2) # test column match + + # Test that search wraps around to beginning of text + self.text.tag_add('insert', '7.38') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult[0], 3) + self.assertEqual(searchresult[1].span()[0], 2) + + # Test that search doesn't wrap forward when wrapvar set to 0 + searchengine.wrapvar.set(0) + self.text.tag_add('insert', '7.38') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult, None) + + # Test that search doesn't wrap in reverse when wrapvar set to 0 + searchengine.backvar.set(1) + self.text.tag_add('insert', '2.4') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult, None) + searchengine.wrapvar.set(1) + + # Test that search reverses when backvar is set to 1 + self.text.tag_add('insert', '6.5') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult[0], 5) + self.assertEqual(searchresult[1].span()[0], 27) + + # Test that search wraps around backwards to end of text + self.text.tag_add('insert', '1.5') + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult[0], 7) + self.assertEqual(searchresult[1].span()[0], 34) + searchengine.backvar.set(0) + + # Test empty match with 'ok' flag set and 'string' on line 1 selected + self.text.tag_add('sel.first', '1.5') + self.text.tag_add('sel.last', '1.10') + searchengine.backvar.set(0) + pat = re.compile("\w*") + searchresult = self.searchengine.search_text(text=self.text, + prog=pat, ok=1) + self.assertEqual(searchresult[0], 1) + self.assertEqual(searchresult[1].span()[0], 5) + + # Test empty match with 'ok' flag not set and 'string' selected + searchresult = self.searchengine.search_text(text=self.text, prog=pat) + self.assertEqual(searchresult[0], 1) + self.assertEqual(searchresult[1].span()[0], 10) + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=2)