use crate::GenerateCode;
use derive_more::From;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
#[derive(From)]
pub struct InkTest<'a> {
test: &'a ir::InkTest,
}
impl GenerateCode for InkTest<'_> {
fn generate_code(&self) -> TokenStream2 {
let item_fn = &self.test.item_fn;
let attrs = &item_fn.attrs;
let sig = &item_fn.sig;
let fn_name = &sig.ident;
let fn_return_type = &sig.output;
let fn_block = &item_fn.block;
let vis = &item_fn.vis;
let fn_args = &sig.inputs;
let expect_msg = format!(
"{}: the off-chain testing environment returned an error",
stringify!(#fn_name)
);
match fn_return_type {
syn::ReturnType::Default => {
quote! {
#( #attrs )*
#[test]
#vis fn #fn_name( #fn_args ) {
::ink::env::test::run_test::<::ink::env::DefaultEnvironment, _>(|_| {
{
{
#fn_block
};
::core::result::Result::Ok(())
}
})
.unwrap_or_else(|error| ::core::panic!("{}: {:?}", #expect_msg, error));
}
}
}
syn::ReturnType::Type(rarrow, ret_type) => {
quote! {
#( #attrs )*
#[test]
#vis fn #fn_name( #fn_args ) #rarrow #ret_type {
::ink::env::test::run_test::<::ink::env::DefaultEnvironment, _>(|_| {
#fn_block
})
}
}
}
}
}
}
impl GenerateCode for ir::InkTest {
fn generate_code(&self) -> TokenStream2 {
InkTest::from(self).generate_code()
}
}