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>
104 lines
4.6 KiB
Python
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()
|