Skip to main content

wasmsh_testkit/
toml_case.rs

1//! TOML test case schema for declarative shell tests.
2//!
3//! Supports the full requirements from wasmsh-testsuite-requirements.md:
4//! - Test classification (normative-posix, compat-bash, etc.)
5//! - VFS state verification (expect.files)
6//! - Shell state verification (expect.env)
7//! - Performance budgets (`expect.max_time_ms`)
8//! - Oracle comparison
9//! - Known divergence documentation
10
11use serde::Deserialize;
12use std::collections::HashMap;
13
14/// A complete TOML test case file.
15#[derive(Debug, Clone, Deserialize)]
16pub struct TomlTestFile {
17    pub test: TestMeta,
18    #[serde(default)]
19    pub setup: TestSetup,
20    pub input: TestInput,
21    #[serde(default)]
22    pub expect: TestExpect,
23    #[serde(default)]
24    pub oracle: Option<OracleConfig>,
25    #[serde(default)]
26    pub known_divergence: Option<KnownDivergence>,
27}
28
29/// Test metadata: name, tags, tier, classification, required features.
30#[derive(Debug, Clone, Deserialize)]
31pub struct TestMeta {
32    pub name: String,
33    #[serde(default)]
34    pub tags: Vec<String>,
35    #[serde(default = "default_tier")]
36    pub tier: String,
37    #[serde(default)]
38    pub requires: Vec<String>,
39    /// Test classification per requirements §2.3
40    #[serde(default = "default_class")]
41    pub class: String,
42    /// CI pipeline stage: smoke, core, conformance, stress, differential
43    #[serde(default = "default_stage")]
44    pub stage: String,
45}
46
47fn default_tier() -> String {
48    "P0".into()
49}
50
51fn default_class() -> String {
52    "normative-posix".into()
53}
54
55fn default_stage() -> String {
56    "core".into()
57}
58
59/// VFS and environment setup before script execution.
60#[derive(Debug, Clone, Default, Deserialize)]
61pub struct TestSetup {
62    #[serde(default)]
63    pub files: HashMap<String, String>,
64    #[serde(default)]
65    pub env: HashMap<String, String>,
66}
67
68/// Script input to execute.
69#[derive(Debug, Clone, Deserialize)]
70pub struct TestInput {
71    #[serde(default)]
72    pub script: Option<String>,
73    #[serde(default)]
74    pub script_file: Option<String>,
75}
76
77/// Expected results — supports status, stdout, stderr, VFS state, env state.
78#[derive(Debug, Clone, Default, Deserialize)]
79pub struct TestExpect {
80    pub status: Option<i32>,
81    pub stdout: Option<String>,
82    pub stdout_contains: Option<Vec<String>>,
83    pub stdout_regex: Option<String>,
84    pub stderr: Option<String>,
85    pub stderr_contains: Option<Vec<String>>,
86    /// Expected VFS file contents after execution.
87    #[serde(default)]
88    pub files: HashMap<String, String>,
89    /// Expected environment variable values after execution.
90    #[serde(default)]
91    pub env: HashMap<String, String>,
92    /// Maximum allowed execution time in milliseconds (0 = no limit).
93    #[serde(default)]
94    pub max_time_ms: u64,
95}
96
97/// Oracle comparison configuration.
98#[derive(Debug, Clone, Deserialize)]
99pub struct OracleConfig {
100    #[serde(default)]
101    pub compare: bool,
102    #[serde(default)]
103    pub shells: Vec<String>,
104    #[serde(default)]
105    pub ignore_stderr: bool,
106}
107
108/// Documented known divergence from reference shells.
109#[derive(Debug, Clone, Deserialize)]
110pub struct KnownDivergence {
111    pub id: String,
112    pub description: String,
113    #[serde(default)]
114    pub wasmsh_behavior: String,
115    #[serde(default)]
116    pub reference_behavior: String,
117}