use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LintConfig {
pub command: String,
#[serde(default = "default_max_warnings")]
pub max_warnings: usize,
#[serde(default = "default_weight")]
pub weight: f64,
}
fn default_max_warnings() -> usize {
10
}
fn default_weight() -> f64 {
0.1
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum CheckMethod {
Builtin(String),
Detailed(CheckSpec),
}
impl Default for CheckMethod {
fn default() -> Self {
Self::Builtin("exact".to_string())
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub struct CheckSpec {
#[serde(default)]
pub builtin: Option<String>,
#[serde(default)]
pub rhai: Option<String>,
#[serde(default)]
pub python: Option<String>,
#[serde(default)]
pub exec: Option<String>,
#[serde(default)]
pub wasm: Option<String>,
#[serde(default)]
pub tolerance: Option<f64>,
#[serde(default)]
pub function: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Oracle {
#[serde(default)]
pub reference: Option<String>,
#[serde(default)]
pub rhai: Option<String>,
#[serde(default)]
pub check: Option<String>,
#[serde(default)]
pub python: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parametrize {
pub count: usize,
#[serde(default)]
pub seed: Option<u64>,
#[serde(default)]
pub args: std::collections::HashMap<String, String>,
#[serde(default)]
pub oracle: Oracle,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TestCase {
pub name: String,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub args: Vec<serde_json::Value>,
#[serde(default)]
pub expect: Option<serde_json::Value>,
#[serde(default)]
pub expect_error: Option<String>,
#[serde(default)]
pub stdin: Option<String>,
#[serde(default)]
pub expected_stdout: Option<String>,
#[serde(default)]
pub check: Option<CheckMethod>,
#[serde(default)]
pub timeout: Option<u64>,
#[serde(default)]
pub parametrize: Option<Parametrize>,
#[serde(default)]
pub function: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestMeta {
pub name: String,
pub file: String,
pub language: String,
#[serde(default)]
pub function: Option<String>,
#[serde(default)]
pub compile: Option<String>,
#[serde(default)]
pub imports: Vec<String>,
#[serde(default = "default_copy_refs")]
pub copy_refs: bool,
#[serde(default)]
pub allowed_imports: Vec<String>,
}
fn default_copy_refs() -> bool {
true
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SetupStep {
pub id: String,
#[serde(default)]
pub function: Option<String>,
#[serde(default)]
pub args: Vec<serde_json::Value>,
#[serde(default)]
pub file: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TestSpec {
pub meta: TestMeta,
#[serde(default)]
pub vars: std::collections::HashMap<String, serde_json::Value>,
#[serde(default)]
pub setup: Vec<SetupStep>,
pub cases: Vec<TestCase>,
#[serde(default)]
pub lint: Option<LintConfig>,
}