use std::path::{Path, PathBuf};
use gdck_config::FormatConfig;
fn resolve_from_workspace_root(raw: &str) -> PathBuf {
let path = PathBuf::from(raw);
if path.is_absolute() {
return path;
}
Path::new(env!("CARGO_MANIFEST_DIR"))
.join("..")
.join("..")
.join(path)
}
fn collect_gd_files(dir: &Path, out: &mut Vec<PathBuf>) {
let Ok(entries) = std::fs::read_dir(dir) else {
return;
};
for entry in entries.flatten() {
let path = entry.path();
if path.is_dir() {
collect_gd_files(&path, out);
} else if path.extension().is_some_and(|extension| extension == "gd") {
out.push(path);
}
}
}
#[test]
fn corpus_formats_and_survives_the_safety_checks() {
let Ok(root) = std::env::var("GDCK_CORPUS") else {
eprintln!("GDCK_CORPUS not set; skipping formatter conformance test");
return;
};
let root = resolve_from_workspace_root(&root);
let mut paths = Vec::new();
collect_gd_files(&root, &mut paths);
paths.sort();
assert!(
!paths.is_empty(),
"no .gd files found under {}",
root.display()
);
let config = FormatConfig::default();
let mut formatted = 0;
let mut skipped = 0;
let mut failures = Vec::new();
for path in &paths {
let Ok(source) = std::fs::read_to_string(path) else {
continue;
};
if gdck_syntax::parse(&source).has_errors() {
skipped += 1;
continue;
}
match gdck_format::format_source(&source, &config) {
Ok(_) => formatted += 1,
Err(error) => failures.push(format!("{}: {error}", path.display())),
}
}
eprintln!("formatted {formatted} files, skipped {skipped} that do not parse");
assert!(
failures.is_empty(),
"{} of {} files failed a safety check:\n{}",
failures.len(),
formatted + failures.len(),
failures.join("\n")
);
}