use super::*;
fn parsed(args: &[&str]) -> io::Result<Opts> {
parse(&args.iter().map(ToString::to_string).collect::<Vec<_>>(), "tester")
}
#[test]
fn parse_defaults_the_path_the_from_and_the_to_ref() {
let o = parsed(&[]).unwrap();
assert_eq!((o.path.as_str(), o.from, o.to.as_str()), (DEFAULT_PATH, None, LANDING_BRANCH));
assert_eq!(o.actor.as_str(), "tester");
assert!(o.bins.is_empty());
assert!(!o.explicit_path, "a defaulted path is not explicit (the bl-cfe3 bind-only signal)");
}
#[test]
fn parse_takes_an_explicit_path_refs_actor_and_bins() {
let o = parsed(&["tasks/*", "--from", "a", "--to", "b", "--as", "me"]).unwrap();
assert_eq!((o.path.as_str(), o.from.as_deref()), ("tasks/*", Some("a")));
assert_eq!((o.to.as_str(), o.actor.as_str()), ("b", "me"));
assert!(o.explicit_path, "a named path is explicit");
let o = parsed(&["--from", "x", "--bin", "jira=/opt/jira", "--bin", "t=/v=1/t"]).unwrap();
assert_eq!(o.bins["jira"], PathBuf::from("/opt/jira"));
assert_eq!(o.bins["t"], PathBuf::from("/v=1/t"));
}
#[test]
fn parse_rejects_bad_shapes() {
for (args, needle) in [
(&["a", "b", "--from", "x"][..], "at most one path"),
(&["--from", "x", "--frobnicate"][..], "unexpected flag"),
(&["/etc/config", "--from", "x"][..], "checkout-relative"),
(&["config/../tasks", "--from", "x"][..], "checkout-relative"),
(&["--from"][..], "--from needs a value"),
(&["--bin"][..], "--bin needs a value"),
(&["--bin", "tracker"][..], "<name>=<path>"),
(&["--to", "balls/tasks"][..], "--from is required when --to"),
(&["--from", "x", "--to", "balls/tasks", "--bin", "t=/x"][..], "landing-targeted"),
] {
let err = parsed(args).unwrap_err();
assert!(err.to_string().contains(needle), "{args:?}: {err}");
}
}