use include_dir::{Dir, include_dir};
use crate::EvalCase;
use crate::case::parse_cases_from_str;
use crate::expect::Expectation;
static BASELINE_DIR: Dir<'static> = include_dir!("$CARGO_MANIFEST_DIR/baseline");
pub fn baseline() -> Vec<EvalCase<(), Expectation>> {
let mut cases = Vec::new();
for (name, contents) in baseline_files() {
let parsed = parse_cases_from_str::<(), Expectation>(name, contents)
.unwrap_or_else(|e| panic!("embedded baseline file `{name}` is malformed: {e}"));
cases.extend(parsed);
}
cases
}
pub fn baseline_files() -> &'static [(&'static str, &'static str)] {
use std::sync::OnceLock;
static FILES: OnceLock<Vec<(&'static str, &'static str)>> = OnceLock::new();
FILES.get_or_init(|| {
let mut files: Vec<(&'static str, &'static str)> = BASELINE_DIR
.files()
.filter(|f| {
f.path()
.extension()
.is_some_and(|e| e.eq_ignore_ascii_case("ron"))
})
.filter_map(|f| {
let name = f.path().file_name()?.to_str()?;
let contents = f.contents_utf8()?;
Some((name, contents))
})
.collect();
files.sort_by_key(|(name, _)| *name);
files
})
}
#[cfg(test)]
mod tests {
use super::*;
use std::collections::HashSet;
#[test]
fn baseline_parses_and_is_well_formed() {
let cases = baseline();
assert_eq!(
cases.len(),
18,
"expected 18 baseline cases, got {}",
cases.len()
);
let mut names = HashSet::new();
for case in &cases {
assert!(
!case.name.trim().is_empty(),
"a baseline case has an empty name"
);
assert!(
!case.instruction.trim().is_empty(),
"baseline case `{}` has an empty instruction",
case.name
);
assert!(
!case.expect.is_empty(),
"baseline case `{}` has no expectations",
case.name
);
assert!(
names.insert(case.name.clone()),
"duplicate baseline case name `{}`",
case.name
);
}
}
#[test]
fn baseline_files_are_the_three_capability_files() {
let names: Vec<&str> = baseline_files().iter().map(|(n, _)| *n).collect();
assert_eq!(
names,
vec!["arithmetic.ron", "language.ron", "tool_use.ron"]
);
}
}