# tests/unit/data_config/rng_stream_boot_test.gd — 数据配置加载链与统一 RNG 流单元测试宿主 # 断言面 = 启动初始化套(批 B 断言迁移自 smoke_all.gd `_initialize`,G12 施工组): # data/tables 加载链(全部表加载 + 跨表护栏) # core/rng_service.gd 统一流(master 种子 42 黄金向量 / derive_at 纯函数恒等 / # open_stream 取号序 / new_adventure 会话计数器重置) # 协议照单元侧惯例:extends SceneTree+Kit.check 主通道;--script 模式无 autoload, # ConfigDB/RngService 显式实例化构造注入(master 种子 42 沿源); # 表加载失败不中止(沿被迁断言面的源语义——诊断在此展开,加载链的红由具体断言落)。 # 运行:godot --headless --path game --script res://tests/unit/data_config/rng_stream_boot_test.gd extends SceneTree const Kit := preload("res://tests/unit/test_kit.gd") const ConfigDBScript := preload("res://core/config_db.gd") func _init() -> void: _smoke_initialize() quit(Kit.finish("rng_stream_boot_test")) # ---- 启动初始化断言面(宿主接线注记:源函数名 `_initialize` 是 MainLoop 虚拟入口, # 单元宿主改由 `_init` 显式调用,断言逐字未动;源 :70 事件日志落盘条经主会话裁决一 # 改判集成测试——不随本宿主,见迁移账本转办清单)---- func _smoke_initialize() -> void: print("=== Dungeon Sweeper 垂直切片冒烟 ===") var db = ConfigDBScript.new() var load_ok: bool = db.load_tables("res://data/tables", true) Kit.check("全部表加载 + 校验通过(含跨表护栏)", load_ok) if not load_ok: for d in db.diagnostics(): if d.severity == "error": print(" error: [%s] %s" % [d.category, d.message]) var rng = load("res://core/rng_service.gd").new() rng.set_master_seed(42) # 统一流黄金向量(数据配置 AC-3:单盐沿用 board_gen 盐, # scope 0-3 与 board_gen 向量逐位连续;Python 参考实现逐位交叉验证一致) Kit.check("统一流向量 m=42 scope=0(=旧 board_gen scope0 连续性锚)", rng.derive_at(0) == 8672514112661456564) Kit.check("统一流向量 m=42 scope=1", rng.derive_at(1) == 8834291164406037215) Kit.check("统一流向量 m=42 scope=2", rng.derive_at(2) == 7714373262647006282) Kit.check("统一流向量 m=42 scope=3", rng.derive_at(3) == 1280102845971471347) Kit.check("统一流向量 m=42 scope=4", rng.derive_at(4) == 82585501446482399) Kit.check("统一流向量 m=42 scope=5", rng.derive_at(5) == 8078924421474470922) Kit.check("统一流向量 m=42 scope=6", rng.derive_at(6) == 6638052740430622424) Kit.check("统一流向量 m=42 scope=7", rng.derive_at(7) == 8264196488417721294) Kit.check("derive_at 纯函数恒等", rng.derive_at(0) == rng.derive_at(0)) # scope 取号语义:首个 open_stream = 全局 scope 0;计数器单调;用途标签不参与派生(只进事件日志) var s0 = rng.open_stream("board_gen") var s1 = rng.open_stream("encounter") Kit.check("open_stream 全局计数器单调 +1 ×2", rng.counter() == 2) Kit.check("首个取号 = scope 0(顺序确定)", s0.seed == rng.derive_at(0) and s1.seed == rng.derive_at(1)) rng.new_adventure(4242) var s2 = rng.open_stream("gp_drop") Kit.check("new_adventure 重置全局计数器", rng.counter() == 1 and s2.seed == rng.derive_at(0))