use std::io::Write;
use std::path::Path;
use std::sync::OnceLock;
pub use skipper_core::*;
pub use skipper_macros::skipper;
#[macro_export]
macro_rules! skip_if_disabled {
() => {
$crate::skip_if_disabled!(())
};
($ret:expr) => {{
fn __skipper_here() {}
let name = $crate::__fn_name(::core::any::type_name_of_val(&__skipper_here));
if $crate::__should_skip(::core::file!(), ::core::module_path!(), name) {
return $ret;
}
}};
}
#[doc(hidden)]
pub fn __fn_name(type_name: &str) -> &str {
type_name
.split("::")
.filter(|s| *s != "__skipper_here" && !s.starts_with("{{"))
.last()
.unwrap_or(type_name)
}
fn resolver() -> Option<&'static SkipperResolver> {
static RESOLVER: OnceLock<Option<SkipperResolver>> = OnceLock::new();
RESOLVER
.get_or_init(|| match SkipperResolver::from_env() {
Ok(r) => r,
Err(e) => panic!("[skipper] cannot load spreadsheet: {e}"),
})
.as_ref()
}
pub fn test_id(file: &str, module_path: &str, name: &str) -> String {
let modules = module_path.split_once("::").map(|(_, rest)| rest);
match modules {
Some(m) if !m.is_empty() => build_test_id(file, &[m, name]),
_ => build_test_id(file, &[name]),
}
}
#[doc(hidden)]
pub fn __should_skip(file: &str, module_path: &str, name: &str) -> bool {
let Some(resolver) = resolver() else {
return false;
};
let id = test_id(file, module_path, name);
if let Some(dir) = std::env::var_os("SKIPPER_DISCOVERED_DIR") {
if let Err(e) =
CacheManager::write_discovered_ids(Path::new(&dir), std::slice::from_ref(&id))
{
warn(format!("cannot record discovered test {id}: {e}"));
}
}
if resolver.is_test_enabled(&id) {
return false;
}
let _ = writeln!(std::io::stderr(), "{}", resolver.skip_message(&id));
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_id_drops_crate_name() {
assert_eq!(
test_id("tests/auth.rs", "auth", "login"),
"tests/auth.rs > login"
);
assert_eq!(
test_id("src/lib.rs", "my_crate::a::tests", "works"),
"src/lib.rs > a::tests > works"
);
}
#[test]
fn fn_name_from_type_name() {
assert_eq!(__fn_name("k::m::my_test::__skipper_here"), "my_test");
assert_eq!(
__fn_name("k::my_test::{{closure}}::__skipper_here"),
"my_test"
);
}
}