Star-Edit/tools/template_tools_test.py
Kenearos aba9759400 feat: Terrain-Template-Auswahl (sc_list_templates / sc_new_from_template)
Aus vorgefertigten Basis-Karten (data/maps/templates/) eine Arbeits-Basiskarte erzeugen, statt jedes Terrain manuell zu bauen. workspace.py: TEMPLATES_DIR + list_templates/read_terrain_meta/new_from_template. tools/terrain_roundtrip_test.py belegt section-stabilen RichChk-Durchlauf; tools/template_tools_test.py testet die neuen Tools end-to-end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 19:29:22 +02:00

93 lines
3.2 KiB
Python

"""Verifikation der Terrain-Template-Tools (sc_list_templates / sc_new_from_template).
Ablauf:
base-map.scx -> als Template ablegen -> sc_list_templates -> sc_new_from_template
-> die erzeugte Basiskarte oeffnen und Tileset/Groesse bestaetigen.
Raeumt seine Test-Artefakte am Ende wieder weg.
"""
from __future__ import annotations
import os
import shutil
import sys
HERE = os.path.dirname(__file__)
MAPS = os.path.abspath(os.path.join(HERE, "..", "data", "maps"))
TPLS = os.path.join(MAPS, "templates")
# WICHTIG: vor dem Import setzen (Module lesen die Env beim Laden).
os.environ["SC_MAPS_DIR"] = MAPS
os.environ["SC_TEMPLATES_DIR"] = TPLS
from starcraft_mcp import server, workspace # noqa: E402
TEST_TEMPLATE = "_test_jungle_256.scx"
TEST_BASE = "_test_tpl_base.scx"
def cleanup():
for p in (os.path.join(TPLS, TEST_TEMPLATE), os.path.join(MAPS, TEST_BASE)):
if os.path.exists(p):
os.remove(p)
workspace.discard_workspace(TEST_BASE)
def main() -> int:
cleanup()
ok = True
# 1) Template bereitstellen (base-map als Vorlage kopieren)
shutil.copyfile(os.path.join(MAPS, "base-map.scx"), os.path.join(TPLS, TEST_TEMPLATE))
print(f"[setup] template gelegt: {TEST_TEMPLATE}")
# 2) sc_list_templates
listed = server.sc_list_templates()
names = [t["name"] for t in listed["templates"]]
print(f"[1] sc_list_templates -> count={listed['count']} names={names}")
match = next((t for t in listed["templates"] if t["name"] == TEST_TEMPLATE), None)
if not match:
print(" FAIL: Test-Template nicht gelistet")
ok = False
else:
print(f" meta: tileset={match.get('tileset')} "
f"size={match.get('width')}x{match.get('height')}")
if str(match.get("tileset")).upper() != "JUNGLE" or match.get("width") != 256:
print(" WARN: unerwartete Metadaten (base-map = 256x256 Jungle erwartet)")
# 3) sc_new_from_template (overwrite explizit -> kein Field-Default-Problem)
created = server.sc_new_from_template(
template=TEST_TEMPLATE, output_name=TEST_BASE, overwrite=True
)
print(f"[2] sc_new_from_template -> {created}")
new_path = os.path.join(MAPS, TEST_BASE)
if not os.path.exists(new_path):
print(" FAIL: neue Basiskarte wurde nicht erstellt")
ok = False
# 4) erzeugte Karte oeffnen + beschreiben
desc = server.sc_describe_map(map=TEST_BASE)
print(f"[3] sc_describe_map -> tileset={desc['tileset']} size={desc['size']} "
f"triggers={desc['trigger_count']} locations={len(desc['locations'])}")
if str(desc["tileset"]).upper() != "JUNGLE" or desc["size"]["width"] != 256:
print(" FAIL: erzeugte Karte hat unerwartetes Terrain")
ok = False
# 5) Fehlerpfad: unbekanntes Template -> FileNotFoundError
try:
server.sc_new_from_template(
template="gibtsnicht.scx", output_name="_x.scx", overwrite=True
)
print("[4] FAIL: unbekanntes Template haette werfen muessen")
ok = False
except FileNotFoundError as e:
print(f"[4] unbekanntes Template wirft korrekt: {type(e).__name__}")
cleanup()
print()
print("RESULT:", "PASS" if ok else "FAIL")
return 0 if ok else 1
if __name__ == "__main__":
sys.exit(main())