use crate::assert_diag_snapshot;
use facet::Facet;
use facet_args as args;
#[test]
fn test_bool_chain_simple() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
#[facet(args::named, args::short = 'c')]
flag_c: bool,
}
let args: Args = facet_args::from_slice(&["-abc"]).unwrap();
assert!(args.flag_a);
assert!(args.flag_b);
assert!(args.flag_c);
}
#[test]
fn test_bool_repeated() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'v')]
verbose: Vec<bool>,
}
let args: Args = facet_args::from_slice(&["-vvv"]).unwrap();
assert_eq!(args.verbose, vec![true, true, true]);
}
#[test]
fn test_bool_chain_with_value() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
#[facet(args::named, args::short = 'j')]
jobs: usize,
}
let args: Args = facet_args::from_slice(&["-abj4"]).unwrap();
assert!(args.flag_a);
assert!(args.flag_b);
assert_eq!(args.jobs, 4);
}
#[test]
fn test_backward_compat_attached_value() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'j')]
jobs: usize,
#[facet(args::positional)]
path: String,
}
let args: Args = facet_args::from_slice(&["-j4", "file.txt"]).unwrap();
assert_eq!(args.jobs, 4);
assert_eq!(args.path, "file.txt");
}
#[test]
fn test_bool_chain_with_separated_value() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
#[facet(args::named, args::short = 'j')]
jobs: usize,
}
let args: Args = facet_args::from_slice(&["-ab", "-j", "4"]).unwrap();
assert!(args.flag_a);
assert!(args.flag_b);
assert_eq!(args.jobs, 4);
}
#[test]
fn test_error_unknown_in_chain() {
#[derive(Facet, Debug)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'c')]
flag_c: bool,
}
let result: Result<Args, _> = facet_args::from_slice(&["-axc"]);
let err = result.unwrap_err();
assert_diag_snapshot!(err);
}
#[test]
fn test_mixed_long_and_chained() {
#[derive(Facet)]
struct Args {
#[facet(args::named)]
verbose: bool,
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
}
let args: Args = facet_args::from_slice(&["--verbose", "-ab"]).unwrap();
assert!(args.verbose);
assert!(args.flag_a);
assert!(args.flag_b);
}
#[test]
fn test_chain_with_equals() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
}
let args: Args = facet_args::from_slice(&["-a=true"]).unwrap();
assert!(args.flag_a);
}
#[test]
fn test_chain_in_variant() {
#[derive(Facet, Debug, PartialEq)]
#[repr(u8)]
enum Command {
#[allow(dead_code)]
Build {
#[facet(args::named, args::short = 'r')]
release: bool,
#[facet(args::named, args::short = 'v')]
verbose: bool,
},
}
#[derive(Facet, Debug, PartialEq)]
struct Args {
#[facet(args::subcommand)]
command: Command,
}
let args: Args = facet_args::from_slice(&["build", "-rv"]).unwrap();
match args.command {
Command::Build { release, verbose } => {
assert!(release);
assert!(verbose);
}
}
}
#[test]
fn test_single_char_chain() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'v')]
verbose: bool,
}
let args: Args = facet_args::from_slice(&["-v"]).unwrap();
assert!(args.verbose);
}
#[test]
fn test_chain_implicit_short() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short)]
alpha: bool,
#[facet(args::named, args::short)]
beta: bool,
}
let args: Args = facet_args::from_slice(&["-ab"]).unwrap();
assert!(args.alpha);
assert!(args.beta);
}
#[test]
fn test_long_chain() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
#[facet(args::named, args::short = 'c')]
flag_c: bool,
#[facet(args::named, args::short = 'd')]
flag_d: bool,
#[facet(args::named, args::short = 'e')]
flag_e: bool,
}
let args: Args = facet_args::from_slice(&["-abcde"]).unwrap();
assert!(args.flag_a);
assert!(args.flag_b);
assert!(args.flag_c);
assert!(args.flag_d);
assert!(args.flag_e);
}
#[test]
fn test_chain_with_positional() {
#[derive(Facet)]
struct Args {
#[facet(args::named, args::short = 'a')]
flag_a: bool,
#[facet(args::named, args::short = 'b')]
flag_b: bool,
#[facet(args::positional)]
path: String,
}
let args: Args = facet_args::from_slice(&["-ab", "file.txt"]).unwrap();
assert!(args.flag_a);
assert!(args.flag_b);
assert_eq!(args.path, "file.txt");
}