Gracefully skips figment tests when system Cairo library is unavailable instead of crashing with opaque OSError during test collection. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
"""Tests for engine.figment_render module."""
|
|
|
|
import os
|
|
|
|
import pytest
|
|
|
|
pytest.importorskip("cairosvg", reason="cairosvg requires system Cairo library")
|
|
|
|
from engine.figment_render import rasterize_svg
|
|
|
|
FIXTURE_SVG = os.path.join(os.path.dirname(__file__), "fixtures", "test.svg")
|
|
|
|
|
|
class TestRasterizeSvg:
|
|
def test_returns_list_of_strings(self):
|
|
rows = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
assert isinstance(rows, list)
|
|
assert all(isinstance(r, str) for r in rows)
|
|
|
|
def test_output_height_matches_terminal_height(self):
|
|
rows = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
assert len(rows) == 20
|
|
|
|
def test_output_contains_block_characters(self):
|
|
rows = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
all_chars = "".join(rows)
|
|
block_chars = {"█", "▀", "▄"}
|
|
assert any(ch in all_chars for ch in block_chars)
|
|
|
|
def test_different_sizes_produce_different_output(self):
|
|
rows_small = rasterize_svg(FIXTURE_SVG, 20, 10)
|
|
rows_large = rasterize_svg(FIXTURE_SVG, 80, 40)
|
|
assert len(rows_small) == 10
|
|
assert len(rows_large) == 40
|
|
|
|
def test_nonexistent_file_raises(self):
|
|
import pytest
|
|
|
|
with pytest.raises((FileNotFoundError, OSError)):
|
|
rasterize_svg("/nonexistent/file.svg", 40, 20)
|
|
|
|
|
|
class TestRasterizeCache:
|
|
def test_cache_returns_same_result(self):
|
|
rows1 = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
rows2 = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
assert rows1 == rows2
|
|
|
|
def test_cache_invalidated_by_size_change(self):
|
|
rows1 = rasterize_svg(FIXTURE_SVG, 40, 20)
|
|
rows2 = rasterize_svg(FIXTURE_SVG, 60, 30)
|
|
assert len(rows1) != len(rows2)
|