use proc_macro2::TokenStream;
use syn::ItemFn;
pub(crate) fn has_hegel_test_attr(func: &ItemFn) -> bool {
func.attrs.iter().any(|attr| {
let segments: Vec<_> = attr.path().segments.iter().collect();
segments.len() == 2 && segments[0].ident == "hegel" && segments[1].ident == "test"
})
}
pub fn expand_explicit_test_case(_attr: TokenStream, item: TokenStream) -> TokenStream {
let func: ItemFn = match syn::parse2(item) {
Ok(f) => f,
Err(e) => return e.to_compile_error(),
};
if has_hegel_test_attr(&func) {
syn::Error::new_spanned(
&func.sig,
"#[hegel::explicit_test_case] must appear below #[hegel::test], not above it.\n\
Write:\n \
#[hegel::test]\n \
#[hegel::explicit_test_case(...)]\n \
fn my_test(tc: ::hegel::TestCase) { ... }",
)
.to_compile_error()
} else {
syn::Error::new_spanned(
&func.sig,
"#[hegel::explicit_test_case] can only be used together with #[hegel::test].\n\
Add #[hegel::test] above #[hegel::explicit_test_case].",
)
.to_compile_error()
}
}