repixelizer/tests/test_corpus.py
2026-04-21 21:56:25 +01:00

59 lines
2.9 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
import numpy as np
from repixelizer.corpus import prepare_corpus
from repixelizer.io import save_rgba
def test_prepare_corpus_extracts_frames_splits_sheets_and_archives_sources(tmp_path: Path) -> None:
corpus_dir = tmp_path / "corpus"
originals_dir = corpus_dir / "originals"
originals_dir.mkdir(parents=True)
mage = np.zeros((188, 340, 4), dtype=np.float32)
mage[..., 1] = 1.0
mage[20:60, 20:50] = np.array([1.0, 0.0, 0.0, 1.0], dtype=np.float32)
mage[110:160, 270:320] = np.array([0.0, 0.0, 1.0, 1.0], dtype=np.float32)
save_rgba(originals_dir / "mage-1-85x94.png", mage)
shadow = np.zeros((350, 320, 4), dtype=np.float32)
shadow[..., :3] = np.array([0.0, 1.0 / 255.0, 1.0 / 255.0], dtype=np.float32)
shadow[..., 3] = 1.0
shadow[290:340, 250:300] = np.array([1.0, 1.0, 1.0, 1.0], dtype=np.float32)
save_rgba(originals_dir / "shadow-80x70.png", shadow)
multi = np.ones((110, 317, 4), dtype=np.float32)
multi[..., 3] = 1.0
multi[8:102, 0:79] = np.array([1.0, 0.0, 0.0, 1.0], dtype=np.float32)
multi[0:103, 88:210] = np.array([0.0, 1.0, 0.0, 1.0], dtype=np.float32)
multi[0:110, 231:317] = np.array([0.0, 0.0, 1.0, 1.0], dtype=np.float32)
save_rgba(originals_dir / "threeformsPJ2.png", multi)
payload = prepare_corpus(corpus_dir)
assert payload["output_count"] == 5
assert (originals_dir / "mage-1.png").exists()
assert (originals_dir / "shadow.png").exists()
assert (originals_dir / "threeformspj2-01.png").exists()
assert (originals_dir / "threeformspj2-02.png").exists()
assert (originals_dir / "threeformspj2-03.png").exists()
assert (corpus_dir / "source-sheets" / "mage-1-85x94.png").exists()
assert (corpus_dir / "source-sheets" / "shadow-80x70.png").exists()
assert (corpus_dir / "source-sheets" / "threeformsPJ2.png").exists()
attribution_text = (corpus_dir / "ATTRIBUTION.md").read_text(encoding="utf-8")
mage_sidecar = json.loads((originals_dir / "mage-1.json").read_text(encoding="utf-8"))
shadow_sidecar = json.loads((originals_dir / "shadow.json").read_text(encoding="utf-8"))
boss_sidecar = json.loads((originals_dir / "threeformspj2-01.json").read_text(encoding="utf-8"))
assert mage_sidecar["source_title"] == "Bosses and monsters spritesheets (Ars Notoria)"
assert mage_sidecar["attribution_confidence"] == "inferred"
assert shadow_sidecar["licenses"] == ["CC-BY-SA 3.0"]
assert shadow_sidecar["original_source_title"] == "First Person Dungeon Crawl Enemies Remixed"
assert boss_sidecar["source_title"] == '3-form RPG boss: "Harlequin Epicycle."'
assert "## Bosses and monsters spritesheets (Ars Notoria)" in attribution_text
assert "`mage-1.png`" in attribution_text
assert "`shadow.png`" in attribution_text
assert "## 3-form RPG boss: \"Harlequin Epicycle.\"" in attribution_text