]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-46441: Add a boilerplate to test syntax errors in interactive mode (GH-30720)
authorBatuhan Taskaya <batuhan@python.org>
Thu, 20 Jan 2022 20:07:43 +0000 (23:07 +0300)
committerGitHub <noreply@github.com>
Thu, 20 Jan 2022 20:07:43 +0000 (23:07 +0300)
Lib/test/test_repl.py

index 03bf8d8b5483fb1488d3868aeffdfb1f9d1dbd9f..a8d04a425e278b577dafcf44fc8d0639e6fd71cc 100644 (file)
@@ -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 @@ class TestInteractiveInterpreter(unittest.TestCase):
         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()