iter51-卡3

This commit is contained in:
DKChan committed 2026-11-04 05:08:32 +08:00
1 parent 372b4fdc31
commit f9f2cb2d27
4 files changed
+79 -2

No files matched your search

@@ -0,0 +1,76 @@
# tests/unit/core/encapsulation_p2_sweep_test.gd — 架构审查 P2·NODE_TYPES 词表单点化结构性扫描宿主
# 断言面 = 两组(均带「扫描面非空前置+正锚」):
# V1 node_map_generator:非空+本地 const NODE_TYPES 定义零命中+LevelTable.NODE_TYPES.has( 正锚
# (词表唯一落点归 schema owner——表行校验 LevelTable;生成器 class_name 直引=S3 豁免面在案形态)
# V2 生产三目录(core/data/presentation)`NODE_TYPES :=` 定义恰好 1 处且落 data/schemas/level_table.gd
# 手法沿 encapsulation_sweep_test 源 token 扫描先例(两卡独立 worktree 独立批——不并件)。
# 运行:godot --headless --path game --script res://tests/unit/core/encapsulation_p2_sweep_test.gd
extends SceneTree
const Kit := preload("res://tests/unit/test_kit.gd")
func _init() -> void:
_sweep_generator()
_sweep_production_face()
quit(Kit.finish("encapsulation_p2_sweep_test"))
func _src(path: String) -> String:
var src := FileAccess.get_file_as_string(path)
Kit.check("扫描面非空前置:%s" % path, src.length() > 0)
return src
func _zero(pattern: String, src: String, label: String) -> void:
var re := RegEx.create_from_string(pattern)
Kit.check("%s:%s 零命中〔架构P2〕" % [label, pattern], re.search(src) == null)
func _anchor(pattern: String, src: String, label: String) -> void:
var re := RegEx.create_from_string(pattern)
Kit.check("%s:%s 正锚在案〔架构P2〕" % [label, pattern], re.search(src) != null)
# ① V1 生成器词表定义删除与改指
func _sweep_generator() -> void:
var src := _src("res://core/node_map_generator.gd")
if src.length() == 0:
return
_zero("(?m)^const NODE_TYPES", src, "生成器本地词表副本归零")
_anchor("LevelTable\\.NODE_TYPES\\.has\\(", src, "schema 词表直引在用")
# ② V2 生产三目录定义唯一性(递归扫 .gd,恰好 1 处且落 level_table.gd)
func _sweep_production_face() -> void:
var files: Array[String] = []
for dir_path in ["res://core", "res://data", "res://presentation"]:
_collect_gd(dir_path, files)
Kit.check("扫描面非空前置:生产三目录 .gd ≥ 1 件", files.size() > 0)
var re := RegEx.create_from_string("NODE_TYPES\\s*:?=")
var hits: Array[String] = []
for f in files:
var src := FileAccess.get_file_as_string(f)
if src.length() > 0 and re.search(src) != null:
hits.append(f)
Kit.check("生产面 NODE_TYPES 定义恰好 1 处(实得 %d)〔架构P2〕" % hits.size(), hits.size() == 1)
if hits.size() == 1:
Kit.check("唯一定义落 data/schemas/level_table.gd〔架构P2〕", hits[0] == "res://data/schemas/level_table.gd")
# 递归收集 .gd(跳过 .godot 缓存与 .uid 边车)
func _collect_gd(dir_path: String, out: Array[String]) -> void:
var dir := DirAccess.open(dir_path)
if dir == null:
return
dir.list_dir_begin()
var name := dir.get_next()
while name != "":
var full := dir_path + "/" + name
if dir.current_is_dir():
if not name.begins_with("."):
_collect_gd(full, out)
elif name.ends_with(".gd"):
out.append(full)
name = dir.get_next()
dir.list_dir_end()
@@ -0,0 +1 @@
uid://50nvccb1clcg