feat: Add more support for patterns and conditional match

This commit is contained in:
2025-01-11 15:52:13 -05:00
parent 0858e04c41
commit 820afa2171
3 changed files with 111 additions and 8 deletions

View File

@@ -62,6 +62,31 @@ fn for_in(#[case] single_iter: &[&str], #[case] multi_iter: &[&str], #[case] exp
assert_eq!(format!("{command:?}"), expected.to_string());
}
struct TestStruct(&'static str);
#[rstest]
#[case(&[], &[], r#""echo" "test""#)]
#[case(&[TestStruct("1"), TestStruct("2")], &[], r#""echo" "test" "1" "2""#)]
#[case(&[], &[TestStruct("3"), TestStruct("4")], r#""echo" "test" "multi" "3" "multi" "4""#)]
#[case(&[TestStruct("1"), TestStruct("2")], &[TestStruct("3"), TestStruct("4")], r#""echo" "test" "1" "2" "multi" "3" "multi" "4""#)]
fn for_in_pat(
#[case] single_iter: &[TestStruct],
#[case] multi_iter: &[TestStruct],
#[case] expected: &str,
) {
let command = cmd!(
"echo",
"test",
for TestStruct(arg) in single_iter => arg,
for TestStruct(arg) in multi_iter => [
"multi",
arg,
],
);
assert_eq!(format!("{command:?}"), expected.to_string());
}
#[rstest]
#[case(None, None, r#""echo" "test""#)]
#[case(Some("arg"), None, r#""echo" "test" "arg""#)]
@@ -105,6 +130,32 @@ fn match_statement(#[case] match_arg: TestArgs, #[case] expected: &str) {
assert_eq!(format!("{command:?}"), expected.to_string());
}
#[rstest]
#[case(TestArgs::Arg1, true, r#""echo" "test" "arg1""#)]
#[case(TestArgs::Arg1, false, r#""echo" "test""#)]
#[case(TestArgs::Arg2, true, r#""echo" "test" "arg1" "arg2""#)]
#[case(TestArgs::Arg2, false, r#""echo" "test""#)]
#[case(TestArgs::Arg3, true, r#""echo" "test" "arg1" "arg2" "arg3""#)]
#[case(TestArgs::Arg3, false, r#""echo" "test""#)]
fn match_statement_conditional(
#[case] match_arg: TestArgs,
#[case] flag: bool,
#[case] expected: &str,
) {
let command = cmd!(
"echo",
"test",
match match_arg {
TestArgs::Arg1 if flag => "arg1",
TestArgs::Arg2 if flag => ["arg1", "arg2"],
TestArgs::Arg3 if flag => ["arg1", "arg2", "arg3"],
_ => [],
}
);
assert_eq!(format!("{command:?}"), expected.to_string());
}
#[rstest]
#[case(None, None, r#""echo" "test""#)]
#[case(Some("arg"), None, r#""echo" "test" "arg""#)]