91 lines
2.6 KiB
Rust
91 lines
2.6 KiB
Rust
use std::fs;
|
|
use std::fs::File;
|
|
use std::io::Write;
|
|
use std::path::Path;
|
|
|
|
fn to_safe_identifier(name: &str) -> String {
|
|
let mut safe = String::new();
|
|
for (i, c) in name.chars().enumerate() {
|
|
if c.is_uppercase() {
|
|
if i > 0 {
|
|
safe.push('_');
|
|
}
|
|
safe.push(c.to_ascii_lowercase());
|
|
} else if c == '-' || c == '.' {
|
|
safe.push('_');
|
|
} else {
|
|
safe.push(c);
|
|
}
|
|
}
|
|
safe
|
|
}
|
|
|
|
fn main() {
|
|
println!("cargo:rerun-if-changed=tests/fixtures");
|
|
println!("cargo:rerun-if-changed=Cargo.toml");
|
|
|
|
// File 1: src/tests/fixtures.rs for #[pg_test]
|
|
let pg_dest_path = Path::new("src/tests/fixtures.rs");
|
|
let mut pg_file = File::create(&pg_dest_path).unwrap();
|
|
|
|
// File 2: tests/fixtures.rs for standard #[test] integration
|
|
let std_dest_path = Path::new("tests/fixtures.rs");
|
|
let mut std_file = File::create(&std_dest_path).unwrap();
|
|
|
|
// Write headers
|
|
writeln!(std_file, "use jspg::util;").unwrap();
|
|
|
|
// Walk tests/fixtures directly
|
|
let fixtures_path = "tests/fixtures";
|
|
if Path::new(fixtures_path).exists() {
|
|
for entry in fs::read_dir(fixtures_path).unwrap() {
|
|
let entry = entry.unwrap();
|
|
let path = entry.path();
|
|
if path.extension().unwrap_or_default() == "json" {
|
|
let file_name = path.file_stem().unwrap().to_str().unwrap();
|
|
|
|
// Parse the JSON file to find blocks
|
|
let file = File::open(&path).unwrap();
|
|
let val: serde_json::Value = serde_json::from_reader(file).unwrap();
|
|
|
|
if let Some(arr) = val.as_array() {
|
|
for (i, _item) in arr.iter().enumerate() {
|
|
// Use deterministic names: test_{filename}_{index}
|
|
let safe_filename = to_safe_identifier(file_name);
|
|
let fn_name = format!("test_{}_{}", safe_filename, i);
|
|
|
|
// Write to src/tests.rs (PG Test)
|
|
// CARGO_MANIFEST_DIR is used to find the absolute path to fixtures at runtime
|
|
write!(
|
|
pg_file,
|
|
r#"
|
|
#[pg_test]
|
|
fn {}() {{
|
|
let path = format!("{{}}/tests/fixtures/{}.json", env!("CARGO_MANIFEST_DIR"));
|
|
crate::util::run_test_file_at_index(&path, {}).unwrap();
|
|
}}
|
|
"#,
|
|
fn_name, file_name, i
|
|
)
|
|
.unwrap();
|
|
|
|
// Write to tests/tests.rs (Std Test)
|
|
write!(
|
|
std_file,
|
|
r#"
|
|
#[test]
|
|
fn {}() {{
|
|
let path = format!("{{}}/tests/fixtures/{}.json", env!("CARGO_MANIFEST_DIR"));
|
|
util::run_test_file_at_index(&path, {}).unwrap();
|
|
}}
|
|
"#,
|
|
fn_name, file_name, i
|
|
)
|
|
.unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|