test(迭代21收口补强): tree_rules_v11_test 六键覆盖缺口修复——宣称六键实只验四键(聚散两键空夹具静默跳过=假绿),判据换 rebuild 实装面行数对照:四键逐键对夹具行数(rebuild 分支被删/漂移转红)+聚散两键断零行(将来加合成行即转红提示复核效果闭集),行数对上才进原 validate_trigger_row 闭集校验;头部注释+green 打印文案换代(消费点=battle_orchestrator._roll_gp_drop / level_runner._spend_discounted 成员判定不入事件面)。纯测试零产品代码;故障注入两例验证断言咬合(夹具键摘除→红/economy 假行→红);run_all 22 套全绿+冒烟 898/0

This commit is contained in:
DKChan committed 2026-10-12 20:53:43 +08:00
1 parent 144e53748e
commit 31a8d2b19d
1 file changed
+24 -5
+24 -5
View File
@@ -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: