Files
gplan-2/game/tests/run_all.gd
T
DKChan f2642a87a6 feat(art): T6 underdark/deep_underdark 瓦片换色——程序换色产 L2/L3 两套入包+机检(台账164 换色遗留清偿)
- tools/recolor_terrain_tiles.py: 槽位家族保持重映射(源唯一色→最近 dungeon 锚定家族→家族内亮度秩序线性映射目标色表);目标锚=归档生成器 PALETTES(圣经 §4.3 三关方向,三关换色证明条在案);确定性零随机;源=盘上 v9.3 定稿 21 枚(活件未动)
- 产物: game/assets/art/board/terrain_*_underdark|deep_underdark.png 各 21 枚(素材不入 git 与 dungeon 套一致,.import 编辑器刷)
- BoardView: 瓦片路径按 board_type 后缀参数化(词表名单单点 TILE_WALL_NAMES);rebuild 按板图型切换(_tiles_board_type 守卫零重载);套缺位→整批回落 dungeon(禁同板混渲染),dungeon 亦缺位→程序化平色原回退
- 机检: terrain_tile_sets_test 入 manifest(第 9 套件)——词表 3 型×套完整性(16 墙+5 地面)+墙顶色相域抽检(dungeon 0.089/underdark 0.625/deep 0.639 各落圣经方向带)+图底分离×3+deep 更暗方向;素材工作区缺位=SKIP 不红(不入 git 纪律)
- 轻闸: 冒烟 557/0+ui_input_probe(缺位回退断言保持)+ui_click_probe+9 套件全绿
2026-09-28 03:42:15 +08:00

57 lines
2.7 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# tests/run_all.gd — 单元测试统一入口(ADR-0004 双载体的逻辑测试调用点,套件 manifest 协议 D2 AC-2b)
# 用法:godot --headless --path game --script res://tests/run_all.gd (CI 侧包装外部超时:timeout 120s …)
# 协议:套件清单逐条"套件 → 期望退出码";致命类独立进程(expect=1)。
# 执行形态(单元测试与契约层批 2026-09-28):逐套件起独立 Godot 子进程实跑
#(OS.get_executable_path() 解析本引擎二进制——--script 模式无 autoload/全局标识符,
# 每个测试文件自带显式实例化夹具,见 tests/README 协议要点)。
# 场景探针(.tscn 载体)由 CI/轻闸单独步骤调用,不经本入口。
extends SceneTree
func _init() -> void:
print("[run_all] unit/contract suite entry — %d suites" % _suites().size())
if DisplayServer.get_name() != "headless":
push_warning("[run_all] 建议以 --headless 运行(D2 冒烟协议)")
var failures := 0
for suite in _suites():
failures += _run_suite(suite)
if failures > 0:
push_error("[run_all] %d 个套件失败" % failures)
quit(1)
return
print("[run_all] all green (%d suites)" % _suites().size())
quit(0)
# 套件清单:{ "path": String, "expect": int };致命类(期望非 0)独立进程断言退出码。
func _suites() -> Array:
return [
{"path": "res://tests/unit/example_test.gd", "expect": 0},
{"path": "res://tests/unit/data_config/config_db_test.gd", "expect": 0},
{"path": "res://tests/unit/data_config/config_db_fatal_oob_test.gd", "expect": 1},
{"path": "res://tests/unit/data_config/rng_service_test.gd", "expect": 0},
{"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0},
{"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0},
{"path": "res://tests/unit/contracts/system_contracts_test.gd", "expect": 0},
{"path": "res://tests/unit/presentation/ui_font_asset_test.gd", "expect": 0},
{"path": "res://tests/unit/presentation/terrain_tile_sets_test.gd", "expect": 0},
]
func _run_suite(suite: Dictionary) -> int:
var path: String = suite.get("path", "")
var expect: int = int(suite.get("expect", 0))
if path.is_empty():
push_error("[run_all] suite missing path")
return 1
var args := PackedStringArray(["--headless", "--path", ProjectSettings.globalize_path("res://"), "--script", path])
var out := PackedStringArray()
var code: int = OS.execute(OS.get_executable_path(), args, out, true, false)
var text := "\n".join(out)
print(text)
if code != expect:
push_error("[run_all] FAIL %s — 退出码 %d ≠ 期望 %d" % [path, code, expect])
return 1
print("[run_all] PASS %s (exit=%d)" % [path, code])
return 0