""" Test the `print` function. """ from __future__ import annotations import pytest from prompt_toolkit import print_formatted_text as pt_print from prompt_toolkit.formatted_text import HTML, FormattedText, to_formatted_text from prompt_toolkit.output import ColorDepth from prompt_toolkit.styles import Style from prompt_toolkit.utils import is_windows class _Capture: "Emulate an stdout object." def __init__(self): self._data = [] def write(self, data): self._data.append(data) @property def data(self): return "".join(self._data) def flush(self): pass def isatty(self): return True def fileno(self): # File descriptor is not used for printing formatted text. # (It is only needed for getting the terminal size.) return -1 @pytest.mark.skipif(is_windows(), reason="Doesn't run on Windows yet.") def test_print_formatted_text(): f = _Capture() pt_print([("", "hello"), ("", "world")], file=f) assert "hello" in f.data assert "world" in f.data @pytest.mark.skipif(is_windows(), reason="Doesn't run on Windows yet.") def test_print_formatted_text_backslash_r(): f = _Capture() pt_print("hello\r\n", file=f) assert "hello" in f.data @pytest.mark.skipif(is_windows(), reason="Doesn't run on Windows yet.") def test_formatted_text_with_style(): f = _Capture() style = Style.from_dict( { "hello": "#ff0066", "world": "#44ff44 italic", } ) tokens = FormattedText( [ ("class:hello", "Hello "), ("class:world", "world"), ] ) # NOTE: We pass the default (8bit) color depth, so that the unit tests # don't start failing when environment variables change. pt_print(tokens, style=style, file=f, color_depth=ColorDepth.DEFAULT) assert "\x1b[0;38;5;197mHello" in f.data assert "\x1b[0;38;5;83;3mworld" in f.data @pytest.mark.skipif(is_windows(), reason="Doesn't run on Windows yet.") def test_html_with_style(): """ Text `print_formatted_text` with `HTML` wrapped in `to_formatted_text`. """ f = _Capture() html = HTML("hello world") formatted_text = to_formatted_text(html, style="class:myhtml") pt_print(formatted_text, file=f, color_depth=ColorDepth.DEFAULT) assert ( f.data == "\x1b[0m\x1b[?7h\x1b[0;32mhello\x1b[0m \x1b[0;1mworld\x1b[0m\r\n\x1b[0m" )