2021-11-30 09:31:19 -06:00
use crate ::utils ;
2016-01-13 09:03:27 -08:00
2017-01-02 23:05:23 -05:00
use std ::str ;
2022-02-11 21:48:29 -06:00
use clap ::{ error ::ErrorKind , AppSettings , Arg , Command } ;
2016-01-13 09:03:27 -08:00
2022-02-11 21:48:29 -06:00
fn common ( ) -> Command < 'static > {
Command ::new ( " foo " )
2016-01-13 09:03:27 -08:00
}
2022-02-11 21:48:29 -06:00
fn with_version ( ) -> Command < 'static > {
2021-10-08 13:05:40 -04:00
common ( ) . version ( " 3.0 " )
2016-01-13 09:03:27 -08:00
}
2016-05-30 04:49:13 -04:00
2022-02-11 21:48:29 -06:00
fn with_long_version ( ) -> Command < 'static > {
2021-10-08 13:05:40 -04:00
common ( ) . long_version ( " 3.0 (abcdefg) " )
2016-05-30 04:49:13 -04:00
}
2017-04-04 19:54:20 -04:00
2022-02-11 21:48:29 -06:00
fn with_subcommand ( ) -> Command < 'static > {
with_version ( ) . subcommand ( Command ::new ( " bar " ) . subcommand ( Command ::new ( " baz " ) ) )
2021-02-07 11:58:43 +00:00
}
#[ test ]
2021-10-08 13:05:40 -04:00
fn no_version_flag_short ( ) {
2021-11-17 14:23:22 -06:00
let res = common ( ) . try_get_matches_from ( " foo -V " . split ( ' ' ) ) ;
2021-02-07 11:58:43 +00:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-02-02 15:41:24 -06:00
assert_eq! ( err . kind ( ) , clap ::error ::ErrorKind ::UnknownArgument ) ;
2021-02-07 11:58:43 +00:00
}
#[ test ]
2021-10-08 13:05:40 -04:00
fn no_version_flag_long ( ) {
2021-11-17 14:23:22 -06:00
let res = common ( ) . try_get_matches_from ( " foo --version " . split ( ' ' ) ) ;
2021-02-07 11:58:43 +00:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-02-02 15:41:24 -06:00
assert_eq! ( err . kind ( ) , clap ::error ::ErrorKind ::UnknownArgument ) ;
2021-02-07 11:58:43 +00:00
}
#[ test ]
2021-10-08 13:05:40 -04:00
fn version_flag_from_version_short ( ) {
2021-11-17 14:23:22 -06:00
let res = with_version ( ) . try_get_matches_from ( " foo -V " . split ( ' ' ) ) ;
2021-02-07 11:58:43 +00:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-08 13:05:40 -04:00
assert_eq! ( err . to_string ( ) , " foo 3.0 \n " ) ;
2021-02-07 11:58:43 +00:00
}
2021-10-08 13:05:40 -04:00
#[ test ]
fn version_flag_from_version_long ( ) {
2021-11-17 14:23:22 -06:00
let res = with_version ( ) . try_get_matches_from ( " foo --version " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-08 13:05:40 -04:00
assert_eq! ( err . to_string ( ) , " foo 3.0 \n " ) ;
}
2020-10-26 09:37:45 +01:00
2017-04-04 19:54:20 -04:00
#[ test ]
2021-10-08 13:05:40 -04:00
fn version_flag_from_long_version_short ( ) {
2021-11-17 14:23:22 -06:00
let res = with_long_version ( ) . try_get_matches_from ( " foo -V " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-08 13:05:40 -04:00
assert_eq! ( err . to_string ( ) , " foo 3.0 (abcdefg) \n " ) ;
}
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
#[ test ]
fn version_flag_from_long_version_long ( ) {
2021-11-17 14:23:22 -06:00
let res = with_long_version ( ) . try_get_matches_from ( " foo --version " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-08 13:05:40 -04:00
assert_eq! ( err . to_string ( ) , " foo 3.0 (abcdefg) \n " ) ;
2020-10-26 09:37:45 +01:00
}
2021-10-08 13:05:40 -04:00
#[ test ]
fn override_version_long_with_user_flag ( ) {
let res = with_version ( )
. arg ( Arg ::new ( " ver " ) . long ( " version " ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo --version " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-12-27 13:57:38 -06:00
assert! ( res . is_ok ( ) , " {} " , res . unwrap_err ( ) ) ;
2021-10-08 13:05:40 -04:00
let m = res . unwrap ( ) ;
assert! ( m . is_present ( " ver " ) ) ;
}
2017-04-04 19:54:20 -04:00
2020-10-26 09:37:45 +01:00
#[ test ]
2021-10-08 13:05:40 -04:00
fn override_version_long_with_user_flag_no_version_flag ( ) {
let res = with_version ( )
. arg ( Arg ::new ( " ver " ) . long ( " version " ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo -V " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::UnknownArgument ) ;
2021-10-08 13:05:40 -04:00
}
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
#[ test ]
fn override_version_short_with_user_flag ( ) {
let res = with_version ( )
. arg ( Arg ::new ( " ver " ) . short ( 'V' ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo -V " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-12-27 13:57:38 -06:00
assert! ( res . is_ok ( ) , " {} " , res . unwrap_err ( ) ) ;
2021-10-08 13:05:40 -04:00
let m = res . unwrap ( ) ;
assert! ( m . is_present ( " ver " ) ) ;
}
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
#[ test ]
fn override_version_short_with_user_flag_long_still_works ( ) {
let res = with_version ( )
. arg ( Arg ::new ( " ver " ) . short ( 'V' ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo --version " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2020-10-26 09:37:45 +01:00
}
2021-10-08 13:05:40 -04:00
#[ test ]
fn mut_version_short ( ) {
let res = with_version ( )
. mut_arg ( " version " , | a | a . short ( 'z' ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo -z " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-08 13:05:40 -04:00
}
2020-10-26 09:37:45 +01:00
#[ test ]
2021-10-08 13:05:40 -04:00
fn mut_version_long ( ) {
let res = with_version ( )
. mut_arg ( " version " , | a | a . long ( " qux " ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo --qux " . split ( ' ' ) ) ;
2020-10-26 09:37:45 +01:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-02-07 16:14:07 +00:00
}
2021-10-08 13:05:40 -04:00
static VERSION_ABOUT_MULTI_SC : & str = " foo-bar-baz 3.0
2021-02-07 16:14:07 +00:00
USAGE :
2021-10-08 13:05:40 -04:00
foo bar baz
2021-02-07 16:14:07 +00:00
2021-10-11 17:01:33 -05:00
OPTIONS :
2021-07-29 20:23:25 -07:00
- h , - - help Print help information
2021-09-24 11:58:39 -04:00
- V , - - version Print custom version about text
" ;
2021-02-07 16:14:07 +00:00
#[ test ]
fn version_about_multi_subcmd ( ) {
2022-02-14 15:47:20 -06:00
let cmd = with_subcommand ( )
2021-11-18 10:17:15 -06:00
. mut_arg ( " version " , | a | a . help ( " Print custom version about text " ) )
2022-02-10 11:51:40 -06:00
. propagate_version ( true ) ;
2021-02-07 16:14:07 +00:00
assert! ( utils ::compare_output (
2022-02-14 15:47:20 -06:00
cmd ,
2021-10-08 13:05:40 -04:00
" foo bar baz -h " ,
2021-02-07 16:14:07 +00:00
VERSION_ABOUT_MULTI_SC ,
false
) ) ;
}
2021-10-08 13:05:40 -04:00
#[ test ]
fn no_propagation_by_default_long ( ) {
// Version Flag should not be propagated to subcommands
2021-11-17 14:23:22 -06:00
let res = with_subcommand ( ) . try_get_matches_from ( " foo bar --version " . split ( ' ' ) ) ;
2021-02-07 16:14:07 +00:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::UnknownArgument ) ;
2021-10-08 13:05:40 -04:00
}
2021-02-07 16:14:07 +00:00
#[ test ]
2021-10-08 13:05:40 -04:00
fn no_propagation_by_default_short ( ) {
2021-11-17 14:23:22 -06:00
let res = with_subcommand ( ) . try_get_matches_from ( " foo bar -V " . split ( ' ' ) ) ;
2021-02-07 16:14:07 +00:00
2021-10-08 13:05:40 -04:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::UnknownArgument ) ;
2018-01-24 23:05:05 -05:00
}
2021-10-04 07:01:09 -07:00
#[ test ]
2021-10-08 13:05:40 -04:00
fn propagate_version_long ( ) {
let res = with_subcommand ( )
2022-02-10 11:51:40 -06:00
. propagate_version ( true )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo bar --version " . split ( ' ' ) ) ;
2021-10-08 13:05:40 -04:00
2021-10-04 07:01:09 -07:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-04 07:01:09 -07:00
}
#[ test ]
2021-10-08 13:05:40 -04:00
fn propagate_version_short ( ) {
let res = with_subcommand ( )
2022-02-10 11:51:40 -06:00
. propagate_version ( true )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo bar -V " . split ( ' ' ) ) ;
2021-10-08 13:05:40 -04:00
2021-10-04 07:01:09 -07:00
assert! ( res . is_err ( ) ) ;
let err = res . unwrap_err ( ) ;
2022-01-25 16:19:28 -06:00
assert_eq! ( err . kind ( ) , ErrorKind ::DisplayVersion ) ;
2021-10-04 07:01:09 -07:00
}
2021-10-08 13:05:40 -04:00
#[ cfg(debug_assertions) ]
2021-10-04 07:01:09 -07:00
#[ test ]
2022-02-11 21:48:29 -06:00
#[ should_panic = " Used Command::mut_arg( \" version \" , ..) without providing Command::version, Command::long_version or using AppSettings::NoAutoVersion " ]
2021-10-08 13:05:40 -04:00
fn mut_arg_version_panic ( ) {
let _res = common ( )
. mut_arg ( " version " , | v | v . short ( 'z' ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo -z " . split ( ' ' ) ) ;
2021-10-08 13:05:40 -04:00
}
#[ test ]
fn mut_arg_version_no_auto_version ( ) {
let res = common ( )
. mut_arg ( " version " , | v | v . short ( 'z' ) )
. setting ( AppSettings ::NoAutoVersion )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo -z " . split ( ' ' ) ) ;
2021-10-08 13:05:40 -04:00
2021-12-27 13:57:38 -06:00
assert! ( res . is_ok ( ) , " {} " , res . unwrap_err ( ) ) ;
2021-10-08 13:05:40 -04:00
assert! ( res . unwrap ( ) . is_present ( " version " ) ) ;
2021-10-04 07:01:09 -07:00
}
2021-10-08 13:05:40 -04:00
#[ cfg(debug_assertions) ]
2021-10-04 07:01:09 -07:00
#[ test ]
2022-02-11 21:48:29 -06:00
#[ should_panic = " No version information via Command::version or Command::long_version to propagate " ]
2021-10-08 13:05:40 -04:00
fn propagate_version_no_version_info ( ) {
let _res = common ( )
2022-02-10 11:51:40 -06:00
. propagate_version ( true )
2022-02-11 21:48:29 -06:00
. subcommand ( Command ::new ( " bar " ) )
2021-11-17 14:23:22 -06:00
. try_get_matches_from ( " foo " . split ( ' ' ) ) ;
2021-10-04 07:01:09 -07:00
}