281 lines
7.3 KiB
Rust
281 lines
7.3 KiB
Rust
extern crate comlexr;
|
|
extern crate rstest;
|
|
|
|
use std::env;
|
|
|
|
use comlexr::cmd;
|
|
use rstest::rstest;
|
|
|
|
#[test]
|
|
fn expression() {
|
|
let command = cmd!("echo", "test");
|
|
|
|
assert_eq!(format!("{command:?}"), r#""echo" "test""#.to_string());
|
|
}
|
|
|
|
#[test]
|
|
fn current_dir() {
|
|
let command = cmd!(
|
|
cd "~/";
|
|
"echo",
|
|
"test",
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), r#"cd "~/" && "echo" "test""#);
|
|
}
|
|
|
|
#[test]
|
|
fn env_vars() {
|
|
let command = cmd!(
|
|
env {
|
|
"TEST": "test",
|
|
};
|
|
"echo",
|
|
"test",
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), r#"TEST="test" "echo" "test""#);
|
|
}
|
|
|
|
#[test]
|
|
fn conditional_env_vars() {
|
|
env::set_var("TEST", "realvalue");
|
|
env::set_var("TEST2", "won't see");
|
|
|
|
let command = cmd!(
|
|
env {
|
|
"TEST":? "test",
|
|
"TEST2": "test2"
|
|
};
|
|
"echo",
|
|
"test",
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), r#"TEST2="test2" "echo" "test""#);
|
|
|
|
let command = cmd!(
|
|
env {
|
|
"TEST": "test",
|
|
"TEST2": "test2"
|
|
};
|
|
"echo",
|
|
"test",
|
|
);
|
|
|
|
assert_eq!(
|
|
format!("{command:?}"),
|
|
r#"TEST="test" TEST2="test2" "echo" "test""#
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn cd_env_vars() {
|
|
let command = cmd!(
|
|
cd "~/";
|
|
env {
|
|
"TEST": "test",
|
|
};
|
|
"echo",
|
|
"test",
|
|
);
|
|
|
|
assert_eq!(
|
|
format!("{command:?}"),
|
|
r#"cd "~/" && TEST="test" "echo" "test""#
|
|
);
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(false, false, r#""echo" "test""#)]
|
|
#[case(true, false, r#""echo" "test" "single""#)]
|
|
#[case(false, true, r#""echo" "test" "multi" "arg""#)]
|
|
#[case(true, true, r#""echo" "test" "single" "multi" "arg""#)]
|
|
fn if_statement(#[case] single: bool, #[case] multi: bool, #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
if single => "single",
|
|
if multi => [
|
|
"multi",
|
|
"arg",
|
|
],
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(&[], r#""echo" "test""#)]
|
|
#[case(&["1", "2"], r#""echo" "test" "1" "2""#)]
|
|
fn for_iter(#[case] iter: &[&str], #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
for iter,
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(&[], &[], r#""echo" "test""#)]
|
|
#[case(&["1", "2"], &[], r#""echo" "test" "1" "2""#)]
|
|
#[case(&[], &["3", "4"], r#""echo" "test" "multi" "3" "multi" "4""#)]
|
|
#[case(&["1", "2"], &["3", "4"], r#""echo" "test" "1" "2" "multi" "3" "multi" "4""#)]
|
|
fn for_in(#[case] single_iter: &[&str], #[case] multi_iter: &[&str], #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
for arg in single_iter => arg,
|
|
for arg in multi_iter => [
|
|
"multi",
|
|
arg,
|
|
],
|
|
);
|
|
|
|
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""#)]
|
|
#[case(None, Some("arg"), r#""echo" "test" "multi" "arg""#)]
|
|
#[case(Some("1"), Some("2"), r#""echo" "test" "1" "multi" "2""#)]
|
|
fn if_let(#[case] single: Option<&str>, #[case] multi: Option<&str>, #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
if let Some(arg) = single => arg,
|
|
if let Some(arg) = multi => [
|
|
"multi",
|
|
arg,
|
|
],
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|
|
|
|
enum TestArgs {
|
|
Arg1,
|
|
Arg2,
|
|
Arg3,
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(TestArgs::Arg1, r#""echo" "test" "arg1""#)]
|
|
#[case(TestArgs::Arg2, r#""echo" "test" "arg1" "arg2""#)]
|
|
#[case(TestArgs::Arg3, r#""echo" "test" "arg1" "arg2" "arg3""#)]
|
|
fn match_statement(#[case] match_arg: TestArgs, #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
match match_arg {
|
|
TestArgs::Arg1 => "arg1",
|
|
TestArgs::Arg2 => ["arg1", "arg2"],
|
|
TestArgs::Arg3 => ["arg1", "arg2", "arg3"],
|
|
}
|
|
);
|
|
|
|
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""#)]
|
|
#[case(None, Some("arg"), r#""echo" "test" "multi" "arg""#)]
|
|
#[case(Some("1"), Some("2"), r#""echo" "test" "1" "multi=2""#)]
|
|
fn multi_match(#[case] single: Option<&str>, #[case] multi: Option<&str>, #[case] expected: &str) {
|
|
let command = cmd!(
|
|
"echo",
|
|
"test",
|
|
match (single, multi) {
|
|
(None, None) => [],
|
|
(Some(single), None) => single,
|
|
(None, Some(multi)) => ["multi", multi],
|
|
(Some(single), Some(multi)) => [single, format!("multi={multi}")],
|
|
},
|
|
);
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(1, r#""echo" "test" "1" "2" "3""#)]
|
|
#[case(2, r#""echo" "test" "2" "4" "6""#)]
|
|
#[case(3, r#""echo" "test" "3" "6" "9""#)]
|
|
fn closure_expr(#[case] input: usize, #[case] expected: &str) {
|
|
let arr = vec![1, 2, 3];
|
|
let command = cmd!("echo", "test", || arr
|
|
.into_iter()
|
|
.map(|i| format!("{}", i * input)));
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|
|
|
|
#[rstest]
|
|
#[case(1, r#""echo" "test" "--test=1a" "--test=2a" "--test=3a""#)]
|
|
#[case(2, r#""echo" "test" "--test=2a" "--test=4a" "--test=6a""#)]
|
|
#[case(3, r#""echo" "test" "--test=3a" "--test=6a" "--test=9a""#)]
|
|
fn closure_block(#[case] input: usize, #[case] expected: &str) {
|
|
let arr = vec![1, 2, 3];
|
|
let suffix = "a";
|
|
let command = cmd!("echo", "test", || {
|
|
let prefix = "--test";
|
|
arr.into_iter()
|
|
.map(move |i| format!("{prefix}={}{suffix}", i * input))
|
|
});
|
|
|
|
assert_eq!(format!("{command:?}"), expected.to_string());
|
|
}
|