110 lines
3.8 KiB
Python
110 lines
3.8 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from repixelizer.benchmark import run_roundtrip_benchmark
|
|
from repixelizer.io import save_rgba
|
|
from repixelizer.synthetic import make_emblem
|
|
|
|
|
|
def test_roundtrip_benchmark_writes_summary_and_case_outputs(tmp_path: Path) -> None:
|
|
corpus_dir = tmp_path / "corpus"
|
|
originals_dir = corpus_dir / "originals"
|
|
originals_dir.mkdir(parents=True)
|
|
save_rgba(originals_dir / "crest.png", make_emblem(16, 16))
|
|
(originals_dir / "crest.json").write_text(
|
|
json.dumps(
|
|
{
|
|
"title": "Crest",
|
|
"author": "Test Artist",
|
|
"license": "CC-BY 4.0",
|
|
"source_url": "https://example.com/crest",
|
|
}
|
|
),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
out_dir = tmp_path / "benchmark-out"
|
|
payload = run_roundtrip_benchmark(corpus_dir, out_dir, variants=1, steps=4, seed=3)
|
|
|
|
assert payload["case_count"] == 1
|
|
assert payload["row_count"] == 2
|
|
assert payload["profiles"] == ["soft", "crisp"]
|
|
assert payload["primary_metric"] == "foreground_premultiplied_mae"
|
|
assert (out_dir / "benchmark.csv").exists()
|
|
assert (out_dir / "benchmark.json").exists()
|
|
assert (out_dir / "cases" / "crest" / "original.png").exists()
|
|
assert (out_dir / "cases" / "crest" / "profile-soft" / "variant-01" / "input.png").exists()
|
|
assert (out_dir / "cases" / "crest" / "profile-crisp" / "variant-01" / "optimized.png").exists()
|
|
assert "reference_foreground_coverage" in payload["rows"][0]
|
|
assert "optimized_canvas_error_to_original" in payload["rows"][0]
|
|
assert "optimized_adjacency_error_to_original" in payload["rows"][0]
|
|
assert "optimized_motif_error_to_original" in payload["rows"][0]
|
|
assert "profile" in payload["rows"][0]
|
|
assert "warp_sample_mode" in payload["rows"][0]
|
|
|
|
|
|
def test_roundtrip_benchmark_can_filter_cases(tmp_path: Path) -> None:
|
|
corpus_dir = tmp_path / "corpus"
|
|
originals_dir = corpus_dir / "originals"
|
|
originals_dir.mkdir(parents=True)
|
|
save_rgba(originals_dir / "crest-a.png", make_emblem(16, 16))
|
|
save_rgba(originals_dir / "crest-b.png", make_emblem(18, 18))
|
|
|
|
out_dir = tmp_path / "benchmark-out"
|
|
payload = run_roundtrip_benchmark(
|
|
corpus_dir,
|
|
out_dir,
|
|
variants=1,
|
|
profiles=["crisp"],
|
|
steps=2,
|
|
seed=3,
|
|
include_cases=["crest-b"],
|
|
)
|
|
|
|
assert payload["case_count"] == 1
|
|
assert payload["row_count"] == 1
|
|
assert payload["rows"][0]["case_id"] == "crest-b"
|
|
assert payload["rows"][0]["profile"] == "crisp"
|
|
|
|
|
|
def test_roundtrip_benchmark_supports_ai_profile(tmp_path: Path) -> None:
|
|
corpus_dir = tmp_path / "corpus"
|
|
originals_dir = corpus_dir / "originals"
|
|
originals_dir.mkdir(parents=True)
|
|
save_rgba(originals_dir / "crest.png", make_emblem(16, 16))
|
|
|
|
out_dir = tmp_path / "benchmark-out"
|
|
payload = run_roundtrip_benchmark(
|
|
corpus_dir,
|
|
out_dir,
|
|
variants=1,
|
|
profiles=["ai"],
|
|
steps=2,
|
|
seed=5,
|
|
)
|
|
|
|
assert payload["profiles"] == ["ai"]
|
|
assert payload["row_count"] == 1
|
|
row = payload["rows"][0]
|
|
assert row["profile"] == "ai"
|
|
assert row["artifact_density"] > 0.0
|
|
assert row["artifact_strength"] > 0.0
|
|
|
|
|
|
def test_roundtrip_benchmark_clears_existing_output_dir_by_default(tmp_path: Path) -> None:
|
|
corpus_dir = tmp_path / "corpus"
|
|
originals_dir = corpus_dir / "originals"
|
|
originals_dir.mkdir(parents=True)
|
|
save_rgba(originals_dir / "crest.png", make_emblem(16, 16))
|
|
|
|
out_dir = tmp_path / "benchmark-out"
|
|
stale_file = out_dir / "stale.txt"
|
|
stale_file.parent.mkdir(parents=True)
|
|
stale_file.write_text("old", encoding="utf-8")
|
|
|
|
run_roundtrip_benchmark(corpus_dir, out_dir, variants=1, profiles=["soft"], steps=2, seed=3)
|
|
|
|
assert not stale_file.exists()
|
|
assert (out_dir / "benchmark.json").exists()
|