use std::path::Path;
const SOURCE_OF_TRUTH: &str = "._schema";
const MIRROR: &str = "schema";
fn read(path: &Path) -> String {
std::fs::read_to_string(path)
.unwrap_or_else(|e| panic!("读取失败:{}({e})", path.display()))
}
#[test]
fn mirror_dir_matches_repo_source_of_truth() {
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let Some(repo_root) = manifest_dir.parent() else {
eprintln!("跳过:找不到 crate 的上级目录");
return;
};
let canonical = repo_root.join(SOURCE_OF_TRUTH);
if !canonical.is_dir() {
eprintln!(
"跳过:{} 不存在(独立构建 / 已发布的 crate,无真源可比对)",
canonical.display()
);
return;
}
let mut checked = 0;
for entry in std::fs::read_dir(manifest_dir.join(MIRROR)).expect("crate 内 schema/ 目录缺失") {
let path = entry.expect("读取 schema/ 目录项失败").path();
let Some(name) = path.file_name().and_then(|n| n.to_str()) else {
continue;
};
let truth = canonical.join(name);
assert!(
truth.is_file(),
"{MIRROR}/{name} 在真源 {SOURCE_OF_TRUTH}/ 中不存在;\
请勿手工向 crate 内 schema/ 添加文件(它由 scripts/sync-schema.sh 生成)"
);
assert_eq!(
read(&path),
read(&truth),
"{MIRROR}/{name} 与仓库根 {SOURCE_OF_TRUTH}/{name} 不一致;\
请运行 `bash scripts/sync-schema.sh` 重新生成派生副本"
);
checked += 1;
}
assert_eq!(checked, 3, "crate 内 schema/ 应恰为 3 份(root / node / branch)");
}
#[test]
fn embedded_schemas_match_repo_source_of_truth() {
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let Some(repo_root) = manifest_dir.parent() else {
eprintln!("跳过:找不到 crate 的上级目录");
return;
};
let canonical = repo_root.join(SOURCE_OF_TRUTH);
if !canonical.is_dir() {
eprintln!(
"跳过:{} 不存在(独立构建 / 已发布的 crate,无真源可比对)",
canonical.display()
);
return;
}
assert_eq!(str_format::EMBEDDED_SCHEMAS.len(), 3, "内嵌 Schema 应恰为 3 份");
for (name, embedded) in str_format::EMBEDDED_SCHEMAS {
let truth = read(&canonical.join(name));
assert_eq!(
*embedded,
truth.as_str(),
"内嵌 Schema {name} 与仓库根 {SOURCE_OF_TRUTH}/{name} 不一致;\
请运行 `bash scripts/sync-schema.sh` 后重新构建"
);
}
}