diff options
| author | Terry Jan Reedy <tjreedy@udel.edu> | 2016-05-17 03:32:28 (GMT) | 
|---|---|---|
| committer | Terry Jan Reedy <tjreedy@udel.edu> | 2016-05-17 03:32:28 (GMT) | 
| commit | 0495fa81e686ebfa40982e8a9298c3d50752cc58 (patch) | |
| tree | c093565bdfa25f5cfab00080244cf23b83a763a8 /Lib/idlelib/idle_test/test_undodelegator.py | |
| parent | 6b98ce23f686b5533ab4bcddfe2c9136565e4919 (diff) | |
| download | cpython-0495fa81e686ebfa40982e8a9298c3d50752cc58.zip cpython-0495fa81e686ebfa40982e8a9298c3d50752cc58.tar.gz cpython-0495fa81e686ebfa40982e8a9298c3d50752cc58.tar.bz2 | |
Issue #21703: Add test for undo delegator.  Patch most by Saimadhav Heblikar .
Diffstat (limited to 'Lib/idlelib/idle_test/test_undodelegator.py')
| -rw-r--r-- | Lib/idlelib/idle_test/test_undodelegator.py | 134 | 
1 files changed, 134 insertions, 0 deletions
| diff --git a/Lib/idlelib/idle_test/test_undodelegator.py b/Lib/idlelib/idle_test/test_undodelegator.py new file mode 100644 index 0000000..2657984 --- /dev/null +++ b/Lib/idlelib/idle_test/test_undodelegator.py @@ -0,0 +1,134 @@ +"""Unittest for UndoDelegator in idlelib.UndoDelegator. + +Coverage about 80% (retest). +""" +from test.support import requires +requires('gui') + +import unittest +from unittest.mock import Mock +from tkinter import Text, Tk +from idlelib.UndoDelegator import UndoDelegator +from idlelib.Percolator import Percolator + + +class UndoDelegatorTest(unittest.TestCase): + +    @classmethod +    def setUpClass(cls): +        cls.root = Tk() +        cls.text = Text(cls.root) +        cls.percolator = Percolator(cls.text) + +    @classmethod +    def tearDownClass(cls): +        cls.percolator.redir.close() +        cls.root.destroy() +        del cls.percolator, cls.text, cls.root + +    def setUp(self): +        self.delegator = UndoDelegator() +        self.percolator.insertfilter(self.delegator) +        self.delegator.bell = Mock(wraps=self.delegator.bell) + +    def tearDown(self): +        self.percolator.removefilter(self.delegator) +        self.text.delete('1.0', 'end') +        self.delegator.resetcache() + +    def test_undo_event(self): +        text = self.text + +        text.insert('insert', 'foobar') +        text.insert('insert', 'h') +        text.event_generate('<<undo>>') +        self.assertEqual(text.get('1.0', 'end'), '\n') + +        text.insert('insert', 'foo') +        text.insert('insert', 'bar') +        text.delete('1.2', '1.4') +        text.insert('insert', 'hello') +        text.event_generate('<<undo>>') +        self.assertEqual(text.get('1.0', '1.4'), 'foar') +        text.event_generate('<<undo>>') +        self.assertEqual(text.get('1.0', '1.6'), 'foobar') +        text.event_generate('<<undo>>') +        self.assertEqual(text.get('1.0', '1.3'), 'foo') +        text.event_generate('<<undo>>') +        self.delegator.undo_event('event') +        self.assertTrue(self.delegator.bell.called) + +    def test_redo_event(self): +        text = self.text + +        text.insert('insert', 'foo') +        text.insert('insert', 'bar') +        text.delete('1.0', '1.3') +        text.event_generate('<<undo>>') +        text.event_generate('<<redo>>') +        self.assertEqual(text.get('1.0', '1.3'), 'bar') +        text.event_generate('<<redo>>') +        self.assertTrue(self.delegator.bell.called) + +    def test_dump_event(self): +        """ +        Dump_event cannot be tested directly without changing +        environment variables. So, test statements in dump_event +        indirectly +        """ +        text = self.text +        d = self.delegator + +        text.insert('insert', 'foo') +        text.insert('insert', 'bar') +        text.delete('1.2', '1.4') +        self.assertTupleEqual((d.pointer, d.can_merge), (3, True)) +        text.event_generate('<<undo>>') +        self.assertTupleEqual((d.pointer, d.can_merge), (2, False)) + +    def test_get_set_saved(self): +        # test the getter method get_saved +        # test the setter method set_saved +        # indirectly test check_saved +        d = self.delegator + +        self.assertTrue(d.get_saved()) +        self.text.insert('insert', 'a') +        self.assertFalse(d.get_saved()) +        d.saved_change_hook = Mock() + +        d.set_saved(True) +        self.assertEqual(d.pointer, d.saved) +        self.assertTrue(d.saved_change_hook.called) + +        d.set_saved(False) +        self.assertEqual(d.saved, -1) +        self.assertTrue(d.saved_change_hook.called) + +    def test_undo_start_stop(self): +        # test the undo_block_start and undo_block_stop methods +        text = self.text + +        text.insert('insert', 'foo') +        self.delegator.undo_block_start() +        text.insert('insert', 'bar') +        text.insert('insert', 'bar') +        self.delegator.undo_block_stop() +        self.assertEqual(text.get('1.0', '1.3'), 'foo') + +        # test another code path +        self.delegator.undo_block_start() +        text.insert('insert', 'bar') +        self.delegator.undo_block_stop() +        self.assertEqual(text.get('1.0', '1.3'), 'foo') + +    def test_addcmd(self): +        text = self.text +        # when number of undo operations exceeds max_undo +        self.delegator.max_undo = max_undo = 10 +        for i in range(max_undo + 10): +            text.insert('insert', 'foo') +            self.assertLessEqual(len(self.delegator.undolist), max_undo) + +if __name__ == '__main__': +    unittest.main(verbosity=2, exit=False) | 
