Files
aetherbound-guild/tools/test_bat001_reconstruction.py
T
wushenghuaandCodex 155d77557a docs(bat001): record owner runtime acceptance
Close the BAT-001 page package at the accepted normal 100% runtime boundary without activating live battle work.

Co-Authored-By: Codex <noreply@anthropic.com>
2026-08-24 09:26:05 +08:00

104 lines
4.6 KiB
Python

#!/usr/bin/env python3
"""Focused BAT-001 reconstruction-package assertions."""
from __future__ import annotations
import hashlib
import json
import unittest
from pathlib import Path
from PIL import Image
ROOT = Path(__file__).resolve().parents[1]
PAGE = ROOT / "docs/design-authority/pages/BAT-001-battle-opening"
def load(path: Path):
return json.loads(path.read_text(encoding="utf-8"))
def sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as handle:
for chunk in iter(lambda: handle.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
class Bat001ReconstructionTests(unittest.TestCase):
def test_package_files_and_hashes_are_present(self) -> None:
required = [
PAGE / "approved/v001/master.png",
PAGE / "approved/v001/scale-proof.png",
PAGE / "approved/v001/manifest.json",
PAGE / "approved/v001/layer-map.json",
PAGE / "approved/v001/text-slots.json",
PAGE / "approved/v001/hit-areas.json",
PAGE / "reconstruction/v001/clean-static-master.png",
PAGE / "reconstruction/v001/deconstruction-plan.json",
PAGE / "reconstruction/v001/deconstruction-board.png",
PAGE / "reconstruction/v001/asset-contact-sheet.png",
PAGE / "reconstruction/v001/asset-manifest.json",
PAGE / "runtime/reconstruction-spec.json",
PAGE / "runtime/hit-areas.json",
PAGE / "runtime/preflight.json",
]
for path in required:
self.assertTrue(path.is_file(), path)
manifest = load(PAGE / "approved/v001/manifest.json")
for entry in (manifest["approved_master"], manifest["scale_proof"]):
path = PAGE / "approved/v001" / entry["path"]
self.assertEqual(entry["sha256"].removeprefix("sha256:"), sha256(path))
def test_layer_text_and_hit_contracts_are_normalized(self) -> None:
layers = load(PAGE / "approved/v001/layer-map.json")["layers"]
self.assertEqual([layer["z"] for layer in layers], sorted({layer["z"] for layer in layers}))
for layer in layers:
x, y, width, height = layer["bounds"]
self.assertGreater(width, 0, layer["id"])
self.assertGreater(height, 0, layer["id"])
self.assertLessEqual(x + width, 1.000001, layer["id"])
self.assertLessEqual(y + height, 1.000001, layer["id"])
slots = load(PAGE / "approved/v001/text-slots.json")["slots"]
self.assertTrue(slots)
for slot in slots:
self.assertEqual(slot["owner"], "engine", slot["id"])
self.assertIn(100, slot["scale"], slot["id"])
self.assertEqual(set(slot["locales"]), {"zh_CN", "en"}, slot["id"])
areas = load(PAGE / "approved/v001/hit-areas.json")["areas"]
self.assertTrue(areas)
for area in areas:
x, y, width, height = area["anchor"]
self.assertGreaterEqual(width, 0.0, area["id"])
self.assertGreaterEqual(height, 0.0, area["id"])
self.assertLessEqual(x + width, 1.000001, area["id"])
self.assertLessEqual(y + height, 1.000001, area["id"])
def test_authority_is_existing_battle_direction_and_not_rejected_draft(self) -> None:
index = load(ROOT / "docs/design-authority/design-index.json")
page = index["pages"]["BAT-001"]
self.assertEqual(page["status"], "COMPLETE")
self.assertEqual(page["approved"], "pages/BAT-001-battle-opening/approved/v001/master.png")
self.assertIn("phase6_ui_direction_01", page["visual_reference"])
self.assertNotIn("rejected", page["approved"])
contract = load(PAGE / "page-contract.json")
self.assertEqual(contract["state"], "COMPLETE")
self.assertTrue((PAGE / "verification/owner-acceptance.md").is_file())
self.assertIn("oversized ordinary actors", contract["constraints"][-1])
def test_clean_master_keeps_landscape_and_actor_scale_inputs(self) -> None:
with Image.open(PAGE / "approved/v001/master.png") as approved, Image.open(PAGE / "reconstruction/v001/clean-static-master.png") as clean:
self.assertEqual(approved.size, (2048, 1152))
self.assertEqual(clean.size, (2048, 1152))
self.assertAlmostEqual(approved.width / approved.height, 16 / 9, places=3)
spec = load(PAGE / "runtime/reconstruction-spec.json")
company = next(layer for layer in spec["layers"] if layer["id"] == "ordered_company_line")
self.assertEqual(company["count"], "exact ordered_party_ids")
self.assertIn("10-14%", company["layout"])
if __name__ == "__main__":
unittest.main()