use async_trait::async_trait;
use std::{future::Future, sync::Arc};
#[async_trait]
pub trait Test
where
Self: Sized + Send + Sync,
{
type Error: std::fmt::Display + Send + Sync;
async fn before() -> Result<Self, Self::Error>;
async fn after(&self) -> Result<(), Self::Error> {
Ok(())
}
async fn test<F, T>(task: T)
where
F: Future<Output = Result<(), Self::Error>> + Send,
T: Send + Sync + FnOnce(Arc<Self>) -> F,
{
let before = Self::before().await;
let state = match before {
Err(error) => return assert!(false, format!("{}", error)),
Ok(state) => Arc::new(state),
};
let test_run = task(Arc::clone(&state)).await;
let after = state.after().await;
if let Err(error) = test_run {
assert!(false, format!("{}", error));
}
if let Err(error) = after {
assert!(false, format!("{}", error));
}
}
}