iter51-卡3
This commit is contained in:
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
|
||||
Reference in new issue
Block a user