diff --git a/game/tests/unit/contracts/system_contracts_test.gd b/game/tests/unit/contracts/system_contracts_test.gd index 11b0a352..2d172f7c 100644 --- a/game/tests/unit/contracts/system_contracts_test.gd +++ b/game/tests/unit/contracts/system_contracts_test.gd @@ -63,8 +63,11 @@ func _test_rng_tag_closure(db) -> void: var stream_label: String = String(db.combat.settlement.damage_roll.armor_roll_stream) Kit.check("settlement.armor_roll_stream ∈ RngService 封闭标签词表(EC12)", RngServiceScript.PURPOSE_TAGS.has(stream_label)) + var unique_tags: Dictionary = {} + for t in RngServiceScript.PURPOSE_TAGS: + unique_tags[String(t)] = true Kit.check("RngService 用途标签词表非空且互异(封闭语义由流改标签)", - RngServiceScript.PURPOSE_TAGS.size() > 0) + RngServiceScript.PURPOSE_TAGS.size() > 0 and unique_tags.size() == RngServiceScript.PURPOSE_TAGS.size()) # ---- B1→D1 行协议:单据九栏缺省齐备 + 协议公共键形态 ---- diff --git a/game/tests/unit/core/feat_vouchers_test.gd b/game/tests/unit/core/feat_vouchers_test.gd index ee376c43..31072369 100644 --- a/game/tests/unit/core/feat_vouchers_test.gd +++ b/game/tests/unit/core/feat_vouchers_test.gd @@ -48,7 +48,11 @@ func _init() -> void: a.stop()._node_pending = {} # 摘牌:选中即消尽(禁早退路径零摘牌) var deck_refresh_before: int = a.deck().pool_stock("refresh") - Kit.check_quiet(deck_refresh_before == 0 or true, "牌库 refresh 令牌读数在域(投放 %d)" % deck_refresh_before) + var deck_refresh_quota := 0 + for tier in db.run.adventure.TIERS: + deck_refresh_quota += int(db.run.adventure.curio_quota("refresh", String(tier))) + Kit.check_quiet(deck_refresh_before == deck_refresh_quota - 1, + "牌库 refresh 令牌读数=表配额−本会话已兑付一张(读数 %d/配额 %d)" % [deck_refresh_before, deck_refresh_quota]) # V9-2 储备金袋:待注入账 + 战首注入(节点级) a.stop()._pending = {"candidates": [{"kind": "rap", "tier": "rare"}]} # 停点候选直写(构造面——pick_curio 真实入口前置) diff --git a/game/tests/unit/core/level_shop_economy_test.gd b/game/tests/unit/core/level_shop_economy_test.gd index aace162a..350f31bd 100644 --- a/game/tests/unit/core/level_shop_economy_test.gd +++ b/game/tests/unit/core/level_shop_economy_test.gd @@ -570,6 +570,7 @@ func _smoke_level_graph() -> void: var green_ok := true var green_min_hp := 99999 var green_wins := 0 + var green_hp_floor_ok := true # 胜局 HP>0 旗(绿档记录义务——败局样本不入账,胜局 0 血即红) for i in range(12): var g_runner = load("res://core/level_runner.gd").new(_db, _fresh_rng(9100 + i)) g_runner.start_level(2, 9100 + i) @@ -589,9 +590,11 @@ func _smoke_level_graph() -> void: green_wins += 1 if int(g_box.get("hero_hp", 0)) > 0: green_min_hp = mini(green_min_hp, int(g_box.hero_hp)) + else: + green_hp_floor_ok = false Kit.check("首遇位零踩雷:完美档 12 种子(节点 0 熊地精)恒零踩雷", green_ok) Kit.check("首遇战胜局 ≥7/12(实际 %d——阶段拔高后锚行退出绿档,多数胜口径)" % green_wins, green_wins >= 7) - Kit.check("首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green_min_hp, green_min_hp > 0) + Kit.check("首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green_min_hp, green_hp_floor_ok and green_min_hp < 99999) # ⑦ 跨表覆盖义务:L2 现行起关图每战斗/Boss 节点深度的敌侧落带 ≥ 请求深度(顶 clamp 消解即红) # +每深度 board_gen 精确命中(判据实现与〔v11〕种子扫描段同源——_enemy_band_covers/_board_row_exact 单点) var cov2 := _coverage_scan(2, nodes2) @@ -675,6 +678,7 @@ func _smoke_level_graph() -> void: # (零加成基线红档属预期——断言口径 = 成长代理档,非基线;跑法同 ⑥) var green3_ok := true var green3_min_hp := 99999 + var green3_hp_floor_ok := true # 胜局 HP>0 旗(绿档记录义务——胜局 0 血即红) for i in range(12): var g3_runner = load("res://core/level_runner.gd").new(_db, _fresh_rng(9100 + i)) g3_runner.set_hero_override(200, 100) @@ -693,8 +697,10 @@ func _smoke_level_graph() -> void: green3_ok = false elif int(g3_box.get("hero_hp", 0)) > 0: green3_min_hp = mini(green3_min_hp, int(g3_box.hero_hp)) + else: + green3_hp_floor_ok = false Kit.check("L3 首遇位绿档:成长代理档口径(atk_pct=200/hp_pct=100)完美档 12 种子首遇战(节点 0 灰矮人)全胜且零踩雷", green3_ok) - Kit.check("L3 首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green3_min_hp, green3_min_hp > 0) + Kit.check("L3 首遇战胜后 HP 下探读数 %d(>0——绿档记录)" % green3_min_hp, green3_hp_floor_ok and green3_min_hp < 99999) # ⑫ 混编行集运行面正反断言:注入带键 (1,battle,5)/(1,battle,6) = # L1 节点图与全部既有扫描面之外的新带键(带命中精确取注入行集——新 L 会被 ceil 封顶到 L3 不可用), diff --git a/game/tests/unit/core/treasure_effects_test.gd b/game/tests/unit/core/treasure_effects_test.gd index 4f232f6a..ce7eb59b 100644 --- a/game/tests/unit/core/treasure_effects_test.gd +++ b/game/tests/unit/core/treasure_effects_test.gd @@ -260,7 +260,7 @@ func _init() -> void: if not overlay11.has(c_v): overlay_ok = false Kit.check_quiet(overlay_ok, "天眼正常:窗口全格入真视叠加层(危险格显示=C5 有差别开格)") - Kit.check_quiet(not ob11.minesweeper.clear_map_cleared() or true, "天眼开格走普通挖格链(连锁/资源兑付=fx_reveal 通道——免 AP 即效果本身)") + Kit.check_quiet(not ob11.minesweeper.clear_map_cleared(), "天眼开格走普通挖格链(连锁/资源兑付=fx_reveal 通道——免 AP 即效果本身)") # ⑫ 信标网络(封印不限相邻/封印价照付) var rng12 = load("res://core/rng_service.gd").new(); rng12.set_master_seed(311)