Coverage for idle_test/test_undo.py: 4%
97 statements
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-11 13:22 -0700
« prev ^ index » next coverage.py v7.2.5, created at 2023-05-11 13:22 -0700
1"Test undo, coverage 77%."
2# Only test UndoDelegator so far.
4from idlelib.undo import UndoDelegator
5import unittest
6from test.support import requires
7requires('gui')
9from unittest.mock import Mock
10from tkinter import Text, Tk
11from idlelib.percolator import Percolator
14class UndoDelegatorTest(unittest.TestCase):
16 @classmethod
17 def setUpClass(cls):
18 cls.root = Tk()
19 cls.text = Text(cls.root)
20 cls.percolator = Percolator(cls.text)
22 @classmethod
23 def tearDownClass(cls):
24 cls.percolator.redir.close()
25 del cls.percolator, cls.text
26 cls.root.destroy()
27 del cls.root
29 def setUp(self):
30 self.delegator = UndoDelegator()
31 self.delegator.bell = Mock()
32 self.percolator.insertfilter(self.delegator)
34 def tearDown(self):
35 self.percolator.removefilter(self.delegator)
36 self.text.delete('1.0', 'end')
37 self.delegator.resetcache()
39 def test_undo_event(self):
40 text = self.text
42 text.insert('insert', 'foobar')
43 text.insert('insert', 'h')
44 text.event_generate('<<undo>>')
45 self.assertEqual(text.get('1.0', 'end'), '\n')
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)
61 def test_redo_event(self):
62 text = self.text
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)
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
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))
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
95 self.assertTrue(d.get_saved())
96 self.text.insert('insert', 'a')
97 self.assertFalse(d.get_saved())
98 d.saved_change_hook = Mock()
100 d.set_saved(True)
101 self.assertEqual(d.pointer, d.saved)
102 self.assertTrue(d.saved_change_hook.called)
104 d.set_saved(False)
105 self.assertEqual(d.saved, -1)
106 self.assertTrue(d.saved_change_hook.called)
108 def test_undo_start_stop(self):
109 # test the undo_block_start and undo_block_stop methods
110 text = self.text
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')
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')
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)
134if __name__ == '__main__':
135 unittest.main(verbosity=2, exit=False)