# 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: # 字形集表:[个案标签, 须在集字符]——缺字明细进消息 var glyph_groups := [ ["中文字形在集(攻/雷/旗/封)", "攻雷旗封"], ["中文字形在集(危——已开危险格字形换代前置,迭代36 u12/wa9)", "危"], ["ASCII/数字字形在集(A/0/%)", "A0%"], ] for g in glyph_groups: var missing := "" for i in String(g[1]).length(): var ch := String(g[1])[i] if not f.has_char(ch.unicode_at(0)): missing += ch Kit.check("%s(缺=%s)" % [g[0], missing if missing != "" else "无"], missing == "") 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"))