Files
gplan-2/game/tests/unit/presentation/battle_log_zero_text_test.gd
T

111 lines
5.2 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.
# VERTICAL SLICE - NOT FOR PRODUCTION
# 结算期 B 区零逐行文字断言(逐行结算排播退役——08-Alpha v1.29 删「逐行结算排播」行、
# 用户裁定 2026-11-07 撤逐行滚动文字列表保留伤害飘字与攻击特效):
# ① 真实结算产生逐行后(排播队列非空前提),B 区 RichTextLabel 行文本恒空(零逐行追加);
# ② 排播泵消费期间与 flush 排空后 parsed_text 恒空——step_row 消费零产生 append_text 行;
# ③ FX 排播链仍在(伤害行驱动演出层弹道/数字——演出不随文字退役,〔退役改 V-退役卡 R1〕)。
# 载体:main.tscn 实例(组合根全链在座),真实冒险驱动至首战结算后断言(同 pacing_queue_test 形态)。
# 运行:godot --headless --path game --script res://tests/unit/presentation/battle_log_zero_text_test.gd(expect 0)
extends SceneTree
var _problems: Array = []
func check(cond: bool, msg: String) -> void:
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
if not cond:
_problems.append(msg)
func _init() -> void:
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
_smoke_settle_zero_rows()
func _smoke_settle_zero_rows() -> void:
# 判据出处: design/gdd/08-Alpha版本标准.md:154 战斗演出链(弹道 / 受击 / 血条 / 灰化)在役;
# 逐行结算排播行已随 v1.29 退役——结算期 B 区零逐行文字、FX 排播链保持
var main: Node = load("res://presentation/main.tscn").instantiate()
root.add_child(main)
await process_frame
for p in ["user://test_log_zero_text_save.json", "user://test_log_zero_text_save.json.tmp"]:
if FileAccess.file_exists(p):
DirAccess.remove_absolute(p)
var sm = main.get_node("/root/SaveManager")
sm.slots.attach_path("user://test_log_zero_text_save.json")
sm.meta_state.mark_first_adventure_done()
main._start_adventure_from_menu()
await process_frame
if not main.ui.modals.run.level_screen.visible:
_problems.append("入口停点未呈现(前置失守)")
_finish()
return
main.run_scope.runner.pick_next_node(int(main.run_scope.runner.next_candidate_ids()[0]))
await process_frame
await process_frame
var battle = main.run_scope.runner.current_battle()
if battle == null:
_problems.append("首战未开打(零文字断言无载体)")
_finish()
return
var rows_seen: Array = []
battle.step_row.connect(_count_row.bind(rows_seen))
# 理性策略挖掘至受理一动作(auto_player 单一实现复用——同 pacing_queue_test 两步消费)
var ms = battle.minesweeper
var ap = load("res://sim/auto_player.gd")
var acted := false
for guard in range(40):
var plan: Dictionary = ap.choose_dig(ms)
if plan.is_empty():
break
if plan.hero_cell != ms.hero_pos():
ms.settle_batch([{"action": "move", "cell": plan.hero_cell}])
if battle.action_economy.phase != "Active":
break
var outcomes: Array = ms.settle_batch([{"action": "dig", "cell": plan.dig_cell}])
acted = not outcomes.is_empty() and bool(outcomes[0].accepted)
if acted:
break
if battle.action_economy.phase == "Active":
ms.settle_batch([{"action": "stop"}])
if not acted:
_problems.append("首战无受理动作(零文字断言无行)")
_finish()
return
await process_frame
check(rows_seen.size() > 0, "结算行已产生(断言前提:%d 行)" % rows_seen.size())
var log_view = main.ui.battle.log_view
# 判据绑定面 = append_text 调用计数=0(「不绑终屏态」):进节点叙述行(node_banner,真实入口
# 既有叙述面、非 step_row 消费产物)落带后采基线,断言 step_row 消费全程文本冻结零追加。
var base_text: String = log_view.parsed_text()
# ---- 时点一:行已入队、排播泵消费中——零新增行 ----
check(log_view.parsed_text() == base_text, "结算消费中 B 区零新增行(时点一:逐行追加零发生)〔退役改 V-退役卡 R1〕")
await process_frame
await process_frame
# ---- 时点二:泵已消费若干行——仍零新增(文字入带调用已撤,泵只驱动演出链)----
check(log_view.parsed_text() == base_text, "泵消费数帧后 B 区零新增行(时点二)〔退役改 V-退役卡 R1〕")
# ---- flush 同步排空(模态前置契约路径)后再采——仍零新增 ----
main.ui.screens.row_pacer.flush()
check(main.ui.screens.row_pacer.pending_rows().is_empty(), "flush 后队列排空(完整性前提)")
check(log_view.parsed_text() == base_text, "排空后 B 区零新增行(时点三:step_row 消费 append_text 计数=0)〔退役改 V-退役卡 R1〕")
_finish()
func _count_row(row: Dictionary, arr: Array) -> void:
arr.append(row.duplicate(true))
func _finish() -> void:
# 判据出处: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
for p in ["user://test_log_zero_text_save.json", "user://test_log_zero_text_save.json.tmp"]:
if FileAccess.file_exists(p):
DirAccess.remove_absolute(p)
if _problems.is_empty():
print("[battle_log_zero_text_test] PASS — 结算期 B 区零逐行文字 全绿")
quit(0)
else:
for p in _problems:
push_error("[battle_log_zero_text_test] FAIL — " + p)
print("[battle_log_zero_text_test] FAIL — " + p)
quit(1)