111 lines
5.2 KiB
GDScript
111 lines
5.2 KiB
GDScript
# 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)
|