[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