// 一致性自检:不依赖 `moon test` 的嵌套进程,直接在目标平台运行。
//
// 每个用例走完整链路:解析 → 子集化 → 回读 → 度量/覆盖/闭包/校验和比对。
// 用法:
// moon run cmd/verify # 跑仓库自带样本
// moon run cmd/verify -- <字体> [字体...] # 对语料逐字体巡检
///|
fn chars_of(text : String) -> Array[Int] {
let chars : Array[Int] = []
for ch in text {
chars.push(ch.to_int())
}
chars
}
///|
fn load_font(path : String) -> Result[@lib.Font, String] {
match (Some(@fs.read_file_to_bytes(path)) catch { _ => None }) {
None => Err("无法读取字体:\{path}")
Some(data) =>
Ok(@lib.parse_font(data)) catch {
error => Err("解析失败:\{@lib.font_error_message(error)}")
}
}
}
///|
fn run_case(font : @lib.Font, name : String, text : String) -> Bool {
let chars = chars_of(text)
match (Some(@lib.subset_by_text(font, text)) catch { _ => None }) {
None => {
println("FAIL \{name}:子集化失败")
false
}
Some(subset) => {
let report = @lib.verify_subset(font, subset, chars)
if report.ok {
println(
"PASS \{name}:\{report.chars_checked} 字符 / \{report.glyphs} 字形 / " +
"\{report.original_size} → \{report.subset_size} 字节(省 \{report.savings_percent}%)",
)
true
} else {
println("FAIL \{name}:\{report.failures.length()} 项不一致")
for failure in report.failures {
println(" - \{failure}")
}
false
}
}
}
}
///|
fn run_font(path : String) -> Int {
match load_font(path) {
Err(message) => {
println(message)
1
}
Ok(font) => {
println(
"\n字体:\{path}(\{font.glyph_count()} 字形,\{font.units()} units/em," +
"\{font.bytes.length()} 字节)",
)
let mut failures = 0
for case in @lib.default_cases() {
if !run_case(font, case.name, case.text) {
failures = failures + 1
}
}
// 有 CJK 字形时才跑中文用例,避免对缺字字体做无意义断言
let cjk = @lib.cjk_case()
if font.has_glyph('你') {
if !run_case(font, cjk.name, cjk.text) {
failures = failures + 1
}
}
failures
}
}
}
///|
fn main {
let args = @env.args()
let paths : Array[String] = []
let mut i = 1
while i < args.length() {
paths.push(args[i])
i = i + 1
}
if paths.length() == 0 {
paths.push("tests/fixtures/VT323-Regular.ttf")
}
let mut failures = 0
for path in paths {
failures = failures + run_font(path)
}
if failures == 0 {
println("\n全部用例通过。")
@sys.exit(0)
} else {
println("\n\{failures} 个用例失败。")
@sys.exit(1)
}
}