use jerrycan::platform::design::Design;
use jerrycan::platform::{docsidx, questions, scaffold};
fn json_fences(md: &str) -> Vec<String> {
let mut blocks = Vec::new();
let mut in_json = false;
let mut buf = String::new();
for line in md.lines() {
if in_json {
if line.trim_start().starts_with("```") {
blocks.push(std::mem::take(&mut buf));
in_json = false;
} else {
buf.push_str(line);
buf.push('\n');
}
} else if line.trim_start() == "```json" {
in_json = true;
}
}
blocks
}
#[test]
fn every_worked_example_validates_and_scaffolds() {
let page =
docsidx::get("designing-examples", None).expect("designing-examples page is registered");
let fences = json_fences(&page);
assert!(!fences.is_empty(), "page has json fences");
let mut designs = 0usize;
for block in &fences {
let Ok(d) = serde_json::from_str::<Design>(block) else {
continue;
};
designs += 1;
let label = d.name.clone();
let qs = questions::validate(&d);
assert!(
qs.is_empty(),
"worked example `{label}` does not validate: {qs:?}"
);
let tmp = tempfile::tempdir().unwrap();
let root = tmp.path().join(&label);
let created = scaffold::scaffold(&root, &d)
.unwrap_or_else(|e| panic!("worked example `{label}` does not scaffold: {e}"));
assert!(
!created.is_empty(),
"worked example `{label}` scaffolded nothing"
);
}
assert_eq!(
designs, 7,
"expected 7 complete worked-example designs in the designing page, found {designs}"
);
}