use clap::Parser;
use clap_fmt::FmtArgs;
use serde::Serialize;
#[derive(Parser, Debug, Serialize)]
#[command(name = "myapp")]
struct SimpleArgs {
#[arg(short, long)]
verbose: bool,
#[arg(short, long)]
quiet: bool,
#[arg(short, long)]
output: Option<String>,
#[arg(short, long, default_value = "input.txt")]
input: String,
#[arg(short = 'd', long = "debug", action = clap::ArgAction::Count)]
debug: u8,
files: Vec<String>,
}
#[test]
fn test_bool_flags() {
let args = SimpleArgs {
verbose: true,
quiet: false,
output: None,
input: "input.txt".to_string(),
debug: 0,
files: vec![],
};
let result = args.to_args();
assert_eq!(result, vec!["--verbose"]);
}
#[test]
fn test_option_values() {
let args = SimpleArgs {
verbose: false,
quiet: true,
output: Some("output.log".to_string()),
input: "custom.txt".to_string(),
debug: 0,
files: vec![],
};
let result = args.to_args();
assert_eq!(result, vec!["--quiet", "--output", "output.log", "--input", "custom.txt"]);
}
#[test]
fn test_count_flags() {
let args = SimpleArgs {
verbose: false,
quiet: false,
output: None,
input: "input.txt".to_string(),
debug: 3,
files: vec![],
};
let result = args.to_args();
assert_eq!(result, vec!["-ddd"]);
}
#[test]
fn test_positional_args() {
let args = SimpleArgs {
verbose: false,
quiet: false,
output: None,
input: "input.txt".to_string(),
debug: 0,
files: vec!["file1.txt".to_string(), "file2.txt".to_string()],
};
let result = args.to_args();
assert_eq!(result, vec!["file1.txt", "file2.txt"]);
}
#[test]
fn test_with_program() {
let args = SimpleArgs {
verbose: true,
quiet: false,
output: Some("out.txt".to_string()),
input: "in.txt".to_string(),
debug: 1,
files: vec!["test.txt".to_string()],
};
let result = args.to_args_with_program("myapp");
assert_eq!(result, vec!["myapp", "--verbose", "--output", "out.txt", "--input", "in.txt", "-d", "test.txt"]);
}
#[test]
fn test_complex_scenario() {
let args = SimpleArgs {
verbose: true,
quiet: false,
output: Some("results.json".to_string()),
input: "data.csv".to_string(),
debug: 2,
files: vec!["file1.rs".to_string(), "file2.rs".to_string()],
};
let result = args.to_args();
assert_eq!(result, vec!["--verbose", "--output", "results.json", "--input", "data.csv", "-dd", "file1.rs", "file2.rs"]);
}