[Python-checkins] bpo-46441: Add a boilerplate to test syntax errors in interactive mode (GH-30720)
isidentical
webhook-mailer at python.org
Thu Jan 20 15:07:47 EST 2022
https://github.com/python/cpython/commit/30fb6d073d9ca00dff8e4155c523cdfa63abab6b
commit: 30fb6d073d9ca00dff8e4155c523cdfa63abab6b
branch: main
author: Batuhan Taskaya <batuhan at python.org>
committer: isidentical <isidentical at gmail.com>
date: 2022-01-20T23:07:43+03:00
summary:
bpo-46441: Add a boilerplate to test syntax errors in interactive mode (GH-30720)
files:
M Lib/test/test_repl.py
diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py
index 03bf8d8b5483f..a8d04a425e278 100644
--- a/Lib/test/test_repl.py
+++ b/Lib/test/test_repl.py
@@ -36,6 +36,21 @@ def spawn_repl(*args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **kw):
stdout=stdout, stderr=stderr,
**kw)
+def run_on_interactive_mode(source):
+ """Spawn a new Python interpreter, pass the given
+ input source code from the stdin and return the
+ result back. If the interpreter exits non-zero, it
+ raises a ValueError."""
+
+ process = spawn_repl()
+ process.stdin.write(source)
+ output = kill_python(process)
+
+ if process.returncode != 0:
+ raise ValueError("Process didn't exit properly.")
+ return output
+
+
class TestInteractiveInterpreter(unittest.TestCase):
@cpython_only
@@ -108,5 +123,23 @@ def test_close_stdin(self):
self.assertIn('before close', output)
+class TestInteractiveModeSyntaxErrors(unittest.TestCase):
+
+ def test_interactive_syntax_error_correct_line(self):
+ output = run_on_interactive_mode(dedent("""\
+ def f():
+ print(0)
+ return yield 42
+ """))
+
+ traceback_lines = output.splitlines()[-4:-1]
+ expected_lines = [
+ ' return yield 42',
+ ' ^^^^^',
+ 'SyntaxError: invalid syntax'
+ ]
+ self.assertEqual(traceback_lines, expected_lines)
+
+
if __name__ == "__main__":
unittest.main()
More information about the Python-checkins
mailing list