use std::fmt;
use litcheck::diagnostics::DiagResult;
use serde::Deserialize;
use crate::{
test::{DefaultTestRegistry, Test, TestRegistry, TestResult},
Config,
};
pub trait TestFormat: fmt::Debug {
fn name(&self) -> &'static str;
fn registry(&self) -> &dyn TestRegistry;
fn execute(&self, test: &Test, config: &Config) -> DiagResult<TestResult>;
}
#[derive(Default, Clone, Deserialize)]
pub enum SelectedTestFormat {
#[default]
Default,
#[serde(rename = "shtest", alias = "sh")]
ShTest(crate::formats::ShTest),
#[serde(rename = "executable", alias = "exe")]
Executable(crate::formats::ExecutableTest),
}
impl fmt::Debug for SelectedTestFormat {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Default => f.write_str("Default"),
Self::ShTest(ref format) => write!(f, "{format:#?}"),
Self::Executable(ref format) => write!(f, "{format:#?}"),
}
}
}
impl TestFormat for SelectedTestFormat {
fn name(&self) -> &'static str {
match self {
Self::Default => "shtest",
Self::ShTest(ref format) => format.name(),
Self::Executable(ref format) => format.name(),
}
}
fn registry(&self) -> &dyn TestRegistry {
match self {
Self::Default => &DefaultTestRegistry,
Self::ShTest(ref format) => format.registry(),
Self::Executable(ref format) => format.registry(),
}
}
fn execute(&self, test: &Test, config: &Config) -> DiagResult<TestResult> {
match self {
Self::Default => {
let format = crate::formats::ShTest::default();
format.execute(test, config)
}
Self::ShTest(ref format) => format.execute(test, config),
Self::Executable(ref format) => format.execute(test, config),
}
}
}