use crate::Settings;
use ciborium::Value;
#[derive(Debug)]
pub enum DataSourceError {
StopTest,
Assume,
ServerError(String),
}
impl std::fmt::Display for DataSourceError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DataSourceError::StopTest => {
write!(f, "Backend ran out of data for this test case (StopTest)")
}
DataSourceError::Assume => write!(f, "Backend rejected the current draw (Assume)"),
DataSourceError::ServerError(msg) => write!(f, "{}", msg),
}
}
}
impl std::error::Error for DataSourceError {}
pub trait DataSource: Send + Sync {
fn generate(&self, schema: &Value) -> Result<Value, DataSourceError>;
fn start_span(&self, label: u64) -> Result<(), DataSourceError>;
fn stop_span(&self, discard: bool) -> Result<(), DataSourceError>;
fn new_collection(
&self,
min_size: u64,
max_size: Option<u64>,
) -> Result<String, DataSourceError>;
fn collection_more(&self, collection: &str) -> Result<bool, DataSourceError>;
fn collection_reject(&self, collection: &str, why: Option<&str>)
-> Result<(), DataSourceError>;
fn new_pool(&self) -> Result<i128, DataSourceError>;
fn pool_add(&self, pool_id: i128) -> Result<i128, DataSourceError>;
fn pool_generate(&self, pool_id: i128, consume: bool) -> Result<i128, DataSourceError>;
fn mark_complete(&self, status: &str, origin: Option<&str>);
fn test_aborted(&self) -> bool;
}
#[derive(Debug)]
pub enum TestCaseResult {
Valid,
Invalid,
Overrun,
Interesting {
panic_message: String,
},
}
#[derive(Debug)]
pub struct TestRunResult {
pub passed: bool,
pub failure_message: Option<String>,
}
pub trait TestRunner {
fn run(
&self,
settings: &Settings,
database_key: Option<&str>,
run_case: &mut dyn FnMut(Box<dyn DataSource>, bool) -> TestCaseResult,
) -> TestRunResult;
}