Files
gplan-2/game/tests/unit/data_config/treasure_target_violation_test.gd
T

62 lines
2.8 KiB
GDScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 致命类用例(独立进程,期望退出码 1)
# treasure_target_violation——真视窄域护栏(秘宝 GDD 结构冻结,迭代 7 T1):mine_reveal 行 target
# 越域至 board_wide 时,TreasureItemTable.validate 必须报 load_bearing 错、load_tables 整体拒绝。
# 运行:godot --headless --path game --script res://tests/unit/data_config/treasure_target_violation_test.gd
# 退出码协议:1 = 校验正确拒绝(预期);2 = 违规表被放行(回归信号)。
# 时序注:纯加载期校验——不触运行期 fatal 通道,断言 load_tables 返回 false + 诊断在案即 quit(1)。
extends SceneTree
const ConfigDBScript := preload("res://core/config_db.gd")
const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:BAD 表目录夹具共享(copy_tables)
const SRC_DIR := "res://data/tables"
const BAD_DIR := "user://treasure_fixture_target_violation"
func _inject_violation() -> bool:
var path := BAD_DIR + "/treasure_items.tres"
var f := FileAccess.open(path, FileAccess.READ)
if f == null:
return false
var s := f.get_as_text()
f.close()
# 探巢摆钟(mine_reveal 活行)target area_3x3 → board_wide:双护栏同时命中
var bad := s.replace('"item_id": "nest_pendulum",\r\n"display_name": "探巢摆钟",', '"item_id": "nest_pendulum",\r\n"display_name": "探巢摆钟",')
if bad == s:
# 换行形态回退(LF)
bad = s.replace('"item_id": "nest_pendulum",\n"display_name": "探巢摆钟",', '"item_id": "nest_pendulum",\n"display_name": "探巢摆钟",')
# 直接改 target:摆钟行是全表唯一的 mine_reveal 单维行——把它的 area_3x3 改 board_wide
# (罗盘 retired 行同值 area_3x3 但 retired 免校验——替换须定位摆钟块内)
var blocks := s.split("}, {")
var hit := false
for i in blocks.size():
if '"item_id": "nest_pendulum"' in blocks[i]:
blocks[i] = blocks[i].replace('"target": "area_3x3"', '"target": "board_wide"')
hit = true
s = "}, {".join(blocks)
var w := FileAccess.open(path, FileAccess.WRITE)
if w == null or not hit:
return false
w.store_string(s)
w.close()
return true
func _init() -> void:
if not Kit.copy_tables(SRC_DIR, BAD_DIR) or not _inject_violation():
push_error("[treasure_target_violation_test] 夹具目录准备失败")
quit(2)
return
var db = ConfigDBScript.new()
var ok: bool = db.load_tables(BAD_DIR, false)
if ok:
push_error("[treasure_target_violation_test] 违规表被放行——真视窄域护栏失守(回归)")
quit(2)
return
if db.diagnostics_count("error") >= 1:
print("[treasure_target_violation_test] 护栏触发(load_bearing 诊断在案,加载被拒)")
quit(1)
return
push_error("[treasure_target_violation_test] 加载被拒但无 load_bearing 诊断——护栏通道静默化(回归)")
quit(2)