1use clap::{arg, value_parser, Command}; 2#[cfg(debug_assertions)] 3use clap::{Arg, ArgAction}; 4 5#[test] 6fn ids() { 7 let m = Command::new("test") 8 .arg(arg!(--color <when>).value_parser(["auto", "always", "never"])) 9 .arg(arg!(--config <path>).value_parser(value_parser!(std::path::PathBuf))) 10 .try_get_matches_from(["test", "--config=config.toml", "--color=auto"]) 11 .unwrap(); 12 assert_eq!( 13 m.ids().map(|id| id.as_str()).collect::<Vec<_>>(), 14 ["config", "color"] 15 ); 16 assert_eq!(m.ids().len(), 2); 17} 18 19#[test] 20fn ids_ignore_unused() { 21 let m = Command::new("test") 22 .arg(arg!(--color <when>).value_parser(["auto", "always", "never"])) 23 .arg(arg!(--config <path>).value_parser(value_parser!(std::path::PathBuf))) 24 .try_get_matches_from(["test", "--config=config.toml"]) 25 .unwrap(); 26 assert_eq!( 27 m.ids().map(|id| id.as_str()).collect::<Vec<_>>(), 28 ["config"] 29 ); 30 assert_eq!(m.ids().len(), 1); 31} 32 33#[test] 34fn ids_ignore_overridden() { 35 let m = Command::new("test") 36 .arg(arg!(--color <when>).value_parser(["auto", "always", "never"])) 37 .arg( 38 arg!(--config <path>) 39 .value_parser(value_parser!(std::path::PathBuf)) 40 .overrides_with("color"), 41 ) 42 .try_get_matches_from(["test", "--config=config.toml", "--color=auto"]) 43 .unwrap(); 44 assert_eq!(m.ids().map(|id| id.as_str()).collect::<Vec<_>>(), ["color"]); 45 assert_eq!(m.ids().len(), 1); 46} 47 48#[test] 49#[cfg(debug_assertions)] 50#[should_panic = "Unknown argument or group id. Make sure you are using the argument id and not the short or long flags"] 51fn arg_matches_if_present_wrong_arg() { 52 let m = Command::new("test") 53 .arg(Arg::new("flag").short('f').action(ArgAction::SetTrue)) 54 .try_get_matches_from(["test", "-f"]) 55 .unwrap(); 56 57 assert!(*m.get_one::<bool>("flag").expect("defaulted by clap")); 58 m.contains_id("f"); 59} 60 61#[test] 62#[cfg(debug_assertions)] 63#[should_panic = "Mismatch between definition and access of `o`. Unknown argument or group id. Make sure you are using the argument id and not the short or long flags"] 64fn arg_matches_value_of_wrong_arg() { 65 let m = Command::new("test") 66 .arg(Arg::new("opt").short('o').action(ArgAction::Set)) 67 .try_get_matches_from(["test", "-o", "val"]) 68 .unwrap(); 69 70 assert_eq!(m.get_one::<String>("opt").map(|v| v.as_str()), Some("val")); 71 m.get_one::<String>("o").map(|v| v.as_str()); 72} 73 74#[test] 75#[cfg(debug_assertions)] 76#[should_panic = "`seed` is not a name of a subcommand."] 77fn arg_matches_subcommand_matches_wrong_sub() { 78 let m = Command::new("test") 79 .subcommand(Command::new("speed")) 80 .try_get_matches_from(["test", "speed"]) 81 .unwrap(); 82 83 assert!(m.subcommand_matches("speed").is_some()); 84 m.subcommand_matches("seed"); 85} 86