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

Skip to content

Commit 0495fa8

Browse files
committed
Issue #21703: Add test for undo delegator. Patch most by Saimadhav Heblikar .
1 parent 6b98ce2 commit 0495fa8

2 files changed

Lines changed: 148 additions & 11 deletions

File tree

Lib/idlelib/UndoDelegator.py

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -336,30 +336,33 @@ def bump_depth(self, incr=1):
336336
self.depth = self.depth + incr
337337
return self.depth
338338

339-
def _undo_delegator(parent):
339+
340+
def _undo_delegator(parent): # htest #
341+
import re
342+
import tkinter as tk
340343
from idlelib.Percolator import Percolator
341-
root = Tk()
342-
root.title("Test UndoDelegator")
344+
undowin = tk.Toplevel()
345+
undowin.title("Test UndoDelegator")
343346
width, height, x, y = list(map(int, re.split('[x+]', parent.geometry())))
344-
root.geometry("+%d+%d"%(x, y + 150))
347+
undowin.geometry("+%d+%d"%(x, y + 150))
345348

346-
text = Text(root)
347-
text.config(height=10)
349+
text = Text(undowin, height=10)
348350
text.pack()
349351
text.focus_set()
350352
p = Percolator(text)
351353
d = UndoDelegator()
352354
p.insertfilter(d)
353355

354-
undo = Button(root, text="Undo", command=lambda:d.undo_event(None))
356+
undo = Button(undowin, text="Undo", command=lambda:d.undo_event(None))
355357
undo.pack(side='left')
356-
redo = Button(root, text="Redo", command=lambda:d.redo_event(None))
358+
redo = Button(undowin, text="Redo", command=lambda:d.redo_event(None))
357359
redo.pack(side='left')
358-
dump = Button(root, text="Dump", command=lambda:d.dump_event(None))
360+
dump = Button(undowin, text="Dump", command=lambda:d.dump_event(None))
359361
dump.pack(side='left')
360362

361-
root.mainloop()
362-
363363
if __name__ == "__main__":
364+
import unittest
365+
unittest.main('idlelib.idle_test.test_undodelegator', verbosity=2,
366+
exit=False)
364367
from idlelib.idle_test.htest import run
365368
run(_undo_delegator)
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
"""Unittest for UndoDelegator in idlelib.UndoDelegator.
2+
3+
Coverage about 80% (retest).
4+
"""
5+
from test.support import requires
6+
requires('gui')
7+
8+
import unittest
9+
from unittest.mock import Mock
10+
from tkinter import Text, Tk
11+
from idlelib.UndoDelegator import UndoDelegator
12+
from idlelib.Percolator import Percolator
13+
14+
15+
class UndoDelegatorTest(unittest.TestCase):
16+
17+
@classmethod
18+
def setUpClass(cls):
19+
cls.root = Tk()
20+
cls.text = Text(cls.root)
21+
cls.percolator = Percolator(cls.text)
22+
23+
@classmethod
24+
def tearDownClass(cls):
25+
cls.percolator.redir.close()
26+
cls.root.destroy()
27+
del cls.percolator, cls.text, cls.root
28+
29+
def setUp(self):
30+
self.delegator = UndoDelegator()
31+
self.percolator.insertfilter(self.delegator)
32+
self.delegator.bell = Mock(wraps=self.delegator.bell)
33+
34+
def tearDown(self):
35+
self.percolator.removefilter(self.delegator)
36+
self.text.delete('1.0', 'end')
37+
self.delegator.resetcache()
38+
39+
def test_undo_event(self):
40+
text = self.text
41+
42+
text.insert('insert', 'foobar')
43+
text.insert('insert', 'h')
44+
text.event_generate('<<undo>>')
45+
self.assertEqual(text.get('1.0', 'end'), '\n')
46+
47+
text.insert('insert', 'foo')
48+
text.insert('insert', 'bar')
49+
text.delete('1.2', '1.4')
50+
text.insert('insert', 'hello')
51+
text.event_generate('<<undo>>')
52+
self.assertEqual(text.get('1.0', '1.4'), 'foar')
53+
text.event_generate('<<undo>>')
54+
self.assertEqual(text.get('1.0', '1.6'), 'foobar')
55+
text.event_generate('<<undo>>')
56+
self.assertEqual(text.get('1.0', '1.3'), 'foo')
57+
text.event_generate('<<undo>>')
58+
self.delegator.undo_event('event')
59+
self.assertTrue(self.delegator.bell.called)
60+
61+
def test_redo_event(self):
62+
text = self.text
63+
64+
text.insert('insert', 'foo')
65+
text.insert('insert', 'bar')
66+
text.delete('1.0', '1.3')
67+
text.event_generate('<<undo>>')
68+
text.event_generate('<<redo>>')
69+
self.assertEqual(text.get('1.0', '1.3'), 'bar')
70+
text.event_generate('<<redo>>')
71+
self.assertTrue(self.delegator.bell.called)
72+
73+
def test_dump_event(self):
74+
"""
75+
Dump_event cannot be tested directly without changing
76+
environment variables. So, test statements in dump_event
77+
indirectly
78+
"""
79+
text = self.text
80+
d = self.delegator
81+
82+
text.insert('insert', 'foo')
83+
text.insert('insert', 'bar')
84+
text.delete('1.2', '1.4')
85+
self.assertTupleEqual((d.pointer, d.can_merge), (3, True))
86+
text.event_generate('<<undo>>')
87+
self.assertTupleEqual((d.pointer, d.can_merge), (2, False))
88+
89+
def test_get_set_saved(self):
90+
# test the getter method get_saved
91+
# test the setter method set_saved
92+
# indirectly test check_saved
93+
d = self.delegator
94+
95+
self.assertTrue(d.get_saved())
96+
self.text.insert('insert', 'a')
97+
self.assertFalse(d.get_saved())
98+
d.saved_change_hook = Mock()
99+
100+
d.set_saved(True)
101+
self.assertEqual(d.pointer, d.saved)
102+
self.assertTrue(d.saved_change_hook.called)
103+
104+
d.set_saved(False)
105+
self.assertEqual(d.saved, -1)
106+
self.assertTrue(d.saved_change_hook.called)
107+
108+
def test_undo_start_stop(self):
109+
# test the undo_block_start and undo_block_stop methods
110+
text = self.text
111+
112+
text.insert('insert', 'foo')
113+
self.delegator.undo_block_start()
114+
text.insert('insert', 'bar')
115+
text.insert('insert', 'bar')
116+
self.delegator.undo_block_stop()
117+
self.assertEqual(text.get('1.0', '1.3'), 'foo')
118+
119+
# test another code path
120+
self.delegator.undo_block_start()
121+
text.insert('insert', 'bar')
122+
self.delegator.undo_block_stop()
123+
self.assertEqual(text.get('1.0', '1.3'), 'foo')
124+
125+
def test_addcmd(self):
126+
text = self.text
127+
# when number of undo operations exceeds max_undo
128+
self.delegator.max_undo = max_undo = 10
129+
for i in range(max_undo + 10):
130+
text.insert('insert', 'foo')
131+
self.assertLessEqual(len(self.delegator.undolist), max_undo)
132+
133+
if __name__ == '__main__':
134+
unittest.main(verbosity=2, exit=False)

0 commit comments

Comments
 (0)