Files

140 lines
4.8 KiB
Python

"""Tests for core.grid_builder module."""
import pytest
from PIL import Image
from core.grid_builder import GridBuilder
def _make_test_image(width=100, height=100, color=(255, 0, 0)):
"""Create a solid-color test image."""
return Image.new("RGB", (width, height), color)
class TestGridBuilder2D:
def test_basic_grid(self):
builder = GridBuilder(cell_width=100, cell_height=100, padding=5)
images = [
_make_test_image(color=(255, 0, 0)),
_make_test_image(color=(0, 255, 0)),
_make_test_image(color=(0, 0, 255)),
_make_test_image(color=(255, 255, 0)),
]
grid = builder.build_2d_grid(
images,
x_labels=["A", "B"],
y_labels=["1", "2"],
)
assert isinstance(grid, Image.Image)
assert grid.width > 200 # At least 2 cells wide
assert grid.height > 200 # At least 2 cells tall
def test_with_param_names(self):
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image() for _ in range(4)]
grid = builder.build_2d_grid(
images,
x_labels=["10", "20"],
y_labels=["5", "7"],
x_param_name="Steps",
y_param_name="CFG",
)
assert isinstance(grid, Image.Image)
def test_single_cell(self):
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image()]
grid = builder.build_2d_grid(
images,
x_labels=["A"],
y_labels=["1"],
)
assert isinstance(grid, Image.Image)
def test_missing_image(self):
"""Grid should render placeholder for None images."""
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image(), None]
grid = builder.build_2d_grid(
images,
x_labels=["A", "B"],
y_labels=["1"],
)
assert isinstance(grid, Image.Image)
def test_non_square_images(self):
"""Images with different aspect ratio should be letterboxed."""
builder = GridBuilder(cell_width=200, cell_height=200)
images = [_make_test_image(width=300, height=100)]
grid = builder.build_2d_grid(
images,
x_labels=["A"],
y_labels=["1"],
)
assert isinstance(grid, Image.Image)
class TestGridBuilderStrip:
def test_basic_strip(self):
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image() for _ in range(6)]
labels = [{"steps": i * 10, "cfg": 7} for i in range(6)]
strip = builder.build_linear_strip(images, labels, columns=3)
assert isinstance(strip, Image.Image)
def test_auto_columns(self):
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image() for _ in range(9)]
labels = [{"steps": i} for i in range(9)]
strip = builder.build_linear_strip(images, labels)
assert isinstance(strip, Image.Image)
def test_single_image(self):
builder = GridBuilder(cell_width=100, cell_height=100)
images = [_make_test_image()]
labels = [{"steps": 10}]
strip = builder.build_linear_strip(images, labels)
assert isinstance(strip, Image.Image)
def test_empty_images(self):
builder = GridBuilder(cell_width=100, cell_height=100)
strip = builder.build_linear_strip([], [])
assert isinstance(strip, Image.Image)
class TestResizeImage:
def test_exact_size(self):
builder = GridBuilder(cell_width=100, cell_height=100)
img = _make_test_image(100, 100)
result = builder._resize_image(img, 100, 100)
assert result.size == (100, 100)
def test_larger_image(self):
builder = GridBuilder()
img = _make_test_image(1000, 1000)
result = builder._resize_image(img, 200, 200)
assert result.size == (200, 200)
def test_aspect_ratio_wide(self):
builder = GridBuilder()
img = _make_test_image(400, 200)
result = builder._resize_image(img, 200, 200)
assert result.size == (200, 200) # Letterboxed
def test_aspect_ratio_tall(self):
builder = GridBuilder()
img = _make_test_image(200, 400)
result = builder._resize_image(img, 200, 200)
assert result.size == (200, 200) # Letterboxed
class TestCalculateLabelWidth:
def test_basic(self):
builder = GridBuilder(font_size=14)
width = builder._calculate_label_width(["short", "longer label"])
assert width >= 60
def test_with_param_name(self):
builder = GridBuilder(font_size=14)
width = builder._calculate_label_width(["1"], "Very Long Parameter Name")
assert width > builder._calculate_label_width(["1"])