cpython: c4cac5d73e9d (original) (raw)
--- a/Lib/idlelib/IdleHistory.py +++ b/Lib/idlelib/IdleHistory.py @@ -49,7 +49,13 @@ class History: self.text.insert(where, output) def fetch(self, reverse):
"Fetch statememt and enter into text at cursor."[](#l1.7)
'''Fetch statememt and replace current line in text widget.[](#l1.8)
Set prefix and pointer as needed for successive fetches.[](#l1.10)
Reset them to None, None when returning to the start line.[](#l1.11)
Sound bell when return to start line or cannot leave a line[](#l1.12)
because cyclic is False.[](#l1.13)
'''[](#l1.14) nhist = len(self.history)[](#l1.15) pointer = self.pointer[](#l1.16) prefix = self.prefix[](#l1.17)
@@ -64,7 +70,7 @@ class History: else: if self.cyclic: pointer = -1 # will be incremented
else:[](#l1.22)
else: # abort history_next[](#l1.23) self.text.bell()[](#l1.24) return[](#l1.25) nprefix = len(prefix)[](#l1.26)
@@ -75,7 +81,7 @@ class History: pointer = pointer + 1 if pointer < 0 or pointer >= nhist: self.text.bell()
if not self.cyclic and pointer < 0:[](#l1.31)
if not self.cyclic and pointer < 0: # abort history_prev[](#l1.32) return[](#l1.33) else:[](#l1.34) if self._get_source("iomark", "end-1c") != prefix:[](#l1.35)
@@ -106,3 +112,9 @@ class History: self.history.append(source) self.pointer = None self.prefix = None + +if name == "main":
- from test import support
- support.use_resources = ['gui']
- from unittest import main
- main('idlelib.idle_test.test_idlehistory', verbosity=2, exit=False)
new file mode 100644 --- /dev/null +++ b/Lib/idlelib/idle_test/test_idlehistory.py @@ -0,0 +1,164 @@ +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.IdleHistory import History +from idlelib.configHandler import idleConf + +line1 = 'a = 7' +line2 = 'b = a' + +class StoreTest(unittest.TestCase):
- @classmethod
- def setUpClass(cls):
cls.text = mkText()[](#l2.22)
cls.history = History(cls.text)[](#l2.23)
- def test_init(self):
self.assertIs(self.history.text, self.text)[](#l2.30)
self.assertEqual(self.history.history, [])[](#l2.31)
self.assertIsNone(self.history.prefix)[](#l2.32)
self.assertIsNone(self.history.pointer)[](#l2.33)
self.assertEqual(self.history.cyclic,[](#l2.34)
idleConf.GetOption("main", "History", "cyclic", 1, "bool"))[](#l2.35)
- def test_store_short(self):
self.history.store('a')[](#l2.38)
self.assertEqual(self.history.history, [])[](#l2.39)
self.history.store(' a ')[](#l2.40)
self.assertEqual(self.history.history, [])[](#l2.41)
- def test_store_dup(self):
self.history.store(line1)[](#l2.44)
self.assertEqual(self.history.history, [line1])[](#l2.45)
self.history.store(line2)[](#l2.46)
self.assertEqual(self.history.history, [line1, line2])[](#l2.47)
self.history.store(line1)[](#l2.48)
self.assertEqual(self.history.history, [line2, line1])[](#l2.49)
- def test_store_reset(self):
self.history.prefix = line1[](#l2.52)
self.history.pointer = 0[](#l2.53)
self.history.store(line2)[](#l2.54)
self.assertIsNone(self.history.prefix)[](#l2.55)
self.assertIsNone(self.history.pointer)[](#l2.56)
- def init(self, master):
self.text = tkText(master=master)[](#l2.61)
self._bell = False[](#l2.62)
- def getattr(self, name):
return getattr(self.text, name)[](#l2.64)
- def bell(self):
self._bell = True[](#l2.66)
+ +class FetchTest(unittest.TestCase):
- '''Test History.fetch with wrapped tk.Text.
- '''
- @classmethod
- def setUpClass(cls):
requires('gui')[](#l2.73)
cls.root = tk.Tk()[](#l2.74)
- def setUp(self):
self.text = text = TextWrapper(self.root)[](#l2.77)
text.insert('1.0', ">>> ")[](#l2.78)
text.mark_set('iomark', '1.4')[](#l2.79)
text.mark_gravity('iomark', 'left')[](#l2.80)
self.history = History(text)[](#l2.81)
self.history.history = [line1, line2][](#l2.82)
- def fetch_test(self, reverse, line, prefix, index, *, bell=False):
# Perform one fetch as invoked by Alt-N or Alt-P[](#l2.89)
# Test the result. The line test is the most important.[](#l2.90)
# The last two are diagnostic of fetch internals.[](#l2.91)
History = self.history[](#l2.92)
History.fetch(reverse)[](#l2.93)
Equal = self.assertEqual[](#l2.94)
Equal(self.text.get('iomark', 'end-1c'), line)[](#l2.95)
Equal(self.text._bell, bell)[](#l2.96)
if bell:[](#l2.97)
self.text._bell = False[](#l2.98)
Equal(History.prefix, prefix)[](#l2.99)
Equal(History.pointer, index)[](#l2.100)
- def test_fetch_prev_cyclic(self):
prefix = ''[](#l2.103)
test = self.fetch_test[](#l2.104)
test(True, line2, prefix, 1)[](#l2.105)
test(True, line1, prefix, 0)[](#l2.106)
test(True, prefix, None, None, bell=True)[](#l2.107)
- def test_fetch_next_cyclic(self):
prefix = ''[](#l2.110)
test = self.fetch_test[](#l2.111)
test(False, line1, prefix, 0)[](#l2.112)
test(False, line2, prefix, 1)[](#l2.113)
test(False, prefix, None, None, bell=True)[](#l2.114)
Prefix 'a' tests skip line2, which starts with 'b'
- def test_fetch_prev_prefix(self):
prefix = 'a'[](#l2.118)
self.text.insert('iomark', prefix)[](#l2.119)
self.fetch_test(True, line1, prefix, 0)[](#l2.120)
self.fetch_test(True, prefix, None, None, bell=True)[](#l2.121)
- def test_fetch_next_prefix(self):
prefix = 'a'[](#l2.124)
self.text.insert('iomark', prefix)[](#l2.125)
self.fetch_test(False, line1, prefix, 0)[](#l2.126)
self.fetch_test(False, prefix, None, None, bell=True)[](#l2.127)
- def test_fetch_prev_noncyclic(self):
prefix = ''[](#l2.130)
self.history.cyclic = False[](#l2.131)
test = self.fetch_test[](#l2.132)
test(True, line2, prefix, 1)[](#l2.133)
test(True, line1, prefix, 0)[](#l2.134)
test(True, line1, prefix, 0, bell=True)[](#l2.135)
- def test_fetch_next_noncyclic(self):
prefix = ''[](#l2.138)
self.history.cyclic = False[](#l2.139)
test = self.fetch_test[](#l2.140)
test(False, prefix, None, None, bell=True)[](#l2.141)
test(True, line2, prefix, 1)[](#l2.142)
test(False, prefix, None, None, bell=True)[](#l2.143)
test(False, prefix, None, None, bell=True)[](#l2.144)
- def test_fetch_cursor_move(self):
# Move cursor after fetch[](#l2.147)
self.history.fetch(reverse=True) # initialization[](#l2.148)
self.text.mark_set('insert', 'iomark')[](#l2.149)
self.fetch_test(True, line2, None, None, bell=True)[](#l2.150)
- def test_fetch_edit(self):
# Edit after fetch[](#l2.153)
self.history.fetch(reverse=True) # initialization[](#l2.154)
self.text.delete('iomark', 'insert', )[](#l2.155)
self.text.insert('iomark', 'a =')[](#l2.156)
self.fetch_test(True, line1, 'a =', 0) # prefix is reset[](#l2.157)
- def test_history_prev_next(self):
# Minimally test functions bound to events[](#l2.160)
self.history.history_prev('dummy event')[](#l2.161)
self.assertEqual(self.history.pointer, 1)[](#l2.162)
self.history.history_next('dummy event')[](#l2.163)
self.assertEqual(self.history.pointer, None)[](#l2.164)