use std::collections::BTreeSet;
fn authoritative() -> BTreeSet<String> {
include_str!("../symbols.txt")
.lines()
.map(str::trim)
.filter(|l| !l.is_empty() && !l.starts_with('#'))
.map(String::from)
.collect()
}
fn declared() -> BTreeSet<String> {
let src = include_str!("../src/lib.rs");
let mut out = BTreeSet::new();
for (_, after) in src
.match_indices("fn nwep_")
.map(|(i, _)| (i, &src[i + 3..]))
{
let name = "nwep_".to_string()
+ after["nwep_".len()..]
.chars()
.take_while(|c| c.is_ascii_alphanumeric() || *c == '_')
.collect::<String>()
.as_str();
out.insert(name);
}
out
}
#[test]
fn no_phantom_externs() {
let auth = authoritative();
let decl = declared();
let phantoms: Vec<_> = decl.difference(&auth).collect();
assert!(
phantoms.is_empty(),
"sys declares {phantoms:?} which are not exported by the library \
(typo, or removed from the header). fix the declaration or symbols.txt."
);
eprintln!(
"nwep-sys coverage: {} / {} symbols declared",
decl.len(),
auth.len()
);
}
#[test]
fn all_symbols_declared() {
let missing: Vec<_> = authoritative().difference(&declared()).cloned().collect();
assert!(
missing.is_empty(),
"sys is missing {} symbols: {missing:?}",
missing.len()
);
}