mod arg { #[test] fn name_explicit() { let arg = clap::arg!(foo: --bar ); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_long(), Some("bar")); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(!arg.is_required_set()); } #[test] fn name_from_long() { let arg = clap::arg!(--bar ); assert_eq!(arg.get_id(), "bar"); assert_eq!(arg.get_long(), Some("bar")); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(!arg.is_required_set()); } #[test] fn name_from_value() { let arg = clap::arg!(); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_long(), None); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(arg.is_required_set()); } #[test] #[should_panic] fn name_none_fails() { clap::arg!("Help"); } #[test] #[should_panic] fn short_only_fails() { clap::arg!(-b); } #[test] fn short() { let arg = clap::arg!(foo: -b); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -'b'); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b ...); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Count)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b "How to use it"); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!( arg.get_help().map(|s| s.to_string()), Some("How to use it".to_owned()) ); } #[test] fn short_and_long() { let arg = clap::arg!(foo: -b --hello); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_long(), Some("hello")); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -'b' --hello); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_long(), Some("hello")); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b --hello ...); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_long(), Some("hello")); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Count)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b --hello "How to use it"); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_long(), Some("hello")); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!( arg.get_help().map(|s| s.to_string()), Some("How to use it".to_owned()) ); } #[test] fn short_help() { let arg = clap::arg!(help: -b); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); let mut cmd = clap::Command::new("cmd") .disable_help_flag(true) .arg(clap::arg!(help: -b).action(clap::ArgAction::Help)); cmd.build(); let arg = cmd .get_arguments() .find(|arg| arg.get_id() == "help") .unwrap(); assert!(matches!(arg.get_action(), clap::ArgAction::Help)); } #[test] fn long_help() { let arg = clap::arg!(-'?' - -help); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); let mut cmd = clap::Command::new("cmd") .disable_help_flag(true) .arg(clap::arg!(-'?' - -help).action(clap::ArgAction::Help)); cmd.build(); let arg = cmd .get_arguments() .find(|arg| arg.get_id() == "help") .unwrap(); assert!(matches!(arg.get_action(), clap::ArgAction::Help)); } #[test] fn short_version() { let arg = clap::arg!(version: -b); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); let mut cmd = clap::Command::new("cmd") .disable_version_flag(true) .version("1.0.0") .arg(clap::arg!(version: -b).action(clap::ArgAction::Version)); cmd.build(); let arg = cmd .get_arguments() .find(|arg| arg.get_id() == "version") .unwrap(); assert!(matches!(arg.get_action(), clap::ArgAction::Version)); } #[test] fn long_version() { let arg = clap::arg!(-'?' - -version); assert!(matches!(arg.get_action(), clap::ArgAction::SetTrue)); let mut cmd = clap::Command::new("cmd") .disable_version_flag(true) .version("1.0.0") .arg(clap::arg!(-'?' - -version).action(clap::ArgAction::Version)); cmd.build(); let arg = cmd .get_arguments() .find(|arg| arg.get_id() == "version") .unwrap(); assert!(matches!(arg.get_action(), clap::ArgAction::Version)); } #[test] fn short_with_value() { let arg = clap::arg!(foo: -b ); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -'b' ); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b ...); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Append)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: -b "How to use it"); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_short(), Some('b')); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!( arg.get_help().map(|s| s.to_string()), Some("How to use it".to_owned()) ); } #[test] fn positional() { let arg = clap::arg!(); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!([NUM]); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(!arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!(foo: ); assert_eq!(arg.get_id(), "foo"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!( ...); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Append)); assert_eq!(arg.get_num_args(), Some((1..).into())); assert!(arg.is_required_set()); assert_eq!(arg.get_help().map(|s| s.to_string()), None); let arg = clap::arg!( "How to use it"); assert_eq!(arg.get_id(), "NUM"); assert_eq!(arg.get_value_names(), Some(vec!["NUM".into()].as_slice())); assert!(matches!(arg.get_action(), clap::ArgAction::Set)); assert_eq!(arg.get_num_args(), None); assert!(arg.is_required_set()); assert_eq!( arg.get_help().map(|s| s.to_string()), Some("How to use it".to_owned()) ); } #[test] #[cfg(all(feature = "help", feature = "usage"))] fn optional_value() { let mut cmd = clap::Command::new("test") .args_override_self(true) .arg(clap::arg!(port: -p [NUM])); let r = cmd.try_get_matches_from_mut(["test", "-p42"]); assert!(r.is_ok(), "{}", r.unwrap_err()); let m = r.unwrap(); assert!(m.contains_id("port")); assert_eq!(m.get_one::("port").unwrap(), "42"); let r = cmd.try_get_matches_from_mut(["test", "-p"]); assert!(r.is_ok(), "{}", r.unwrap_err()); let m = r.unwrap(); assert!(m.contains_id("port")); assert!(m.get_one::("port").is_none()); let r = cmd.try_get_matches_from_mut(["test", "-p", "24", "-p", "42"]); assert!(r.is_ok(), "{}", r.unwrap_err()); let m = r.unwrap(); assert!(m.contains_id("port")); assert_eq!(m.get_one::("port").unwrap(), "42"); let help = cmd.render_help().to_string(); snapbox::assert_data_eq!( help, snapbox::str![[r#" Usage: test [OPTIONS] Options: -p [] -h, --help Print help "#]] ); } } mod arg_impl { #[test] fn string_ident() { let expected = "one"; let actual = clap::arg_impl! { @string one }; assert_eq!(actual, expected); } #[test] fn string_literal() { let expected = "one"; let actual = clap::arg_impl! { @string "one" }; assert_eq!(actual, expected); } #[test] fn char_ident() { let expected = 'o'; let actual = clap::arg_impl! { @char o }; assert_eq!(actual, expected); } #[test] fn char_literal() { let expected = 'o'; let actual = clap::arg_impl! { @char 'o' }; assert_eq!(actual, expected); } #[test] // allow double quoted dashed arg name in square brackets (e.g ["some-arg"]) fn arg_name_dashed() { let arg = clap::arg!(["some-arg"] "some arg"); assert_eq!(arg, clap::Arg::new("some-arg").help("some arg")); let m = clap::Command::new("flag") .arg(arg) .try_get_matches_from(vec!["", "some-val"]) .unwrap(); assert_eq!(m.get_one::("some-arg").unwrap(), "some-val"); } #[test] // allow double quoted dashed arg value in triangle brackets (e.g <"some-val">) // test in combination with short argument name (e.g. -v) fn arg_value_dashed_with_short_arg() { let arg = clap::arg!(-a <"some-val"> "some arg"); assert_eq!( arg, clap::Arg::new("some-val") .short('a') .long("arg") .value_name("some-val") ); let m = clap::Command::new("cmd") .arg(arg) .try_get_matches_from(vec!["", "-a", "val"]) .unwrap(); assert_eq!(m.get_one::("some-val").unwrap(), "val"); } #[test] // allow double quoted dashed arg value in triangle brackets (e.g <"some-val">) // test in combination with long argument name (e.g. --value) fn arg_value_dashed_with_long_arg() { let arg = clap::arg!(-a --arg <"some-val"> "some arg"); assert_eq!( arg, clap::Arg::new("arg") .short('a') .long("arg") .value_name("some-val") ); let m = clap::Command::new("cmd") .arg(arg) .try_get_matches_from(vec!["", "--arg", "some-val"]) .unwrap(); assert_eq!(m.get_one::("arg").unwrap(), "some-val"); } }