140 lines
4.8 KiB
Python
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"])
|