use crate::EjectError;
use crate::scanner;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Classification {
Inline,
External,
NoTests,
}
#[must_use]
pub fn classify_source(source: &str) -> Classification {
match scanner::find_test_module_region(source) {
Ok(_) => Classification::Inline,
Err(EjectError::AlreadyExternal) => Classification::External,
Err(_) => Classification::NoTests,
}
}
#[cfg(test)]
mod tests {
use super::*;
fn inline_source() -> &'static str {
concat!(
"pub fn foo() -> i32 { 42 }\n",
"\n",
"#[cfg(test)]\n",
"mod tests {\n",
" use super::*;\n",
" #[test]\n",
" fn test_foo() { assert_eq!(foo(), 42); }\n",
"}\n",
)
}
#[test]
fn classifies_inline() {
assert_eq!(classify_source(inline_source()), Classification::Inline);
}
#[test]
fn classifies_external() {
let src = "#[cfg(test)]\n#[path = \"foo_tests.rs\"]\nmod tests;\n";
assert_eq!(classify_source(src), Classification::External);
}
#[test]
fn classifies_no_tests() {
assert_eq!(
classify_source("pub fn foo() -> i32 { 42 }\n"),
Classification::NoTests
);
}
}