| """ |
| Test that typing python expression in the terminal is echoed back to stdout. |
| """ |
| |
| from lldbsuite.test.decorators import skipIfAsan |
| from lldbsuite.test.lldbpexpect import PExpectTest |
| |
| |
| @skipIfAsan |
| class PythonInterpreterEchoTest(PExpectTest): |
| PYTHON_PROMPT = ">>> " |
| |
| def verify_command_echo( |
| self, command: str, expected_output: str = "", is_regex: bool = False |
| ): |
| assert self.child != None |
| child = self.child |
| self.assertIsNotNone(self.child, "expected a running lldb process.") |
| |
| child.sendline(command) |
| |
| # Build pattern list: match whichever comes first (output or prompt). |
| # This prevents waiting for a timeout if there's no match. |
| pattern = [] |
| match_expected = expected_output and len(expected_output) > 0 |
| |
| if match_expected: |
| pattern.append(expected_output) |
| pattern.append(self.PYTHON_PROMPT) |
| |
| expect_func = child.expect if is_regex else child.expect_exact |
| match_idx = expect_func(pattern) |
| if match_expected: |
| self.assertEqual( |
| match_idx, 0, "Expected output `{expected_output}` in stdout." |
| ) |
| |
| self.assertIsNotNone(self.child.before, "Expected output before prompt") |
| self.assertIsInstance(self.child.before, bytes) |
| echoed_text: str = self.child.before.decode("ascii").strip() |
| self.assertEqual( |
| command, echoed_text, f"Command '{command}' should be echoed to stdout." |
| ) |
| |
| if match_expected: |
| child.expect_exact(self.PYTHON_PROMPT) |
| |
| def test_python_interpreter_echo(self): |
| """Test that that the user typed commands is echoed to stdout""" |
| |
| self.launch(use_colors=False, dimensions=(100, 100)) |
| |
| # Enter the python interpreter. |
| self.verify_command_echo( |
| "script --language python --", expected_output="Python.*\\.", is_regex=True |
| ) |
| self.child_in_script_interpreter = True |
| |
| self.verify_command_echo("val = 300") |
| self.verify_command_echo( |
| "print('result =', 300)", expected_output="result = 300" |
| ) |