标识符面:flag_*→seal_ 族(含 Godot 信号 flag_judged→seal_judged 与连接/回调同名、 FACTS 两键 flags_count→seals_count/dug_under_flag→dug_under_seal 全链、 .tres 键名与 schema .gd 同批同步);显式豁免零改动=size_flags_*(Godot 布局属性)+_fatal_flag。 中文面:金币→GP(金币袋→GP 袋)/插旗→封印/雷格→危险格/惩罚格→危险格/旗→封印·封印印记族, game/ 内 *.gd/.tres/.md/.json 四类禁用词与 flag 双双零命中(V1/V4)。 守卫字面量不动(被检查的禁字不是使用):smoke_all V21 零「雷/旗」检查面、 ui_font_asset_test 字形集攻/雷/旗/封 保持原断言逻辑。 代拍板:板面单字槽 glyph「旗」→「封」(禁字纪律+单字位宽,消费面四处同名随动)。 素材换代(2026-10-18 用户裁案甲):assets/art/board/flag_seal.png→seal_mark.png(素材不入 git, 盘上改名+导入重刷),代码两处 res:// 字符串+COL_FLAG/CURSOR_FLAG 常量同步, 闸件四处随批(run_all_gates.sh/render_gate.sh/golden_baseline_refresh.sh/path_check.py)。 anchor.json 键名手改,重锚与改前改后 diff 随本卡收口(同裁案甲)。 基线读数(改前,主区 ed2dfaf6):冒烟 1151 检查 0 失败/单元 34 套全绿/探针 --click 存量红仅 screen_flow_probe(user:// 断点污染在册已知项)。 改后同批读数(本 worktree):冒烟 1151 检查 0 失败/探针 --click 同一存量红、其余全绿。
48 lines
2.3 KiB
GDScript
48 lines
2.3 KiB
GDScript
# tests/unit/presentation/hud_presenter_test.gd — HUD 投影直接单测(迭代 29 T5 补洞:该模块此前零指名)
|
||
# 断言面 = 纯函数投影:动作结果文案按拒绝原因逐类落字(玩家看到的每句提示都由这里出)、
|
||
# 未知原因有兜底文案(不吐空串)、棋盘变异行投影随表走。期望值由注入内容数出来。
|
||
# 运行:godot --headless --path game --script res://tests/unit/presentation/hud_presenter_test.gd
|
||
extends SceneTree
|
||
|
||
const Kit := preload("res://tests/unit/test_kit.gd")
|
||
const HudScript := preload("res://presentation/hud_presenter.gd")
|
||
|
||
|
||
func _init() -> void:
|
||
_test_accepted_text()
|
||
_test_reject_text_by_reason()
|
||
_test_unknown_reason_fallback()
|
||
quit(Kit.finish("hud_presenter_test"))
|
||
|
||
|
||
func _test_accepted_text() -> void:
|
||
var t: String = HudScript.outcome_text({"accepted": true})
|
||
Kit.check("受理态文案固定为「执行完成。」(实际「%s」)" % t, t == "执行完成。")
|
||
|
||
|
||
func _test_reject_text_by_reason() -> void:
|
||
var cases := {
|
||
"not_adjacent": "不能执行:目标与小人不相邻",
|
||
"target_revealed": "不能执行:目标已开",
|
||
"seal_present": "不能封印:此格已有封印印记(封印为一次性承诺——相邻时左键直接挖开)",
|
||
}
|
||
var bad: Array[String] = []
|
||
for sub in cases:
|
||
var got: String = HudScript.outcome_text({
|
||
"accepted": false, "reject_reason": "board_face", "sub_reason": sub,
|
||
})
|
||
if got != String(cases[sub]):
|
||
bad.append("%s→「%s」" % [sub, got])
|
||
Kit.check("棋盘面各拒绝原因文案逐类正确(错 %d 项 %s)" % [bad.size(), str(bad)], bad.is_empty())
|
||
var ap: String = HudScript.outcome_text({"accepted": false, "reject_reason": "resource_face"})
|
||
Kit.check("资源面拒绝文案为「AP 不足。」(实际「%s」)" % ap, ap == "AP 不足。")
|
||
|
||
|
||
func _test_unknown_reason_fallback() -> void:
|
||
var t: String = HudScript.outcome_text({"accepted": false, "reject_reason": "brand_new_reason"})
|
||
Kit.check("未知拒绝原因兜底为「动作被拒。」而非空串(实际「%s」)" % t, t == "动作被拒。")
|
||
var sub: String = HudScript.outcome_text({
|
||
"accepted": false, "reject_reason": "board_face", "sub_reason": "brand_new_sub",
|
||
})
|
||
Kit.check("棋盘面未知子因兜底带前缀可诊断(实际「%s」)" % sub, sub.begins_with("棋盘面拒绝: "))
|