use crate::{context::ResourceId, runner::handler::HandlerResult};
use rtest_util::TestArguments;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug)]
pub struct TestCaseInfo {
pub(crate) test_id: u64,
pub(crate) display_name: String,
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,
}
}
}
#[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() }
}