115 lines
5.0 KiB
Python
115 lines
5.0 KiB
Python
#!/usr/bin/env python3
|
|
"""Pure tests for the layered validation driver."""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest import mock
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
import validate
|
|
|
|
|
|
class EnvironmentResolutionTests(unittest.TestCase):
|
|
def test_explicit_godot_wins_over_environment_and_path(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
explicit = root / "explicit-godot"
|
|
explicit.write_bytes(b"")
|
|
with mock.patch.object(validate.shutil, "which", return_value=str(root / "path-godot")):
|
|
resolved = validate.resolve_godot(
|
|
str(explicit), {"AGE_GODOT_CONSOLE": str(root / "env-godot")}
|
|
)
|
|
self.assertEqual(explicit.resolve(), resolved)
|
|
|
|
def test_invalid_explicit_godot_does_not_fall_through(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
with mock.patch.object(validate.shutil, "which", return_value=str(root / "path-godot")):
|
|
with self.assertRaisesRegex(ValueError, "not found"):
|
|
validate.resolve_godot(str(root / "missing"), {})
|
|
|
|
def test_path_godot_is_used_after_empty_configuration(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
found = Path(directory) / "godot4"
|
|
found.write_bytes(b"")
|
|
with mock.patch.object(
|
|
validate.shutil,
|
|
"which",
|
|
side_effect=lambda name: str(found) if name == "godot4" else None,
|
|
):
|
|
self.assertEqual(found.resolve(), validate.resolve_godot(None, {}))
|
|
|
|
def test_game_root_precedence_and_sys4ini_validation(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
explicit = root / "explicit"
|
|
environment = root / "environment"
|
|
conventional = root / "conventional"
|
|
for candidate in (explicit, environment, conventional):
|
|
candidate.mkdir()
|
|
(candidate / "SYS4INI.BIN").write_bytes(b"SYS4")
|
|
resolved = validate.resolve_game_root(
|
|
str(explicit), {"AGE_GAME_ROOT": str(environment)}, conventional
|
|
)
|
|
self.assertEqual(explicit.resolve(), resolved)
|
|
|
|
def test_invalid_explicit_game_root_does_not_fall_through(self) -> None:
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
root = Path(directory)
|
|
conventional = root / "conventional"
|
|
conventional.mkdir()
|
|
(conventional / "SYS4INI.BIN").write_bytes(b"SYS4")
|
|
with self.assertRaisesRegex(ValueError, "not found"):
|
|
validate.resolve_game_root(str(root / "missing"), {}, conventional)
|
|
|
|
|
|
class GatePlanTests(unittest.TestCase):
|
|
def test_core_contains_no_workspace_or_runtime_gates(self) -> None:
|
|
keys = {gate.key for gate in validate.build_gate_plan("core")}
|
|
self.assertIn("engine-tests", keys)
|
|
self.assertIn("python-test_validate", keys)
|
|
self.assertNotIn("sys4-corpus-validate", keys)
|
|
self.assertNotIn("godot-selftest", keys)
|
|
self.assertNotIn("age-cli-sweep", keys)
|
|
engine = next(gate for gate in validate.build_gate_plan("core") if gate.key == "engine-tests")
|
|
self.assertIn("Category!=Workspace", engine.command)
|
|
|
|
def test_workspace_extends_core(self) -> None:
|
|
core = {gate.key for gate in validate.build_gate_plan("core")}
|
|
workspace = {gate.key for gate in validate.build_gate_plan("workspace")}
|
|
self.assertLess(core, workspace)
|
|
self.assertIn("sys4-corpus-validate", workspace)
|
|
self.assertIn("engine-workspace-tests", workspace)
|
|
self.assertNotIn("godot-selftest", workspace)
|
|
installed = next(
|
|
gate for gate in validate.build_gate_plan("workspace")
|
|
if gate.key == "engine-workspace-tests"
|
|
)
|
|
self.assertIn("Category=Workspace", installed.command)
|
|
|
|
def test_runtime_requires_resolved_paths(self) -> None:
|
|
with self.assertRaisesRegex(ValueError, "resolved Godot"):
|
|
validate.build_gate_plan("runtime")
|
|
|
|
def test_full_contains_every_phase(self) -> None:
|
|
fake_godot = Path("godot")
|
|
fake_root = Path("game")
|
|
state_root = Path("state")
|
|
plan = validate.build_gate_plan("full", fake_godot, fake_root, state_root)
|
|
keys = {gate.key for gate in plan}
|
|
self.assertIn("sys4-corpus-validate", keys)
|
|
self.assertIn("godot-selftest", keys)
|
|
self.assertIn("age-cli-sweep", keys)
|
|
self.assertEqual("diff-check", plan[-1].key)
|
|
selftest = next(gate for gate in plan if gate.key == "godot-selftest")
|
|
self.assertIn(str(state_root / "godot.log"), selftest.command)
|
|
self.assertIn(("APPDATA", str(state_root / "appdata")), selftest.environment)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|