use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "wickra-benchmark", version, about)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
RunCase {
#[arg(long)]
case: PathBuf,
#[arg(long)]
data_root: PathBuf,
#[arg(long, value_enum, default_value_t = Format::Text)]
format: Format,
},
RunSuite {
#[arg(long)]
suite: PathBuf,
#[arg(long)]
data_root: PathBuf,
#[arg(long, value_enum, default_value_t = Format::Text)]
format: Format,
},
ListCases {
#[arg(long)]
suite: PathBuf,
},
}
#[derive(Clone, Copy, Debug, ValueEnum, PartialEq, Eq)]
pub enum Format {
Text,
Json,
}
#[cfg(test)]
mod tests {
use super::*;
use clap::CommandFactory;
#[test]
fn arg_config_is_valid() {
Cli::command().debug_assert();
}
#[test]
fn a_subcommand_is_required() {
assert!(Cli::try_parse_from(["wickra-benchmark"]).is_err());
}
#[test]
fn run_suite_defaults_to_text() {
let cli = Cli::try_parse_from([
"wickra-benchmark",
"run-suite",
"--suite",
"s.json",
"--data-root",
"d",
])
.unwrap();
match cli.command {
Command::RunSuite { format, .. } => assert_eq!(format, Format::Text),
_ => panic!("expected run-suite"),
}
}
#[test]
fn run_case_json_parses() {
let cli = Cli::try_parse_from([
"wickra-benchmark",
"run-case",
"--case",
"c.json",
"--data-root",
"d",
"--format",
"json",
])
.unwrap();
match cli.command {
Command::RunCase { format, .. } => assert_eq!(format, Format::Json),
_ => panic!("expected run-case"),
}
}
}