- CLAUDE.md 硬性红线新增「文件头零工作日志」;code-conventions.md 新增 §1.4.1(含反面案例) - 全仓 .gd 文件头注清偿:删除全部带日期条目、批次叙事段与迁移退役叙述,保留并改写为 现在时的职责、接口契约、GDD 锚内容(main.gd 头注 42→31 行、save_manager.gd 49→45 行) - 纯注释改动零行为变更,按用户令免测试免冒烟
29 lines
1.9 KiB
GDScript
29 lines
1.9 KiB
GDScript
# tests/unit/presentation/ui_font_asset_test.gd — CJK 随包字体资产契约测试
|
||
# 运行:godot --headless --path game --script res://tests/unit/presentation/ui_font_asset_test.gd
|
||
# 契约源:Fusion Pixel OFL(CJK 覆盖+授权干净)+ battle.md C6 headless 判据
|
||
#(注入字体非空 + 中文字形 has_char + 采样文本宽度 > 0——实际光栅观感归真人目检)。
|
||
# 路径常量从 UiKit 单点读取(字体路径改动 = 断言随动,禁测试侧复制字面量路径)。
|
||
# 前置:fresh checkout 需先 --editor --quit 刷导入缓存(.ttf 经导入管线成 FontFile——全素材同纪律)。
|
||
extends SceneTree
|
||
|
||
const UiKitScript := preload("res://presentation/views/ui_kit.gd")
|
||
const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:_check/汇总退出样板单点
|
||
|
||
|
||
func _init() -> void:
|
||
var path: String = UiKitScript.FONT_UI
|
||
var f: Font = UiKitScript.load_font(path)
|
||
Kit.check("随包字体守卫装载非空(res://assets/fonts/ui_font_fusion_pixel_zh_hans.ttf)", f != null)
|
||
if f != null:
|
||
Kit.check("中文字形在集(攻/雷/旗/封)", f.has_char("攻".unicode_at(0)) and f.has_char("雷".unicode_at(0)) \
|
||
and f.has_char("旗".unicode_at(0)) and f.has_char("封".unicode_at(0)))
|
||
Kit.check("ASCII/数字字形在集(A/0/%)", f.has_char("A".unicode_at(0)) and f.has_char("0".unicode_at(0)) and f.has_char("%".unicode_at(0)))
|
||
var sz := 18
|
||
var w_cn: float = f.get_string_size("战斗胜利", HORIZONTAL_ALIGNMENT_LEFT, -1, sz).x
|
||
var w_label: float = f.get_string_size("攻击 2", HORIZONTAL_ALIGNMENT_LEFT, -1, sz).x
|
||
Kit.check("中文采样文本宽度 > 0(C6 headless 判据)", w_cn > 0.0 and w_label > 0.0)
|
||
# 注:不设「私用区 has_char=false」负探针——fusion pixel 实测覆盖 PUA 码位,负向覆盖非契约面(宁缺勿错)
|
||
else:
|
||
Kit.check("字体缺失时后续断言跳过(缺位=回归,此行仅占位计数)", false)
|
||
quit(Kit.finish("ui_font_asset_test"))
|