test(迁移): 批 B 波 1 G3 套1 格边公式两条迁入 board_gen_reward_test.gd——新宿主落位+manifest 登记+剪切挂载绿+按条变异 2/2 验红(间距项删除与钳制带出带各红唯一);smoke_all.gd 同批删函数,_mk_stream 共享 helper 双份过渡(G11 仍消费)

This commit is contained in:
DKChan committed 2026-10-23 01:54:24 +08:00
1 parent 49dff0853f
commit 7077a04d52
4 files changed
+74 -20

No files matched your search

-20
View File
@@ -1064,26 +1064,6 @@ func _adv_st() -> Dictionary:
# ---- 战斗屏棋盘布局·格边长公式回归(真人试玩 bug⑥:L2 12×12 板下缘被裁约 1/6 格高——
# 公式 N×cell ≤ 可用高−12 必须计入 (N−1)×2px 网格间距,否则网格实高溢出被 clip_contents 裁掉;
# 现公式 = 计入间距 + 垂直预留 24px〔上 12/下 12——底部不贴 D 区边框〕)----
func _smoke_layout_cell_formula() -> void:
print("--- 棋盘布局格边长公式(底部预留回归)---")
var board_generator = load("res://core/board_generator.gd").new()
var board_view = load("res://presentation/views/board_view.gd").new()
for L in [1, 2]:
var b = board_generator.generate(L, 0, _mk_stream("board_gen", 555), _db)
board_view.rebuild(b, null)
var avail := Vector2(1036, 460) # 受约束 D 区可用面积样本(1280×800 档量级——用户实测裁切场景)
board_view.set_cell_area(avail)
var n: int = maxi(b.width, b.height)
var cell: float = board_view.get("_cell")
var grid_h := n * int(cell) + (n - 1) * 2
check(grid_h <= int(avail.y) - 24, "L%d %dx%d 板网格高 %d ≤ 可用高 %d − 预留 24(格边 %dpx——下缘不贴边不裁切)" % [L, b.width, b.height, grid_h, int(avail.y), int(cell)])
check(cell >= 26.0 and cell <= 46.0, "L%d 格边在 26–46 档内(%dpx)" % [L, int(cell)])
board_view.free()
# ---- 未开格类型微光·数据侧断言(V1 作用集恒等/V2 九型归组封闭/V7 零玩法写入)----
# 夹具纪律:身份回调形状与 reward_economy.query_identity 同构({reward_id, cell_type, tier});
# 位点覆盖表 _glow_type_overrides(Vector2i → cell_type)+封锁集 _glow_blocked(Vector2i → true,
+1
View File
@@ -79,6 +79,7 @@ func _suites() -> Array:
{"path": "res://tests/integration/save_rng_roundtrip_test.gd", "expect": 0}, # 存档⇄RNG 快照往返(SaveManager 迁移链 × 断点消费 × RNG 续跑 × 停点态确定性)
# ---- core 四件与呈现层两件的直接单测 ----
{"path": "res://tests/unit/core/board_generator_test.gd", "expect": 0}, # 棋盘生成(尺寸合表/数字=八邻雷数/同种子逐位一致/可推理自洽)
{"path": "res://tests/unit/core/board_gen_reward_test.gd", "expect": 0}, # 棋盘生成与地图战斗资源宿主(格边长公式/资源身份面/生成器三分出口与 r0 闸/伤害量值区间——批 B 自 smoke_all 迁入)
{"path": "res://tests/unit/core/minesweeper_rules_test.gd", "expect": 0}, # 排雷规则(装板不变量/挖的 face 规则/揭示推进/封印/目录外拒)
{"path": "res://tests/unit/core/config_db_resolver_test.gd", "expect": 0}, # 配置解析(ceil 偏难语义/行集行序/难度 clamp)
{"path": "res://tests/unit/core/config_db_cross_validator_test.gd", "expect": 0}, # 跨表校验(正向零错/悬空 skill_id/side 反向)
@@ -0,0 +1,66 @@
# tests/unit/core/board_gen_reward_test.gd — 棋盘生成与地图战斗资源单元测试宿主
# 断言面 = 四套(批 B 断言迁移自 smoke_all.gd,G3 施工组):
# 棋盘布局格边长公式(board_view 格尺寸——下缘预留回归,真人试玩 bug⑥)
# 地图战斗资源·身份面(roll 恰一次 / 五型封闭 / 幂等 / 清图批尾 / 退役闭合)
# 棋盘生成器(行解析 / 可清性 / 合法性 / 出图验收 / 三分出口 / 确定性 / r0 闸)
# 地图战斗资源·伤害量值区间(中点锚 / 域内 / 流动 / 定值不受扰)
# 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload,
# ConfigDB/RngService 显式实例化构造注入(统一流 master 种子 42 沿源);
# 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,表值变异的红由具体断言落,承 G2 同款)。
# 运行:godot --headless --path game --script res://tests/unit/core/board_gen_reward_test.gd
extends SceneTree
const Kit := preload("res://tests/unit/test_kit.gd")
const ConfigDBScript := preload("res://core/config_db.gd")
var _db
var _rng
func _init() -> void:
_db = ConfigDBScript.new()
# 表加载失败不中止(承 G2 同款:表损坏的红落在具体断言上——
# 诊断在此展开,后续断言按坏表实况逐条验红;collect_only=true 下成员照常赋值可评)
var load_ok: bool = _db.load_tables("res://data/tables", true)
if not load_ok:
push_error("[board_gen_reward_test] 表加载返回失败——诊断如下(红由具体断言落)")
for d in _db.diagnostics():
if d.severity == "error" or d.severity == "fatal":
push_error(" [%s] %s: %s" % [d.severity, d.category, d.message])
_rng = load("res://core/rng_service.gd").new()
_rng.set_master_seed(42)
# 套执行序沿源编排序
_smoke_layout_cell_formula()
quit(Kit.finish("board_gen_reward_test"))
# ---- 隔离夹具 ----
# 定域流桩(scope 派生种子——derive_at 纯函数,与取号计数器状态无关)
func _mk_stream(stream_name: String, scope: int) -> RandomNumberGenerator:
# stream_name = 调用点自述标签(不参与派生),保留参数零改调用方
var rg := RandomNumberGenerator.new()
rg.seed = _rng.derive_at(scope)
return rg
# ---- 战斗屏棋盘布局·格边长公式回归(真人试玩 bug⑥:L2 12×12 板下缘被裁约 1/6 格高——
# 公式 N×cell ≤ 可用高−12 必须计入 (N−1)×2px 网格间距,否则网格实高溢出被 clip_contents 裁掉;
# 现公式 = 计入间距 + 垂直预留 24px〔上 12/下 12——底部不贴 D 区边框〕)----
func _smoke_layout_cell_formula() -> void:
print("--- 棋盘布局格边长公式(底部预留回归)---")
var board_generator = load("res://core/board_generator.gd").new()
var board_view = load("res://presentation/views/board_view.gd").new()
for L in [1, 2]:
var b = board_generator.generate(L, 0, _mk_stream("board_gen", 555), _db)
board_view.rebuild(b, null)
var avail := Vector2(1036, 460) # 受约束 D 区可用面积样本(1280×800 档量级——用户实测裁切场景)
board_view.set_cell_area(avail)
var n: int = maxi(b.width, b.height)
var cell: float = board_view.get("_cell")
var grid_h := n * int(cell) + (n - 1) * 2
Kit.check("L%d %dx%d 板网格高 %d ≤ 可用高 %d − 预留 24(格边 %dpx——下缘不贴边不裁切)" % [L, b.width, b.height, grid_h, int(avail.y), int(cell)],
grid_h <= int(avail.y) - 24)
Kit.check("L%d 格边在 26–46 档内(%dpx)" % [L, int(cell)],
cell >= 26.0 and cell <= 46.0)
board_view.free()