use serde::Deserialize;
use std::path::PathBuf;
#[derive(Deserialize, Debug)]
pub struct TestScenario {
pub name: String,
pub description: Option<String>,
pub setup: Option<Vec<SetupStep>>,
pub target: TargetConfig,
pub steps: Vec<TestStep>,
}
#[derive(Deserialize, Debug)]
pub struct SetupStep {
pub shell: String,
}
#[derive(Deserialize, Debug)]
pub struct TargetConfig {
pub program: PathBuf,
pub args: Option<Vec<String>>,
#[serde(default = "default_mode")]
pub mode: String,
pub pid: Option<u32>,
pub pid_file: Option<PathBuf>,
pub adapter: Option<String>,
#[serde(default)]
pub stop_on_entry: bool,
}
fn default_mode() -> String {
"launch".to_string()
}
#[derive(Deserialize, Debug)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum TestStep {
Command {
command: String,
expect: Option<CommandExpectation>,
},
Await {
timeout: Option<u64>,
expect: Option<StopExpectation>,
},
InspectLocals {
asserts: Vec<VariableAssertion>,
},
InspectStack {
asserts: Vec<FrameAssertion>,
},
CheckOutput {
contains: Option<String>,
equals: Option<String>,
},
Evaluate {
expression: String,
expect: Option<EvaluateExpectation>,
},
}
#[derive(Deserialize, Debug)]
pub struct CommandExpectation {
pub success: Option<bool>,
pub output_contains: Option<String>,
}
#[derive(Deserialize, Debug)]
pub struct StopExpectation {
pub reason: Option<String>,
pub file: Option<String>,
pub line: Option<u32>,
pub exit_code: Option<i64>,
pub thread_id: Option<i64>,
}
#[derive(Deserialize, Debug)]
pub struct VariableAssertion {
pub name: String,
pub value: Option<String>,
pub value_contains: Option<String>,
#[serde(rename = "type")]
pub type_name: Option<String>,
}
#[derive(Deserialize, Debug)]
pub struct FrameAssertion {
pub index: usize,
pub function: Option<String>,
pub file: Option<String>,
pub line: Option<u32>,
}
#[derive(Deserialize, Debug)]
pub struct EvaluateExpectation {
pub success: Option<bool>,
pub result: Option<String>,
pub result_contains: Option<String>,
#[serde(rename = "type")]
pub type_name: Option<String>,
}