# 致命类用例(独立进程,期望退出码 1)——迭代 38 卡④ wr2-np:扩展行必载 effect_id 负路径断言 # 违约直调 _emit_row(type=extended 无 effect_id 载荷)→ a2 行协议校验 assert 炸(debug 实况, # 输出中的 SCRIPT ERROR 为其测试目标——负面套件全文折叠)→ 零发射; # 回归态(校验段被移除)= 违约行照发 → 退出码 2 ≠ 期望 1(闸红)。 # 独立进程理由:GDScript assert 失败必产 SCRIPT ERROR 且不可捕获,非负面套件会被 run_all 错误 # 扫描判红(迭代 38 卡④ grilling 第二轮同款结论——负面豁免机制为此存在,counter_prefix 先例)。 # 运行:godot --headless --path game --script res://tests/unit/battle_settlement/extended_row_violation_test.gd extends SceneTree const Kit := preload("res://tests/unit/test_kit.gd") func _init() -> void: var db = load("res://core/config_db.gd").new() if not db.load_tables("res://data/tables", false): push_error("[extended_row_violation_test] 表加载失败") quit(2) return var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(74100) var oc = load("res://core/battle_orchestrator.gd").new(db, rng) var hits: Array = [] oc.step_row.connect(func(row): hits.append(row)) # 违约直调(缺 effect_id 载荷——行协议违约):debug 下 a2 校验 assert 炸中断 _emit_row 本体, # 控制流回到本函数(headless assert 语义=中断当前函数不中止运行);release 下 return 零发射同效 oc._emit_row({"type": "extended", "source_class": "fx_reveal", "origin_cell": Vector2i.ZERO}, 1, "负路径", 0, {}) if not hits.is_empty(): push_error("[extended_row_violation_test] 违约行被发射——a2 校验失守(回归)") quit(2) return # 对照组:合法扩展行(带 effect_id)照常发射——校验只拦违约形态 oc._emit_row({"type": "extended", "source_class": "fx_reveal", "origin_cell": Vector2i.ZERO}, 1, "合法对照", 0, {"effect_id": "fx_reveal"}) if hits.size() != 1 or String(hits[0].get("type", "")) != "extended": push_error("[extended_row_violation_test] 合法扩展行未发射——校验误拦(回归)") quit(2) return print("[extended_row_violation_test] 违约零发射+合法照发(a2 校验在位)") quit(1)