fn script_dir() -> std::path::PathBuf {
std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("script")
}
#[test]
fn every_example_script_parses() {
use rhai::Engine;
let engine = Engine::new();
let dir = script_dir();
let mut files: Vec<_> = std::fs::read_dir(&dir)
.expect("script/ directory should exist")
.filter_map(|e| e.ok())
.map(|e| e.path())
.filter(|p| p.extension().and_then(|s| s.to_str()) == Some("rhai"))
.collect();
files.sort();
assert!(!files.is_empty(), "no .rhai files found under {}", dir.display());
let mut failures = Vec::new();
for file in &files {
if let Err(e) = engine.compile_file(file.clone()) {
let msg = format!("{e}");
if is_parse_error(&msg) {
failures.push((file.clone(), msg));
}
}
}
assert!(
failures.is_empty(),
"syntax errors in example scripts:\n{}",
failures
.iter()
.map(|(p, m)| format!(" {}: {m}", p.display()))
.collect::<Vec<_>>()
.join("\n")
);
}
fn is_parse_error(msg: &str) -> bool {
msg.contains("Syntax")
|| msg.contains("Parse")
|| msg.contains("unexpected")
|| msg.contains("expected")
|| msg.contains("reserved")
}
#[test]
fn readme_indexes_every_script() {
let readme = script_dir().join("README.md");
let content = std::fs::read_to_string(&readme).expect("script/README.md must exist");
let files: Vec<String> = std::fs::read_dir(script_dir())
.expect("read script/")
.filter_map(|e| e.ok())
.map(|e| e.path())
.filter(|p| p.extension().and_then(|s| s.to_str()) == Some("rhai"))
.map(|p| p.file_name().unwrap().to_string_lossy().into_owned())
.collect();
let mut missing = Vec::new();
for name in &files {
if !content.contains(name) {
missing.push(name.clone());
}
}
assert!(
missing.is_empty(),
"script/README.md is missing entries for: {}",
missing.join(", ")
);
}