diff --git a/src/build/debug_asserts.rs b/src/build/debug_asserts.rs index e811db01e4c..5e6baf66644 100644 --- a/src/build/debug_asserts.rs +++ b/src/build/debug_asserts.rs @@ -675,15 +675,29 @@ fn assert_defaults<'d>( for default_os in defaults { if let Some(default_s) = default_os.to_str() { if !arg.possible_vals.is_empty() { - assert!( - arg.possible_vals.iter().any(|possible_val| { - possible_val.matches(default_s, arg.is_ignore_case_set()) - }), - "Argument `{}`'s {}={} doesn't match possible values", - arg.name, - field, - default_s - ); + if let Some(delim) = arg.get_value_delimiter() { + for part in default_s.split(delim) { + assert!( + arg.possible_vals.iter().any(|possible_val| { + possible_val.matches(part, arg.is_ignore_case_set()) + }), + "Argument `{}`'s {}={} doesn't match possible values", + arg.name, + field, + part + ) + } + } else { + assert!( + arg.possible_vals.iter().any(|possible_val| { + possible_val.matches(default_s, arg.is_ignore_case_set()) + }), + "Argument `{}`'s {}={} doesn't match possible values", + arg.name, + field, + default_s + ); + } } if let Some(validator) = arg.validator.as_ref() { diff --git a/tests/derive/arg_enum.rs b/tests/derive/arg_enum.rs index aaf3ccdc9d1..957e870d735 100644 --- a/tests/derive/arg_enum.rs +++ b/tests/derive/arg_enum.rs @@ -457,3 +457,39 @@ fn option_vec_type() { ); assert!(Opt::try_parse_from(&["", "-a", "fOo"]).is_err()); } + +#[test] +fn vec_type_default_value() { + #[derive(clap::ArgEnum, PartialEq, Debug, Clone)] + enum ArgChoice { + Foo, + Bar, + Baz, + } + + #[derive(Parser, PartialEq, Debug)] + struct Opt { + #[clap( + arg_enum, + short, + long, + default_value = "foo,bar", + value_delimiter = ',' + )] + arg: Vec, + } + + assert_eq!( + Opt { + arg: vec![ArgChoice::Foo, ArgChoice::Bar] + }, + Opt::try_parse_from(&[""]).unwrap() + ); + + assert_eq!( + Opt { + arg: vec![ArgChoice::Foo, ArgChoice::Baz] + }, + Opt::try_parse_from(&["", "-a", "foo,baz"]).unwrap() + ); +}