rtest 0.2.2

integration test building framework
Documentation
use crate::{context::ResourceId, runner::handler::HandlerResult};
use rtest_util::TestArguments;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

/// Persistable Info of testcases
#[derive(Serialize, Deserialize, Debug)]
pub struct TestCaseInfo {
    /// Unique per actual function
    pub(crate) test_id: u64,
    /// DisplayName of the TestCase
    pub(crate) display_name: String,
    /// Arguments given to this test by developer, e.g. `#[rtest(maintainer =
    /// "john@example.com")]`
    pub(crate) test_arguments: TestArguments,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub(crate) reference_resources: Vec<ResourceId>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub(crate) input_resources: Vec<ResourceId>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub(crate) output_resources: Vec<ResourceId>,
}

pub struct TestCase {
    pub(crate) info:      TestCaseInfo,
    pub(crate) test_func: Box<dyn Fn() -> HandlerResult>,
}

impl TestCase {
    pub fn display_name(&self) -> &str { &self.info.display_name }

    pub fn test_id(&self) -> u64 { self.info.test_id }
}

#[derive(Clone, Debug)]
pub(crate) struct RunnerParams {
    #[cfg(feature = "capture_tracing")]
    pub(crate) log_level: tracing::Level,
}

impl Default for RunnerParams {
    fn default() -> Self {
        Self {
            #[cfg(feature = "capture_tracing")]
            log_level:                                     tracing::Level::INFO,
        }
    }
}

/// The TestRepo contains all tests to be checked and necessary info
#[derive(Default)]
pub struct TestRepo {
    cases:         HashMap<u64, TestCase>,
    runner_params: RunnerParams,
}

pub struct TestRepoInfo {
    pub(crate) cases: Vec<TestCaseInfo>,
}

impl TestRepo {
    #[allow(private_interfaces)]
    pub fn set_runner_params(&mut self, params: RunnerParams) { self.runner_params = params; }

    #[allow(clippy::too_many_arguments)]
    pub fn add(
        &mut self,
        test_id: usize,
        display_name: &str,
        test_func: Box<dyn Fn() -> HandlerResult>,
        test_arguments: TestArguments,
        reference_resources: Vec<ResourceId>,
        input_resources: Vec<ResourceId>,
        output_resources: Vec<ResourceId>,
    ) {
        let info = TestCaseInfo {
            test_id: test_id as u64,
            display_name: display_name.to_string(),
            test_arguments,
            reference_resources,
            input_resources,
            output_resources,
        };
        let t = TestCase { info, test_func };
        self.cases.insert(t.test_id(), t);
    }

    pub fn repo_info(self) -> TestRepoInfo {
        let mut cases: Vec<_> = self.cases.into_values().map(|case| (case.info)).collect();
        cases.sort_by_key(|c| c.test_id);
        TestRepoInfo { cases }
    }

    pub fn cases(&self) -> &HashMap<u64, TestCase> { &self.cases }

    pub fn cases_mut(&mut self) -> &mut HashMap<u64, TestCase> { &mut self.cases }

    pub(crate) fn runner_params(&self) -> RunnerParams { self.runner_params.clone() }
}