Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 14fbe72

Browse files
committed
Issue #21694: Add unittest for ParenMatch. Patch by Saimadhav Heblikar.
1 parent 67fbed5 commit 14fbe72

2 files changed

Lines changed: 119 additions & 4 deletions

File tree

Lib/idlelib/ParenMatch.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ def set_style(self, style):
9090
self.set_timeout = self.set_timeout_none
9191

9292
def flash_paren_event(self, event):
93-
indices = HyperParser(self.editwin, "insert").get_surrounding_brackets()
93+
indices = (HyperParser(self.editwin, "insert")
94+
.get_surrounding_brackets())
9495
if indices is None:
9596
self.warn_mismatched()
9697
return
@@ -167,6 +168,11 @@ def set_timeout_last(self):
167168
# associate a counter with an event; only disable the "paren"
168169
# tag if the event is for the most recent timer.
169170
self.counter += 1
170-
self.editwin.text_frame.after(self.FLASH_DELAY,
171-
lambda self=self, c=self.counter: \
172-
self.handle_restore_timer(c))
171+
self.editwin.text_frame.after(
172+
self.FLASH_DELAY,
173+
lambda self=self, c=self.counter: self.handle_restore_timer(c))
174+
175+
176+
if __name__ == '__main__':
177+
import unittest
178+
unittest.main('idlelib.idle_test.test_parenmatch', verbosity=2)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
"""Test idlelib.ParenMatch."""
2+
# This must currently be a gui test because ParenMatch methods use
3+
# several text methods not defined on idlelib.idle_test.mock_tk.Text.
4+
5+
import unittest
6+
from unittest.mock import Mock
7+
from test.support import requires
8+
from tkinter import Tk, Text
9+
from idlelib.ParenMatch import ParenMatch
10+
11+
class DummyEditwin:
12+
def __init__(self, text):
13+
self.text = text
14+
self.indentwidth = 8
15+
self.tabwidth = 8
16+
self.context_use_ps1 = True
17+
18+
19+
class ParenMatchTest(unittest.TestCase):
20+
21+
@classmethod
22+
def setUpClass(cls):
23+
requires('gui')
24+
cls.root = Tk()
25+
cls.text = Text(cls.root)
26+
cls.editwin = DummyEditwin(cls.text)
27+
cls.editwin.text_frame = Mock()
28+
29+
@classmethod
30+
def tearDownClass(cls):
31+
del cls.text, cls.editwin
32+
cls.root.destroy()
33+
del cls.root
34+
35+
def tearDown(self):
36+
self.text.delete('1.0', 'end')
37+
38+
def test_paren_expression(self):
39+
"""
40+
Test ParenMatch with 'expression' style.
41+
"""
42+
text = self.text
43+
pm = ParenMatch(self.editwin)
44+
pm.set_style('expression')
45+
46+
text.insert('insert', 'def foobar(a, b')
47+
pm.flash_paren_event('event')
48+
self.assertIn('<<parenmatch-check-restore>>', text.event_info())
49+
self.assertTupleEqual(text.tag_prevrange('paren', 'end'),
50+
('1.10', '1.15'))
51+
text.insert('insert', ')')
52+
pm.restore_event()
53+
self.assertNotIn('<<parenmatch-check-restore>>', text.event_info())
54+
self.assertEqual(text.tag_prevrange('paren', 'end'), ())
55+
56+
# paren_closed_event can only be tested as below
57+
pm.paren_closed_event('event')
58+
self.assertTupleEqual(text.tag_prevrange('paren', 'end'),
59+
('1.10', '1.16'))
60+
61+
def test_paren_default(self):
62+
"""
63+
Test ParenMatch with 'default' style.
64+
"""
65+
text = self.text
66+
pm = ParenMatch(self.editwin)
67+
pm.set_style('default')
68+
69+
text.insert('insert', 'def foobar(a, b')
70+
pm.flash_paren_event('event')
71+
self.assertIn('<<parenmatch-check-restore>>', text.event_info())
72+
self.assertTupleEqual(text.tag_prevrange('paren', 'end'),
73+
('1.10', '1.11'))
74+
text.insert('insert', ')')
75+
pm.restore_event()
76+
self.assertNotIn('<<parenmatch-check-restore>>', text.event_info())
77+
self.assertEqual(text.tag_prevrange('paren', 'end'), ())
78+
79+
def test_paren_corner(self):
80+
"""
81+
Test corner cases in flash_paren_event and paren_closed_event.
82+
83+
These cases force conditional expression and alternate paths.
84+
"""
85+
text = self.text
86+
pm = ParenMatch(self.editwin)
87+
88+
text.insert('insert', '# this is a commen)')
89+
self.assertIsNone(pm.paren_closed_event('event'))
90+
91+
text.insert('insert', '\ndef')
92+
self.assertIsNone(pm.flash_paren_event('event'))
93+
self.assertIsNone(pm.paren_closed_event('event'))
94+
95+
text.insert('insert', ' a, *arg)')
96+
self.assertIsNone(pm.paren_closed_event('event'))
97+
98+
def test_handle_restore_timer(self):
99+
pm = ParenMatch(self.editwin)
100+
pm.restore_event = Mock()
101+
pm.handle_restore_timer(0)
102+
self.assertTrue(pm.restore_event.called)
103+
pm.restore_event.reset_mock()
104+
pm.handle_restore_timer(1)
105+
self.assertFalse(pm.restore_event.called)
106+
107+
108+
if __name__ == '__main__':
109+
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)