| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  | "Test undo, coverage 77%." | 
					
						
							|  |  |  | # Only test UndoDelegator so far. | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  | from idlelib.undo import UndoDelegator | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  | from test.support import requires | 
					
						
							|  |  |  | requires('gui') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from unittest.mock import Mock | 
					
						
							|  |  |  | from tkinter import Text, Tk | 
					
						
							| 
									
										
										
										
											2016-05-28 13:22:31 -04:00
										 |  |  | from idlelib.percolator import Percolator | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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() | 
					
						
							| 
									
										
										
										
											2016-06-03 22:19:17 -04:00
										 |  |  |         del cls.percolator, cls.text | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  |         cls.root.destroy() | 
					
						
							| 
									
										
										
										
											2016-06-03 22:19:17 -04:00
										 |  |  |         del cls.root | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         self.delegator = UndoDelegator() | 
					
						
							| 
									
										
										
										
											2016-08-10 23:44:54 -04:00
										 |  |  |         self.delegator.bell = Mock() | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  |         self.percolator.insertfilter(self.delegator) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-19 19:12:52 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-16 23:32:28 -04:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main(verbosity=2, exit=False) |