summaryrefslogtreecommitdiff
path: root/Lib/test/test_readline.py
diff options
context:
space:
mode:
authorMartin Panter <vadmium+py@gmail.com>2016-05-15 01:26:25 +0000
committerMartin Panter <vadmium+py@gmail.com>2016-05-15 01:26:25 +0000
commitf0dbf7a6abc821c77e912deae81e3a27cf334c54 (patch)
treebf28e30216f084dc637caa140960a9b14e7aef60 /Lib/test/test_readline.py
parent4dd27f0adcee901bff19c536d8442d666440a415 (diff)
downloadcpython-git-f0dbf7a6abc821c77e912deae81e3a27cf334c54.tar.gz
Issue #26870: Add readline.set_auto_history(), originally by Tyler Crompton
Diffstat (limited to 'Lib/test/test_readline.py')
-rw-r--r--Lib/test/test_readline.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/Lib/test/test_readline.py b/Lib/test/test_readline.py
index 35330ab076..84fd119e6a 100644
--- a/Lib/test/test_readline.py
+++ b/Lib/test/test_readline.py
@@ -1,7 +1,11 @@
"""
Very minimal unittests for parts of the readline module.
"""
+from errno import EIO
import os
+import selectors
+import subprocess
+import sys
import tempfile
import unittest
from test.support import import_module, unlink
@@ -96,6 +100,51 @@ class TestReadline(unittest.TestCase):
TERM='xterm-256color')
self.assertEqual(stdout, b'')
+ auto_history_script = """\
+import readline
+readline.set_auto_history({})
+input()
+print("History length:", readline.get_current_history_length())
+"""
+
+ def test_auto_history_enabled(self):
+ output = run_pty(self.auto_history_script.format(True))
+ self.assertIn(b"History length: 1\r\n", output)
+
+ def test_auto_history_disabled(self):
+ output = run_pty(self.auto_history_script.format(False))
+ self.assertIn(b"History length: 0\r\n", output)
+
+
+def run_pty(script, input=b"dummy input\r"):
+ pty = import_module('pty')
+ output = bytearray()
+ [master, slave] = pty.openpty()
+ args = (sys.executable, '-c', script)
+ proc = subprocess.Popen(args, stdin=slave, stdout=slave, stderr=slave)
+ os.close(slave)
+ with proc, selectors.DefaultSelector() as sel:
+ sel.register(master, selectors.EVENT_READ | selectors.EVENT_WRITE)
+ os.set_blocking(master, False)
+ while True:
+ for [_, events] in sel.select():
+ if events & selectors.EVENT_READ:
+ try:
+ chunk = os.read(master, 0x10000)
+ except OSError as err:
+ # Linux raises EIO when the slave is closed
+ if err.errno != EIO:
+ raise
+ chunk = b""
+ if not chunk:
+ os.close(master)
+ return output
+ output.extend(chunk)
+ if events & selectors.EVENT_WRITE:
+ input = input[os.write(master, input):]
+ if not input:
+ sel.modify(master, selectors.EVENT_READ)
+
if __name__ == "__main__":
unittest.main()