2022-03-01 10:14:08 +00:00
|
|
|
import sys
|
|
|
|
from unittest.mock import call, create_autospec
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
|
|
try:
|
|
|
|
from rich._win32_console import LegacyWindowsTerm, WindowsCoordinates
|
|
|
|
from rich._windows_renderer import legacy_windows_render
|
|
|
|
except:
|
2022-03-01 10:23:29 +00:00
|
|
|
# These modules can only be imported on Windows
|
2022-03-01 10:14:08 +00:00
|
|
|
pass
|
|
|
|
from rich.segment import ControlType, Segment
|
|
|
|
from rich.style import Style
|
|
|
|
|
|
|
|
pytestmark = pytest.mark.skipif(sys.platform != "win32", reason="windows only")
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.fixture
|
|
|
|
def legacy_term_mock():
|
|
|
|
return create_autospec(LegacyWindowsTerm)
|
|
|
|
|
|
|
|
|
|
|
|
def test_text_only(legacy_term_mock):
|
|
|
|
text = "Hello, world!"
|
|
|
|
buffer = [Segment(text)]
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.write_text.assert_called_once_with(text)
|
|
|
|
|
|
|
|
|
|
|
|
def test_text_multiple_segments(legacy_term_mock):
|
|
|
|
buffer = [Segment("Hello, "), Segment("world!")]
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
assert legacy_term_mock.write_text.call_args_list == [
|
|
|
|
call("Hello, "),
|
|
|
|
call("world!"),
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
def test_text_with_style(legacy_term_mock):
|
|
|
|
text = "Hello, world!"
|
|
|
|
style = Style.parse("black on red")
|
|
|
|
buffer = [Segment(text, style)]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.write_styled.assert_called_once_with(text, style)
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_cursor_move_to(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.CURSOR_MOVE_TO, 20, 30)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.move_cursor_to.assert_called_once_with(
|
|
|
|
WindowsCoordinates(row=29, col=19)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_carriage_return(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.CARRIAGE_RETURN,)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.write_text.assert_called_once_with("\r")
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_home(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.HOME,)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.move_cursor_to.assert_called_once_with(WindowsCoordinates(0, 0))
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"control_type, method_name",
|
|
|
|
[
|
|
|
|
(ControlType.CURSOR_UP, "move_cursor_up"),
|
|
|
|
(ControlType.CURSOR_DOWN, "move_cursor_down"),
|
|
|
|
(ControlType.CURSOR_FORWARD, "move_cursor_forward"),
|
|
|
|
(ControlType.CURSOR_BACKWARD, "move_cursor_backward"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_control_cursor_single_cell_movement(
|
|
|
|
legacy_term_mock, control_type, method_name
|
|
|
|
):
|
|
|
|
buffer = [Segment("", None, [(control_type,)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
getattr(legacy_term_mock, method_name).assert_called_once_with()
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(
|
|
|
|
"erase_mode, method_name",
|
|
|
|
[
|
|
|
|
(0, "erase_end_of_line"),
|
|
|
|
(1, "erase_start_of_line"),
|
|
|
|
(2, "erase_line"),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
def test_control_erase_line(legacy_term_mock, erase_mode, method_name):
|
|
|
|
buffer = [Segment("", None, [(ControlType.ERASE_IN_LINE, erase_mode)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
getattr(legacy_term_mock, method_name).assert_called_once_with()
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_show_cursor(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.SHOW_CURSOR,)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.show_cursor.assert_called_once_with()
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_hide_cursor(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.HIDE_CURSOR,)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.hide_cursor.assert_called_once_with()
|
|
|
|
|
|
|
|
|
|
|
|
def test_control_cursor_move_to_column(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.CURSOR_MOVE_TO_COLUMN, 3)])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.move_cursor_to_column.assert_called_once_with(2)
|
2022-04-19 16:20:17 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_control_set_terminal_window_title(legacy_term_mock):
|
|
|
|
buffer = [Segment("", None, [(ControlType.SET_WINDOW_TITLE, "Hello, world!")])]
|
|
|
|
|
|
|
|
legacy_windows_render(buffer, legacy_term_mock)
|
|
|
|
|
|
|
|
legacy_term_mock.set_title.assert_called_once_with("Hello, world!")
|