kitest 0.5.0

A composable test harness toolkit with room to fly.
Documentation
use std::borrow::Cow;

use crate::{
    TestHarness,
    capture::DefaultPanicHookProvider,
    filter::NoFilter,
    formatter::no::NoFormatter,
    ignore::{IgnoreStatus, NoIgnore},
    panic::{NoPanicHandler, PanicExpectation},
    runner::{SimpleRunner, scope::NoScopeFactory},
    test::{Test, TestFn, TestFnHandle, TestMeta, TestOrigin},
};

pub struct BuildTest<Extra> {
    pub func: TestFnHandle,
    pub name: Cow<'static, str>,
    pub ignore: IgnoreStatus,
    pub should_panic: PanicExpectation,
    pub origin: Option<TestOrigin>,
    pub extra: Extra,
}

impl Default for BuildTest<()> {
    fn default() -> Self {
        Self {
            func: TestFnHandle::Static(&|| ()),
            name: Default::default(),
            ignore: Default::default(),
            should_panic: Default::default(),
            origin: Default::default(),
            extra: Default::default(),
        }
    }
}

impl<Extra> From<BuildTest<Extra>> for Test<Extra> {
    fn from(value: BuildTest<Extra>) -> Self {
        Test::new(
            value.func,
            TestMeta {
                name: value.name,
                ignore: value.ignore,
                should_panic: value.should_panic,
                origin: value.origin,
                extra: value.extra,
            },
        )
    }
}

impl<F> From<F> for TestFnHandle
where
    F: TestFn + Send + Sync + 'static,
{
    fn from(value: F) -> Self {
        TestFnHandle::Owned(Box::new(value))
    }
}

macro_rules! test {
    {$($field:ident: $value:expr),* $(,)?} => {
        $crate::test::Test::from($crate::test_support::BuildTest {
            $($field: From::from($value),)*
            ..($crate::test_support::BuildTest {
                name: concat!(module_path!(), "::", file!(), ":", line!(), ":", column!()).into(),
                origin: $crate::origin!(),
                ..Default::default()
            })
        })
    };
}

pub(crate) use test;

pub fn harness(
    tests: &[Test],
) -> TestHarness<
    '_,
    (),
    NoFilter,
    NoIgnore,
    NoPanicHandler,
    SimpleRunner<DefaultPanicHookProvider, NoScopeFactory>,
    NoFormatter,
> {
    TestHarness {
        tests,
        filter: NoFilter,
        ignore: NoIgnore,
        panic_handler: NoPanicHandler,
        runner: SimpleRunner::default(),
        formatter: NoFormatter,
    }
}

macro_rules! nonzero {
    (0) => {
        compile_error!("0 is zero")
    };

    ($value:literal) => {
        std::convert::TryFrom::try_from($value).unwrap()
    };
}

pub(crate) use nonzero;