|
" 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): |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
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): |
|
|
|
self.history.fetch(reverse=True) |
|
self.text.mark_set('insert', 'iomark') |
|
self.fetch_test(True, line2, None, None, bell=True) |
|
|
|
def test_fetch_edit(self): |
|
|
|
self.history.fetch(reverse=True) |
|
self.text.delete('iomark', 'insert', ) |
|
self.text.insert('iomark', 'a =') |
|
self.fetch_test(True, line1, 'a =', 0) |
|
|
|
def test_history_prev_next(self): |
|
|
|
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) |
|
|