|
26 | 26 | multiline_input,
|
27 | 27 | code_to_events,
|
28 | 28 | )
|
29 |
| -from _pyrepl.console import Event |
| 29 | +from typing import IO |
| 30 | + |
| 31 | +from _pyrepl.console import Console, Event |
30 | 32 | from _pyrepl._module_completer import (
|
31 | 33 | ImportParser,
|
32 | 34 | ModuleCompleter,
|
@@ -1416,22 +1418,91 @@ def test_dumb_terminal_exits_cleanly(self):
|
1416 | 1418 |
|
1417 | 1419 | class TestConsoleRepr(TestCase):
|
1418 | 1420 |
|
1419 |
| - def test_console_repr_with_missing_attributes(self): |
1420 |
| - from _pyrepl.unix_console import UnixConsole |
1421 |
| - console = UnixConsole() |
| 1421 | + class _StubConsole(Console): |
| 1422 | + def __init__( |
| 1423 | + self, |
| 1424 | + f_in: int | IO[bytes] = 0, |
| 1425 | + f_out: int | IO[bytes] = 1, |
| 1426 | + term: str = "", |
| 1427 | + encoding: str = "", |
| 1428 | + ) -> None: |
| 1429 | + super().__init__(f_in, f_out, term, encoding) |
| 1430 | + self.height = 25 |
| 1431 | + self.width = 80 |
| 1432 | + self.screen = [] |
| 1433 | + |
| 1434 | + def refresh(self, screen: list[str], xy: tuple[int, int]) -> None: |
| 1435 | + pass |
| 1436 | + |
| 1437 | + def prepare(self) -> None: |
| 1438 | + pass |
| 1439 | + |
| 1440 | + def restore(self) -> None: |
| 1441 | + pass |
| 1442 | + |
| 1443 | + def move_cursor(self, x: int, y: int) -> None: |
| 1444 | + pass |
| 1445 | + |
| 1446 | + def set_cursor_vis(self, visible: bool) -> None: |
| 1447 | + pass |
| 1448 | + |
| 1449 | + def getheightwidth(self) -> tuple[int, int]: |
| 1450 | + return self.height, self.width |
| 1451 | + |
| 1452 | + def get_event(self, block: bool = True) -> Event | None: |
| 1453 | + return None |
| 1454 | + |
| 1455 | + def push_char(self, char: int | bytes) -> None: |
| 1456 | + pass |
| 1457 | + |
| 1458 | + def beep(self) -> None: |
| 1459 | + pass |
| 1460 | + |
| 1461 | + def clear(self) -> None: |
| 1462 | + pass |
| 1463 | + |
| 1464 | + def finish(self) -> None: |
| 1465 | + pass |
| 1466 | + |
| 1467 | + def flushoutput(self) -> None: |
| 1468 | + pass |
| 1469 | + |
| 1470 | + def forgetinput(self) -> None: |
| 1471 | + pass |
| 1472 | + |
| 1473 | + def getpending(self) -> Event: |
| 1474 | + return Event("key", "", b"") |
| 1475 | + |
| 1476 | + def wait(self, timeout: float | None = None) -> bool: |
| 1477 | + return False |
| 1478 | + |
| 1479 | + def repaint(self) -> None: |
| 1480 | + pass |
| 1481 | + |
| 1482 | + @property |
| 1483 | + def input_hook(self): |
| 1484 | + return None |
| 1485 | + |
| 1486 | + def test_reader_repr_avoids_console_field(self): |
| 1487 | + console = self._StubConsole() |
| 1488 | + config = ReadlineConfig(readline_completer=None) |
| 1489 | + |
| 1490 | + reader = ReadlineAlikeReader(console=console, config=config) |
1422 | 1491 |
|
1423 |
| - repr_str = repr(console) |
| 1492 | + repr_str = repr(reader) |
1424 | 1493 |
|
1425 | 1494 | self.assertIsInstance(repr_str, str)
|
1426 |
| - self.assertIn("UnixConsole", repr_str) |
| 1495 | + self.assertNotIn("console=", repr_str) |
1427 | 1496 |
|
1428 |
| - def test_readline_wrapper_repr_after_import(self): |
1429 |
| - import _pyrepl.readline |
| 1497 | + def test_wrapper_reader_repr_before_prepare(self): |
| 1498 | + with patch("_pyrepl.readline.Console", self._StubConsole), patch( |
| 1499 | + "_pyrepl.readline.os.dup", |
| 1500 | + side_effect=lambda fd: fd, |
| 1501 | + ): |
| 1502 | + wrapper = _ReadlineWrapper() |
| 1503 | + reader = wrapper.get_reader() |
1430 | 1504 |
|
1431 |
| - wrapper = _pyrepl.readline._wrapper |
1432 |
| - if wrapper is not None and wrapper.reader is not None: |
1433 |
| - repr_str = repr(wrapper.reader) |
1434 |
| - self.assertIsInstance(repr_str, str) |
| 1505 | + self.assertIsInstance(repr(reader), str) |
1435 | 1506 |
|
1436 | 1507 |
|
1437 | 1508 | @skipUnless(pty, "requires pty")
|
|
0 commit comments