tearup 0.3.0

Setup - teardown your tests
Documentation
use lazy_static::lazy_static;
use std::{
    thread::sleep,
    time::{Duration, SystemTime},
};
use tearup::{tearup, Context, SharedContext};

use crate::helper::{assert_order, Checkpoint};

lazy_static! {
    static ref SETUP_CHECKPOINT: Checkpoint = None.into();
    static ref TEARDOWN_CHECKPOINT: Checkpoint = None.into();
}

#[test]
fn it_pass_through_setup_then_teardown() {
    teardown_panic();

    assert_order(&SETUP_CHECKPOINT, &TEARDOWN_CHECKPOINT);
}

struct NiceContext;
impl Context for NiceContext {
    fn setup(_shared_context: &mut SharedContext) -> Self {
        let mut checkpoint = SETUP_CHECKPOINT.lock().unwrap();
        *checkpoint = Some(SystemTime::now());

        sleep(Duration::from_millis(10));

        Self {}
    }

    fn teardown(self, _shared_context: &mut SharedContext) {
        let mut checkpoint = TEARDOWN_CHECKPOINT.lock().unwrap();
        *checkpoint = Some(SystemTime::now());
    }
}

#[tearup(NiceContext)]
fn teardown_panic() {}

#[cfg(feature = "async")]
mod asyncc {
    use async_trait::async_trait;
    use lazy_static::lazy_static;
    use std::time::{Duration, SystemTime};
    use tearup::{tearup, AsyncContext, AsyncSharedContext};
    use tokio::time::sleep;

    use crate::helper::{assert_async_order, AsyncCheckpoint};

    lazy_static! {
        static ref SETUP_CHECKPOINT: AsyncCheckpoint = None.into();
        static ref TEARDOWN_CHECKPOINT: AsyncCheckpoint = None.into();
    }

    #[tokio::test]
    async fn it_pass_through_setup_then_teardown() {
        teardown_panic().await;

        assert_async_order(&SETUP_CHECKPOINT, &TEARDOWN_CHECKPOINT).await;
    }

    struct NiceContext;
    #[async_trait]
    impl AsyncContext<'_> for NiceContext {
        async fn setup(_shared_context: AsyncSharedContext) -> Self {
            let mut checkpoint = SETUP_CHECKPOINT.lock().await;
            *checkpoint = Some(SystemTime::now());

            sleep(Duration::from_millis(10)).await;

            Self {}
        }

        async fn teardown(mut self, _shared_context: AsyncSharedContext) {
            let mut checkpoint = TEARDOWN_CHECKPOINT.lock().await;
            *checkpoint = Some(SystemTime::now());
        }
    }

    #[tearup(NiceContext)]
    async fn teardown_panic() {}
}