diff --git a/game/tests/unit/core/tree_rules_v11_test.gd b/game/tests/unit/core/tree_rules_v11_test.gd index a5064fc6..6325b638 100644 --- a/game/tests/unit/core/tree_rules_v11_test.gd +++ b/game/tests/unit/core/tree_rules_v11_test.gd @@ -1,7 +1,12 @@ -# tests/unit/core/tree_rules_v11_test.gd — 天赋树批 V11:六键合成订阅行走效果引擎加载期校验零违例 -# (契约 5——效果类型闭集不加新词:六键效果全部走现有 EVENTS/FACTS/OPS/EFFECT_KINDS/DO_KEYS +# tests/unit/core/tree_rules_v11_test.gd — 天赋树批 V11:四键合成订阅行闭集校验零违例 + 聚散两键无行断言 +# (契约 5——效果类型闭集不加新词:四键效果全部走现有 EVENTS/FACTS/OPS/EFFECT_KINDS/DO_KEYS # 在册词表组合;本测试直构 rebuild 同构合成行(与 effect_engine.gd rebuild 树规则段逐字段同源) # 调 validate_trigger_row 断零违例。实现侧扩闭集未呈报时,本断言以在册词表为准转红。 +# 聚散两键(economy_hoard/economy_spend)不入事件面:消费点=tree_rules 成员判定 +# (battle_orchestrator._roll_gp_drop GP 掉落乘算 / level_runner._spend_discounted 商品折价), +# rebuild 树规则段对两键零合成行——此状态在此被显式断言(旧版对两键取空夹具静默跳过=假绿): +# rebuild 实装面行数对照——四键逐键与夹具同行数(rebuild 分支被删/漂移即转红), +# 两键断零行(将来被加合成行即转红,提示先复核效果闭集再同步夹具与实现)。 # 载体:run_all 单元套件(显式实例化夹具——--script 模式无 autoload)。) extends SceneTree @@ -10,7 +15,7 @@ func _init() -> void: var eng = load("res://core/effect_engine.gd") var tree_tbl = load("res://data/schemas/meta_tree_table.gd") var errs: Array = [] - # 六键合成行(与 rebuild 树规则段同构——逐字段对照,实现漂移在此转红) + # 四键合成行夹具(与 rebuild 树规则段同构——逐字段对照,实现漂移在此转红) var synth := { "posture_first_strike": [{"on": "round_start", "when": [{"fact": "battle_index", "op": "eq", "value": 1}, @@ -34,10 +39,24 @@ func _init() -> void: "do": {"kind": "counter_add", "counter_id": "tree_sense_guard_used", "value": 1, "domain": "adventure"}}], } var six := ["posture_first_strike", "posture_bulwark", "sense_sharp", "sense_guard", "economy_hoard", "economy_spend"] + # rebuild 实装面(db=null→feat/attune 两段空转,_triggers 只含树规则合成行)——行数对照载体 + var eng_inst = eng.new() + eng_inst.rebuild([], [], six) for key in six: if not tree_tbl.RULE_KEYS.has(key): errs.append("规则键出域 RULE_KEYS 词表: %s" % key) - for tr in (synth.get(key, []) as Array): + var live := 0 + for tr in eng_inst._triggers: + if String(tr.source) == "tree" and String(tr.id) == String(key): + live += 1 + var fixture_rows: Array = synth.get(key, []) as Array + if live != fixture_rows.size(): + if fixture_rows.is_empty(): + errs.append("聚散键应有零树合成订阅行(消费点=tree_rules 成员判定不入事件面——加行前先复核效果闭集并同步本测试): %s 实有 %d 行" % [key, live]) + else: + errs.append("rebuild 树规则段行数与夹具不符: %s 夹具 %d 行 实有 %d 行" % [key, fixture_rows.size(), live]) + continue + for tr in fixture_rows: eng.validate_trigger_row("tree_synth_" + String(key), {}, [tr], errs) # 反例:出域事件/出域效果类型在校验面转红(护栏活着——独立数组,命中即护栏有效) var bad_errs: Array = [] @@ -46,7 +65,7 @@ func _init() -> void: if bad_errs.is_empty(): errs.append("反例护栏失效:出域事件/出域效果类型未被 validate_trigger_row 拒绝") if errs.is_empty(): - print("[tree_rules_v11] all green(六键合成行零违例 + 反例被拒——契约 5 闭集在册词表承载)") + print("[tree_rules_v11] all green(四键合成行零违例 + 聚散两键无行成立 + 反例被拒——契约 5 闭集在册词表承载)") quit(0) return for e in errs: