use proc_macro2::TokenStream;
use quote::quote;
pub(crate) fn token_stream_and_error(s: &TokenStream, e: &syn::Error) -> TokenStream {
let error = e.to_compile_error();
quote! {
#s
#error
}
}
#[cfg(test)]
pub(crate) fn contains_compile_error(tokens: &TokenStream) -> bool {
tokens.to_string().contains(":: core :: compile_error ! {")
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use proc_macro2::Span;
use super::*;
#[test]
fn token_stream_and_error_outputs_both() {
let canary = "nrtfynjcrtupyh6rhdoj85m7yoi";
let s = quote! {
fn gkf5dj8yhuldri58uygdkiluyot() {}
};
let e = syn::Error::new(Span::call_site(), canary);
let merged = token_stream_and_error(&s, &e);
let merged_str = merged.to_string();
assert!(merged_str.contains(canary));
assert!(merged_str.contains("gkf5dj8yhuldri58uygdkiluyot"));
}
#[test]
fn contains_compile_error_yes_raw() {
let tokens = quote! {
let foo = "Some random stuff may also be here";
blah! { blah }
::core::compile_error! { "This is a test error message." };
let bar = "More random stuff here"
};
assert!(contains_compile_error(&tokens));
}
#[test]
fn contains_compile_error_yes_generated() {
let tokens = quote! {
let foo = "Some random stuff may also be here";
blah! { blah }
::core::compile_error!("This is a test error message.");
let bar = "More random stuff here"
};
let tokens =
token_stream_and_error(&tokens, &syn::Error::new(Span::call_site(), "Testing"));
assert!(contains_compile_error(&tokens));
}
#[test]
fn contains_compile_error_no() {
let tokens = quote! {
let foo = "No compile error here!"
};
assert!(!contains_compile_error(&tokens));
}
}