" Test history, coverage 100%." from idlelib.history import History import unittest from test.support import requires import tkinter as tk from tkinter import Text as tkText from idlelib.idle_test.mock_tk import Text as mkText from idlelib.config import idleConf line1 = 'a = 7' line2 = 'b = a' class StoreTest(unittest.TestCase): '''Tests History.__init__ and History.store with mock Text''' @classmethod def setUpClass(cls): cls.text = mkText() cls.history = History(cls.text) def tearDown(self): self.text.delete('1.0', 'end') self.history.history = [] def test_init(self): self.assertIs(self.history.text, self.text) self.assertEqual(self.history.history, []) self.assertIsNone(self.history.prefix) self.assertIsNone(self.history.pointer) self.assertEqual(self.history.cyclic, idleConf.GetOption("main", "History", "cyclic", 1, "bool")) def test_store_short(self): self.history.store('a') self.assertEqual(self.history.history, []) self.history.store(' a ') self.assertEqual(self.history.history, []) def test_store_dup(self): self.history.store(line1) self.assertEqual(self.history.history, [line1]) self.history.store(line2) self.assertEqual(self.history.history, [line1, line2]) self.history.store(line1) self.assertEqual(self.history.history, [line2, line1]) def test_store_reset(self): self.history.prefix = line1 self.history.pointer = 0 self.history.store(line2) self.assertIsNone(self.history.prefix) self.assertIsNone(self.history.pointer) class TextWrapper: def __init__(self, master): self.text = tkText(master=master) self._bell = False def __getattr__(self, name): return getattr(self.text, name) def bell(self): self._bell = True class FetchTest(unittest.TestCase): '''Test History.fetch with wrapped tk.Text. ''' @classmethod def setUpClass(cls): requires('gui') cls.root = tk.Tk() cls.root.withdraw() def setUp(self): self.text = text = TextWrapper(self.root) text.insert('1.0', ">>> ") text.mark_set('iomark', '1.4') text.mark_gravity('iomark', 'left') self.history = History(text) self.history.history = [line1, line2] @classmethod def tearDownClass(cls): cls.root.destroy() del cls.root def fetch_test(self, reverse, line, prefix, index, *, bell=False): # Perform one fetch as invoked by Alt-N or Alt-P # Test the result. The line test is the most important. # The last two are diagnostic of fetch internals. History = self.history History.fetch(reverse) Equal = self.assertEqual Equal(self.text.get('iomark', 'end-1c'), line) Equal(self.text._bell, bell) if bell: self.text._bell = False Equal(History.prefix, prefix) Equal(History.pointer, index) Equal(self.text.compare("insert", '==', "end-1c"), 1) def test_fetch_prev_cyclic(self): prefix = '' test = self.fetch_test test(True, line2, prefix, 1) test(True, line1, prefix, 0) test(True, prefix, None, None, bell=True) def test_fetch_next_cyclic(self): prefix = '' test = self.fetch_test test(False, line1, prefix, 0) test(False, line2, prefix, 1) test(False, prefix, None, None, bell=True) # Prefix 'a' tests skip line2, which starts with 'b' def test_fetch_prev_prefix(self): prefix = 'a' self.text.insert('iomark', prefix) self.fetch_test(True, line1, prefix, 0) self.fetch_test(True, prefix, None, None, bell=True) def test_fetch_next_prefix(self): prefix = 'a' self.text.insert('iomark', prefix) self.fetch_test(False, line1, prefix, 0) self.fetch_test(False, prefix, None, None, bell=True) def test_fetch_prev_noncyclic(self): prefix = '' self.history.cyclic = False test = self.fetch_test test(True, line2, prefix, 1) test(True, line1, prefix, 0) test(True, line1, prefix, 0, bell=True) def test_fetch_next_noncyclic(self): prefix = '' self.history.cyclic = False test = self.fetch_test test(False, prefix, None, None, bell=True) test(True, line2, prefix, 1) test(False, prefix, None, None, bell=True) test(False, prefix, None, None, bell=True) def test_fetch_cursor_move(self): # Move cursor after fetch self.history.fetch(reverse=True) # initialization self.text.mark_set('insert', 'iomark') self.fetch_test(True, line2, None, None, bell=True) def test_fetch_edit(self): # Edit after fetch self.history.fetch(reverse=True) # initialization self.text.delete('iomark', 'insert', ) self.text.insert('iomark', 'a =') self.fetch_test(True, line1, 'a =', 0) # prefix is reset def test_history_prev_next(self): # Minimally test functions bound to events self.history.history_prev('dummy event') self.assertEqual(self.history.pointer, 1) self.history.history_next('dummy event') self.assertEqual(self.history.pointer, None) if __name__ == '__main__': unittest.main(verbosity=2, exit=2)
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
__pycache__ | Folder | 0755 |
|
|
README.txt | File | 8.52 KB | 0644 |
|
__init__.py | File | 712 B | 0644 |
|
htest.py | File | 13.67 KB | 0644 |
|
mock_idle.py | File | 1.83 KB | 0644 |
|
mock_tk.py | File | 11.35 KB | 0644 |
|
template.py | File | 642 B | 0644 |
|
test_autocomplete.py | File | 4.99 KB | 0644 |
|
test_autocomplete_w.py | File | 709 B | 0644 |
|
test_autoexpand.py | File | 4.53 KB | 0644 |
|
test_browser.py | File | 7.8 KB | 0644 |
|
test_calltip.py | File | 7.6 KB | 0644 |
|
test_calltip_w.py | File | 686 B | 0644 |
|
test_codecontext.py | File | 14.15 KB | 0644 |
|
test_colorizer.py | File | 1.03 KB | 0644 |
|
test_config.py | File | 32.04 KB | 0644 |
|
test_config_key.py | File | 3.61 KB | 0644 |
|
test_configdialog.py | File | 48.6 KB | 0644 |
|
test_debugger.py | File | 571 B | 0644 |
|
test_debugger_r.py | File | 631 B | 0644 |
|
test_debugobj.py | File | 1.52 KB | 0644 |
|
test_debugobj_r.py | File | 545 B | 0644 |
|
test_delegator.py | File | 1.53 KB | 0644 |
|
test_editmenu.py | File | 2.5 KB | 0644 |
|
test_editor.py | File | 1.11 KB | 0644 |
|
test_filelist.py | File | 795 B | 0644 |
|
test_grep.py | File | 2.6 KB | 0644 |
|
test_help.py | File | 849 B | 0644 |
|
test_help_about.py | File | 5.68 KB | 0644 |
|
test_history.py | File | 5.39 KB | 0644 |
|
test_hyperparser.py | File | 8.87 KB | 0644 |
|
test_iomenu.py | File | 870 B | 0644 |
|
test_macosx.py | File | 3.23 KB | 0644 |
|
test_mainmenu.py | File | 594 B | 0644 |
|
test_multicall.py | File | 1.02 KB | 0644 |
|
test_outwin.py | File | 5.42 KB | 0644 |
|
test_paragraph.py | File | 14.02 KB | 0644 |
|
test_parenmatch.py | File | 3.43 KB | 0644 |
|
test_pathbrowser.py | File | 2.37 KB | 0644 |
|
test_percolator.py | File | 3.97 KB | 0644 |
|
test_pyparse.py | File | 18.15 KB | 0644 |
|
test_pyshell.py | File | 1.28 KB | 0644 |
|
test_query.py | File | 11.49 KB | 0644 |
|
test_redirector.py | File | 4.08 KB | 0644 |
|
test_replace.py | File | 8.11 KB | 0644 |
|
test_rpc.py | File | 805 B | 0644 |
|
test_rstrip.py | File | 1.57 KB | 0644 |
|
test_run.py | File | 9.19 KB | 0644 |
|
test_runscript.py | File | 777 B | 0644 |
|
test_scrolledlist.py | File | 496 B | 0644 |
|
test_search.py | File | 2.4 KB | 0644 |
|
test_searchbase.py | File | 5.35 KB | 0644 |
|
test_searchengine.py | File | 11.27 KB | 0644 |
|
test_squeezer.py | File | 21.35 KB | 0644 |
|
test_stackviewer.py | File | 1.18 KB | 0644 |
|
test_statusbar.py | File | 1.11 KB | 0644 |
|
test_text.py | File | 6.81 KB | 0644 |
|
test_textview.py | File | 5.5 KB | 0644 |
|
test_tooltip.py | File | 5.01 KB | 0644 |
|
test_tree.py | File | 792 B | 0644 |
|
test_undo.py | File | 4.13 KB | 0644 |
|
test_warning.py | File | 2.68 KB | 0644 |
|
test_window.py | File | 1.05 KB | 0644 |
|
test_zoomheight.py | File | 999 B | 0644 |
|