bpo-46441: Add a boilerplate to test syntax errors in interactive mode (GH-30720)

This commit is contained in:
Batuhan Taskaya 2022-01-20 23:07:43 +03:00 committed by GitHub
parent a1c8841492
commit 30fb6d073d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View 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 @@ 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()