diff -r baca52bb5c74 Lib/idlelib/ParenMatch.py --- a/Lib/idlelib/ParenMatch.py Sat Jun 07 20:14:26 2014 -0700 +++ b/Lib/idlelib/ParenMatch.py Sun Jun 08 18:58:59 2014 +0530 @@ -90,7 +90,8 @@ self.set_timeout = self.set_timeout_none def flash_paren_event(self, event): - indices = HyperParser(self.editwin, "insert").get_surrounding_brackets() + indices = HyperParser(self.editwin, + "insert").get_surrounding_brackets() if indices is None: self.warn_mismatched() return @@ -170,3 +171,6 @@ self.editwin.text_frame.after(self.FLASH_DELAY, lambda self=self, c=self.counter: \ self.handle_restore_timer(c)) +if __name__ == '__main__': + import unittest + unittest.main('idlelib.idle_test.test_parenmatch', verbosity=2) diff -r baca52bb5c74 Lib/idlelib/idle_test/test_parenmatch.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_parenmatch.py Sun Jun 08 18:58:59 2014 +0530 @@ -0,0 +1,104 @@ +"""Unittest for idlelib.ParenMatch""" +import unittest +from unittest.mock import Mock +from test.support import requires +from idlelib.ParenMatch import ParenMatch +from tkinter import Text +#from idlelib.idle_test.mock_tk import Text + +class DummyEditwin: + def __init__(self, text): + self.text = text + self.indentwidth = 8 + self.tabwidth = 8 + self.context_use_ps1 = True + +class ParenMatchTest(unittest.TestCase): + + @classmethod + def setUpClass(cls): + requires('gui') + cls.text = Text() + cls.editwin = DummyEditwin(cls.text) + cls.editwin.text_frame = Mock() + cls.orig_style = ParenMatch.STYLE + + @classmethod + def tearDownClass(cls): + cls.text.destroy() + del cls.text + ParenMatch.STYLE = cls.orig_style + + def tearDown(self): + self.text.delete('1.0', 'end') + ParenMatch.STYLE = self.orig_style + + def test_paren_expression(self): + """ + Test ParenMatch with 'expression' style + """ + text = self.text + ParenMatch.STYLE = 'expression' + pm = ParenMatch(self.editwin) + + text.insert('insert', 'def foobar(a, b') + pm.flash_paren_event('event') + self.assertIn('<>', text.event_info()) + self.assertTupleEqual(text.tag_prevrange('paren', 'end'), + ('1.10', '1.15')) + text.insert('insert', ')') + pm.restore_event() + self.assertNotIn('<>', text.event_info()) + self.assertEqual(text.tag_prevrange('paren', 'end'), ()) + + # paren_closed_event can only be tested as below + pm.paren_closed_event('event') + self.assertTupleEqual(text.tag_prevrange('paren', 'end'), + ('1.10', '1.16')) + + def test_paren_default(self): + """ + Test ParenMatch with 'default' style + """ + text = self.text + ParenMatch.STYLE = 'default' + pm = ParenMatch(self.editwin) + + text.insert('insert', 'def foobar(a, b') + pm.flash_paren_event('event') + self.assertIn('<>', text.event_info()) + self.assertTupleEqual(text.tag_prevrange('paren', 'end'), + ('1.10', '1.11')) + text.insert('insert', ')') + pm.restore_event() + self.assertNotIn('<>', text.event_info()) + self.assertEqual(text.tag_prevrange('paren', 'end'), ()) + + def test_paren_corner(self): + """ + Test corner cases in flash_paren_event and paren_closed_event + """ + text = self.text + pm = ParenMatch(self.editwin) + + text.insert('insert', '# this is a commen)') + self.assertIsNone(pm.paren_closed_event('event')) + + text.insert('insert', '\ndef') + self.assertIsNone(pm.flash_paren_event('event')) + self.assertIsNone(pm.paren_closed_event('event')) + + text.insert('insert', ' a, *arg)') + self.assertIsNone(pm.paren_closed_event('event')) + + def test_handle_restore_timer(self): + pm = ParenMatch(self.editwin) + pm.restore_event = Mock() + pm.handle_restore_timer(0) + self.assertTrue(pm.restore_event.called) + pm.restore_event.reset_mock() + pm.handle_restore_timer(1) + self.assertFalse(pm.restore_event.called) + +if __name__ == '__main__': + unittest.main(verbosity=2, exit=False)