use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Clone, Deserialize)]
pub struct TomlTestFile {
pub test: TestMeta,
#[serde(default)]
pub setup: TestSetup,
pub input: TestInput,
#[serde(default)]
pub expect: TestExpect,
#[serde(default)]
pub oracle: Option<OracleConfig>,
#[serde(default)]
pub known_divergence: Option<KnownDivergence>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TestMeta {
pub name: String,
#[serde(default)]
pub tags: Vec<String>,
#[serde(default = "default_tier")]
pub tier: String,
#[serde(default)]
pub requires: Vec<String>,
#[serde(default = "default_class")]
pub class: String,
#[serde(default = "default_stage")]
pub stage: String,
}
fn default_tier() -> String {
"P0".into()
}
fn default_class() -> String {
"normative-posix".into()
}
fn default_stage() -> String {
"core".into()
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct TestSetup {
#[serde(default)]
pub files: HashMap<String, String>,
#[serde(default)]
pub env: HashMap<String, String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct TestInput {
#[serde(default)]
pub script: Option<String>,
#[serde(default)]
pub script_file: Option<String>,
}
#[derive(Debug, Clone, Default, Deserialize)]
pub struct TestExpect {
pub status: Option<i32>,
pub stdout: Option<String>,
pub stdout_contains: Option<Vec<String>>,
pub stdout_regex: Option<String>,
pub stderr: Option<String>,
pub stderr_contains: Option<Vec<String>>,
#[serde(default)]
pub files: HashMap<String, String>,
#[serde(default)]
pub env: HashMap<String, String>,
#[serde(default)]
pub max_time_ms: u64,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OracleConfig {
#[serde(default)]
pub compare: bool,
#[serde(default)]
pub shells: Vec<String>,
#[serde(default)]
pub ignore_stderr: bool,
}
#[derive(Debug, Clone, Deserialize)]
pub struct KnownDivergence {
pub id: String,
pub description: String,
#[serde(default)]
pub wasmsh_behavior: String,
#[serde(default)]
pub reference_behavior: String,
}