Index: third_party/pexpect/tests/test_replwrap.py |
diff --git a/third_party/pexpect/tests/test_replwrap.py b/third_party/pexpect/tests/test_replwrap.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..26ff53c6c70165911e1fd67030ab20c4513bbe0a |
--- /dev/null |
+++ b/third_party/pexpect/tests/test_replwrap.py |
@@ -0,0 +1,105 @@ |
+import platform |
+import unittest |
+import re |
+import os |
+ |
+import pexpect |
+from pexpect import replwrap |
+ |
+skip_pypy = "This test fails on PyPy because of REPL differences" |
+ |
+ |
+class REPLWrapTestCase(unittest.TestCase): |
+ def setUp(self): |
+ super(REPLWrapTestCase, self).setUp() |
+ self.save_ps1 = os.getenv('PS1', r'\$') |
+ self.save_ps2 = os.getenv('PS2', '>') |
+ os.putenv('PS1', r'\$') |
+ os.putenv('PS2', '>') |
+ |
+ def tearDown(self): |
+ super(REPLWrapTestCase, self).tearDown() |
+ os.putenv('PS1', self.save_ps1) |
+ os.putenv('PS2', self.save_ps2) |
+ |
+ def test_bash(self): |
+ bash = replwrap.bash() |
+ res = bash.run_command("time") |
+ assert 'real' in res, res |
+ |
+ def test_pager_as_cat(self): |
+ " PAGER is set to cat, to prevent timeout in ``man sleep``. " |
+ bash = replwrap.bash() |
+ res = bash.run_command('man sleep', timeout=5) |
+ assert 'SLEEP' in res, res |
+ |
+ def test_long_running_multiline(self): |
+ " ensure the default timeout is used for multi-line commands. " |
+ bash = replwrap.bash() |
+ res = bash.run_command("echo begin\r\nsleep 2\r\necho done") |
+ self.assertEqual(res.strip().splitlines(), ['begin', 'done']) |
+ |
+ def test_long_running_continuation(self): |
+ " also ensure timeout when used within continuation prompts. " |
+ bash = replwrap.bash() |
+ # The two extra '\\' in the following expression force a continuation |
+ # prompt: |
+ # $ echo begin\ |
+ # + ; |
+ # $ sleep 2 |
+ # $ echo done |
+ res = bash.run_command("echo begin\\\n;sleep 2\r\necho done") |
+ self.assertEqual(res.strip().splitlines(), ['begin', 'done']) |
+ |
+ def test_multiline(self): |
+ bash = replwrap.bash() |
+ res = bash.run_command("echo '1 2\n3 4'") |
+ self.assertEqual(res.strip().splitlines(), ['1 2', '3 4']) |
+ |
+ # Should raise ValueError if input is incomplete |
+ try: |
+ bash.run_command("echo '5 6") |
+ except ValueError: |
+ pass |
+ else: |
+ assert False, "Didn't raise ValueError for incomplete input" |
+ |
+ # Check that the REPL was reset (SIGINT) after the incomplete input |
+ res = bash.run_command("echo '1 2\n3 4'") |
+ self.assertEqual(res.strip().splitlines(), ['1 2', '3 4']) |
+ |
+ def test_existing_spawn(self): |
+ child = pexpect.spawn("bash", timeout=5, echo=False, encoding='utf-8') |
+ repl = replwrap.REPLWrapper(child, re.compile('[$#]'), |
+ "PS1='{0}' PS2='{1}' " |
+ "PROMPT_COMMAND=''") |
+ |
+ res = repl.run_command("echo $HOME") |
+ assert res.startswith('/'), res |
+ |
+ def test_python(self): |
+ if platform.python_implementation() == 'PyPy': |
+ raise unittest.SkipTest(skip_pypy) |
+ |
+ p = replwrap.python() |
+ res = p.run_command('4+7') |
+ assert res.strip() == '11' |
+ |
+ res = p.run_command('for a in range(3): print(a)\n') |
+ assert res.strip().splitlines() == ['0', '1', '2'] |
+ |
+ def test_no_change_prompt(self): |
+ if platform.python_implementation() == 'PyPy': |
+ raise unittest.SkipTest(skip_pypy) |
+ |
+ child = pexpect.spawn('python', echo=False, timeout=5, encoding='utf-8') |
+ # prompt_change=None should mean no prompt change |
+ py = replwrap.REPLWrapper(child, u">>> ", prompt_change=None, |
+ continuation_prompt=u"... ") |
+ assert py.prompt == ">>> " |
+ |
+ res = py.run_command("for a in range(3): print(a)\n") |
+ assert res.strip().splitlines() == ['0', '1', '2'] |
+ |
+if __name__ == '__main__': |
+ unittest.main() |