1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
from contextlib import contextmanager
from types import SimpleNamespace
from typing import Iterator
from unittest.mock import patch
from rich.console import Console
from rich.measure import Measurement
from syrupy.assertion import SnapshotAssertion
from tests.data import CONSOLE_OPTIONS, TEST_IMAGE
from tests.utils import load_non_seekable_bytes_io, render
def test_render(snapshot: SnapshotAssertion) -> None:
from textual_image.renderable.sixel import Image
renderable = Image(TEST_IMAGE, width=4)
assert render(renderable) == snapshot
def test_render_non_seekable() -> None:
from textual_image.renderable.sixel import Image
test_image = load_non_seekable_bytes_io(TEST_IMAGE)
renderable = Image(test_image)
assert test_image.read() == b""
assert render(renderable) == render(renderable)
test_image.close()
assert render(renderable) == render(renderable)
def test_measure() -> None:
from textual_image.renderable.sixel import Image
renderable = Image(TEST_IMAGE, width=4)
assert renderable.__rich_measure__(Console(), CONSOLE_OPTIONS) == Measurement(4, 4)
def test_cleanup() -> None:
from textual_image.renderable.sixel import Image
# cleanup() is a no-op. Let's call it anyway.
Image(TEST_IMAGE, width=4).cleanup()
def test_query_terminal_support() -> None:
from textual_image.renderable.sixel import query_terminal_support
@contextmanager
def response_success(start_marker: str, end_marker: str, timeout: float | None = None) -> Iterator[SimpleNamespace]:
yield SimpleNamespace(sequence="\x1b[?1;2;3;4c")
@contextmanager
def response_failure(start_marker: str, end_marker: str, timeout: float | None = None) -> Iterator[SimpleNamespace]:
yield SimpleNamespace(sequence="\x1b[?1;2;3;c")
@contextmanager
def response_exception(
start_marker: str, end_marker: str, timeout: float | None = None
) -> Iterator[SimpleNamespace]:
raise TimeoutError()
with patch("sys.__stdout__", None):
assert not query_terminal_support()
with patch("textual_image.renderable.sixel.capture_terminal_response", response_success):
with patch("sys.__stdout__"):
assert query_terminal_support()
with patch("textual_image.renderable.sixel.capture_terminal_response", response_failure):
with patch("sys.__stdout__"):
assert not query_terminal_support()
with patch("textual_image.renderable.sixel.capture_terminal_response", response_exception):
with patch("sys.__stdout__"):
assert not query_terminal_support()
|