From 31a8d2b19d5cd304f4763748b04b606363d7acc7 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 12 Oct 2026 20:53:43 +0800 Subject: [PATCH] =?UTF-8?q?test(=E8=BF=AD=E4=BB=A321=E6=94=B6=E5=8F=A3?= =?UTF-8?q?=E8=A1=A5=E5=BC=BA):=20tree=5Frules=5Fv11=5Ftest=20=E5=85=AD?= =?UTF-8?q?=E9=94=AE=E8=A6=86=E7=9B=96=E7=BC=BA=E5=8F=A3=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E2=80=94=E2=80=94=E5=AE=A3=E7=A7=B0=E5=85=AD=E9=94=AE=E5=AE=9E?= =?UTF-8?q?=E5=8F=AA=E9=AA=8C=E5=9B=9B=E9=94=AE=EF=BC=88=E8=81=9A=E6=95=A3?= =?UTF-8?q?=E4=B8=A4=E9=94=AE=E7=A9=BA=E5=A4=B9=E5=85=B7=E9=9D=99=E9=BB=98?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=3D=E5=81=87=E7=BB=BF=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E5=88=A4=E6=8D=AE=E6=8D=A2=20rebuild=20=E5=AE=9E=E8=A3=85?= =?UTF-8?q?=E9=9D=A2=E8=A1=8C=E6=95=B0=E5=AF=B9=E7=85=A7=EF=BC=9A=E5=9B=9B?= =?UTF-8?q?=E9=94=AE=E9=80=90=E9=94=AE=E5=AF=B9=E5=A4=B9=E5=85=B7=E8=A1=8C?= =?UTF-8?q?=E6=95=B0=EF=BC=88rebuild=20=E5=88=86=E6=94=AF=E8=A2=AB?= =?UTF-8?q?=E5=88=A0/=E6=BC=82=E7=A7=BB=E8=BD=AC=E7=BA=A2=EF=BC=89+?= =?UTF-8?q?=E8=81=9A=E6=95=A3=E4=B8=A4=E9=94=AE=E6=96=AD=E9=9B=B6=E8=A1=8C?= =?UTF-8?q?=EF=BC=88=E5=B0=86=E6=9D=A5=E5=8A=A0=E5=90=88=E6=88=90=E8=A1=8C?= =?UTF-8?q?=E5=8D=B3=E8=BD=AC=E7=BA=A2=E6=8F=90=E7=A4=BA=E5=A4=8D=E6=A0=B8?= =?UTF-8?q?=E6=95=88=E6=9E=9C=E9=97=AD=E9=9B=86=EF=BC=89=EF=BC=8C=E8=A1=8C?= =?UTF-8?q?=E6=95=B0=E5=AF=B9=E4=B8=8A=E6=89=8D=E8=BF=9B=E5=8E=9F=20valida?= =?UTF-8?q?te=5Ftrigger=5Frow=20=E9=97=AD=E9=9B=86=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=EF=BC=9B=E5=A4=B4=E9=83=A8=E6=B3=A8=E9=87=8A+green=20=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=96=87=E6=A1=88=E6=8D=A2=E4=BB=A3=EF=BC=88=E6=B6=88?= =?UTF-8?q?=E8=B4=B9=E7=82=B9=3Dbattle=5Forchestrator.=5Froll=5Fgp=5Fdrop?= =?UTF-8?q?=20/=20level=5Frunner.=5Fspend=5Fdiscounted=20=E6=88=90?= =?UTF-8?q?=E5=91=98=E5=88=A4=E5=AE=9A=E4=B8=8D=E5=85=A5=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E9=9D=A2=EF=BC=89=E3=80=82=E7=BA=AF=E6=B5=8B=E8=AF=95=E9=9B=B6?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E4=BB=A3=E7=A0=81=EF=BC=9B=E6=95=85=E9=9A=9C?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=E4=B8=A4=E4=BE=8B=E9=AA=8C=E8=AF=81=E6=96=AD?= =?UTF-8?q?=E8=A8=80=E5=92=AC=E5=90=88=EF=BC=88=E5=A4=B9=E5=85=B7=E9=94=AE?= =?UTF-8?q?=E6=91=98=E9=99=A4=E2=86=92=E7=BA=A2=EF=BC=8Feconomy=20?= =?UTF-8?q?=E5=81=87=E8=A1=8C=E2=86=92=E7=BA=A2=EF=BC=89=EF=BC=9Brun=5Fall?= =?UTF-8?q?=2022=20=E5=A5=97=E5=85=A8=E7=BB=BF+=E5=86=92=E7=83=9F=20898/0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/unit/core/tree_rules_v11_test.gd | 29 +++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) 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: