From 30fb6d073d9ca00dff8e4155c523cdfa63abab6b Mon Sep 17 00:00:00 2001 From: Batuhan Taskaya Date: Thu, 20 Jan 2022 23:07:43 +0300 Subject: bpo-46441: Add a boilerplate to test syntax errors in interactive mode (GH-30720) --- Lib/test/test_repl.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Lib/test/test_repl.py b/Lib/test/test_repl.py index 03bf8d8..a8d04a4 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 @@ 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() -- cgit v0.12