use super::{ALL_EXTRACTORS, Extractor, UNREGISTERED};
use crate::fields::Sphere;
use crate::{MeshBuffer, RuntimeShape3};
#[test]
fn every_extractor_impl_is_registered_or_excused() {
let source = include_str!("../extractor.rs");
let (_, after) = source
.split_once("forward_extractor!(")
.expect("the impl list moved");
let (list, _) = after
.split_once(");")
.expect("the impl list is unterminated");
let impls: alloc::vec::Vec<&str> = list
.lines()
.map(str::trim)
.filter(|line| line.starts_with("crate::"))
.map(|line| {
let path = line.trim_end_matches(',');
let leaf = path.rsplit("::").next().unwrap_or(path);
leaf.split('<').next().unwrap_or(leaf)
})
.collect();
assert!(
impls.len() >= 7,
"only {} impls parsed, so the parse broke rather than the code: {impls:?}",
impls.len()
);
let (_, after_macro) = source
.split_once("macro_rules! for_each_extractor")
.expect("the registry moved");
let (macro_body, _) = after_macro
.split_once("pub const ALL_EXTRACTORS")
.expect("the registry's end marker moved");
for name in &impls {
let registered = macro_body.contains(name);
let excused = UNREGISTERED.contains(name);
assert!(
registered ^ excused,
"{name} is {} — an Extractor impl must be either in for_each_extractor! \
or in UNREGISTERED with a reason, and never both",
if registered {
"both registered and excused"
} else {
"neither registered nor excused"
}
);
}
std::println!(
"measured: {} Extractor impls, {} registered, {} excused",
impls.len(),
impls.len() - UNREGISTERED.len(),
UNREGISTERED.len()
);
}
#[test]
fn the_registry_and_the_macro_agree() {
let mut visited = alloc::vec::Vec::new();
crate::for_each_extractor!(f64, |name, extractor| {
let _ = &mut extractor;
visited.push(name);
});
assert_eq!(
visited.as_slice(),
ALL_EXTRACTORS.as_slice(),
"the macro and ALL_EXTRACTORS disagree"
);
}
#[test]
fn every_registered_extractor_meshes_a_sphere() {
let field = Sphere::<f64>::canonical();
let shape = RuntimeShape3::new([17; 3]).expect("valid shape");
let mut out = MeshBuffer::<f64>::new();
let mut rows = alloc::vec::Vec::new();
crate::for_each_extractor!(f64, |name, extractor| {
out.reset();
extractor
.extract_into(&field, &shape, [-2.0; 3], 0.25, &mut out)
.expect("extraction");
assert!(
out.triangle_count() > 0,
"{name} meshed a sphere to nothing"
);
rows.push((name, out.triangle_count()));
});
assert_eq!(rows.len(), ALL_EXTRACTORS.len());
std::println!("measured: sphere at 17^3 -> {rows:?}");
}