diff --git a/Lib/idlelib/IdleHistory.py b/Lib/idlelib/IdleHistory.py
index 25fe6e4..dc1ac8b 100644
--- a/Lib/idlelib/IdleHistory.py
+++ b/Lib/idlelib/IdleHistory.py
@@ -49,7 +49,13 @@
         self.text.insert(where, output)
 
     def fetch(self, reverse):
-        "Fetch statememt and enter into text at cursor."
+        '''Fetch statememt and replace current line in text widget.
+
+        Set prefix and pointer as needed for successive fetches.
+        Reset them to None, None when returning to the start line.
+        Sound bell when return to start line or cannot leave a line
+        because cyclic is False.
+        '''
         nhist = len(self.history)
         pointer = self.pointer
         prefix = self.prefix
@@ -64,7 +70,7 @@
             else:
                 if self.cyclic:
                     pointer = -1  # will be incremented
-                else:
+                else:  # abort history_next
                     self.text.bell()
                     return
         nprefix = len(prefix)
@@ -75,7 +81,7 @@
                 pointer = pointer + 1
             if pointer < 0 or pointer >= nhist:
                 self.text.bell()
-                if not self.cyclic and pointer < 0:
+                if not self.cyclic and pointer < 0:  # abort history_prev
                     return
                 else:
                     if self._get_source("iomark", "end-1c") != prefix:
@@ -106,3 +112,9 @@
             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)
diff --git a/Lib/idlelib/idle_test/test_idlehistory.py b/Lib/idlelib/idle_test/test_idlehistory.py
new file mode 100644
index 0000000..c48529d
--- /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):
+    '''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()
+
+    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()
+
+    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)
+
+    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)
