mod common;
use common::grex;
use proptest::prelude::*;
const VERBS: &[&str] = &[
"init", "add", "rm", "ls", "status", "sync", "update", "doctor", "serve", "import", "run",
"exec",
];
fn required_args(verb: &str) -> Vec<&'static str> {
match verb {
"add" => vec!["https://example.com/repo.git"],
"rm" => vec!["my-pack"],
"run" => vec!["symlink"],
"exec" => vec!["echo", "hi"],
_ => vec![],
}
}
proptest! {
#![proptest_config(ProptestConfig {
cases: 64,
.. ProptestConfig::default()
})]
#[test]
fn filter_accepts_typical_expressions(
expr in proptest::string::string_regex("[a-zA-Z0-9=,]{1,32}").unwrap()
) {
grex()
.args(["init", "--filter"])
.arg(expr)
.assert()
.success();
}
#[test]
fn filter_accepts_empty_and_whitespace(
expr in proptest::string::string_regex(r"[ \t]{0,16}").unwrap()
) {
grex()
.args(["init", "--filter"])
.arg(expr)
.assert()
.success();
}
#[test]
fn bogus_verb_names_fail(
bogus in proptest::string::string_regex("[a-z]{3,16}")
.unwrap()
.prop_filter("must not be a real verb", |s| !VERBS.contains(&s.as_str()))
) {
let output = grex().arg(bogus).assert().failure();
let stderr = String::from_utf8(output.get_output().stderr.clone())
.expect("stderr is UTF-8");
prop_assert!(!stderr.is_empty(), "stderr should be non-empty on unknown-verb failure");
}
}
#[test]
fn each_verb_accepts_required_args() {
for verb in VERBS {
if *verb == "serve"
|| *verb == "doctor"
|| *verb == "import"
|| *verb == "sync"
|| *verb == "ls"
{
continue;
}
let mut cmd = grex();
cmd.arg(verb);
cmd.args(required_args(verb));
cmd.assert().success();
}
}