def test_write_styled( SetConsoleTextAttribute, win32_console_getters, win32_handle, capsys, ): style = Style.parse("black on red") text = "Hello, world!" term = LegacyWindowsTerm(sys.stdout) term.write_styled(text, style) captured = capsys.readouterr() assert captured.out == text # Ensure we set the text attributes and then reset them after writing styled text call_args = SetConsoleTextAttribute.call_args_list assert len(call_args) == 2 first_args, first_kwargs = call_args[0] second_args, second_kwargs = call_args[1] assert first_args == (win32_handle,) assert first_kwargs["attributes"].value == 64 assert second_args == (win32_handle,) assert second_kwargs["attributes"] == DEFAULT_STYLE_ATTRIBUTE
def test_write_styled_bold(_, SetConsoleTextAttribute, win32_handle): style = Style.parse("bold black on red") text = "Hello, world!" term = LegacyWindowsTerm(sys.stdout) term.write_styled(text, style) call_args = SetConsoleTextAttribute.call_args_list first_args, first_kwargs = call_args[0] expected_attr = 64 + 8 # 64 for red bg, +8 for bright black assert first_args == (win32_handle, ) assert first_kwargs["attributes"].value == expected_attr
def test_write_styled_reverse(_, SetConsoleTextAttribute, win32_handle): style = Style.parse("dim bright_red on blue") text = "Hello, world!" term = LegacyWindowsTerm(sys.stdout) term.write_styled(text, style) call_args = SetConsoleTextAttribute.call_args_list first_args, first_kwargs = call_args[0] expected_attr = 4 + 16 # 4 for red text (after dim), +16 for blue bg assert first_args == (win32_handle, ) assert first_kwargs["attributes"].value == expected_attr
def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: """Makes appropriate Windows Console API calls based on the segments in the buffer. Args: buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. term (LegacyWindowsTerm): Used to call the Windows Console API. """ for text, style, control in buffer: if not control: if style: term.write_styled(text, style) else: term.write_text(text) else: control_codes: Sequence[ControlCode] = control for control_code in control_codes: control_type = control_code[0] if control_type == ControlType.CURSOR_MOVE_TO: _, x, y = cast(Tuple[ControlType, int, int], control_code) term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) elif control_type == ControlType.CARRIAGE_RETURN: term.write_text("\r") elif control_type == ControlType.HOME: term.move_cursor_to(WindowsCoordinates(0, 0)) elif control_type == ControlType.CURSOR_UP: term.move_cursor_up() elif control_type == ControlType.CURSOR_DOWN: term.move_cursor_down() elif control_type == ControlType.CURSOR_FORWARD: term.move_cursor_forward() elif control_type == ControlType.CURSOR_BACKWARD: term.move_cursor_backward() elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: _, column = cast(Tuple[ControlType, int], control_code) term.move_cursor_to_column(column - 1) elif control_type == ControlType.HIDE_CURSOR: term.hide_cursor() elif control_type == ControlType.SHOW_CURSOR: term.show_cursor() elif control_type == ControlType.ERASE_IN_LINE: _, mode = cast(Tuple[ControlType, int], control_code) if mode == 0: term.erase_end_of_line() elif mode == 1: term.erase_start_of_line() elif mode == 2: term.erase_line() elif control_type == ControlType.SET_WINDOW_TITLE: _, title = cast(Tuple[ControlType, str], control_code) term.set_title(title)
def test_write_styled_no_foreground_color(_, SetConsoleTextAttribute, win32_handle): style = Style.parse("on blue") text = "Hello, world!" term = LegacyWindowsTerm(sys.stdout) term.write_styled(text, style) call_args = SetConsoleTextAttribute.call_args_list first_args, first_kwargs = call_args[0] expected_attr = 16 | term._default_fore # 16 for blue bg, plus default fg color assert first_args == (win32_handle, ) assert first_kwargs["attributes"].value == expected_attr
def test_write_styled_reverse( SetConsoleTextAttribute, win32_console_getters, win32_handle ): style = Style.parse("reverse red on blue") text = "Hello, world!" term = LegacyWindowsTerm(sys.stdout) term.write_styled(text, style) call_args = SetConsoleTextAttribute.call_args_list first_args, first_kwargs = call_args[0] expected_attr = 64 + 1 # 64 for red bg (after reverse), +1 for blue fg assert first_args == (win32_handle,) assert first_kwargs["attributes"].value == expected_attr