use super::*;
#[test]
fn parse_collects_every_flag_and_positional() {
let f = parse(
&strs(&[
"the-id", "k=v", "--as", "ann", "-m", "note", "--body", "para", "--title", "New",
"--parent", "bl-p", "--no-parent", "--subtask-of", "bl-e", "--blocks", "bl-g:close",
"--needs", "bl-n", "--no-needs", "bl-rm", "-p", "3", "--no-priority", "-t", "x",
"--no-tag", "y", "--edit",
]),
"default",
)
.unwrap();
assert_eq!(f.actor, "ann");
assert_eq!(f.message.as_deref(), Some("note"));
assert_eq!(f.body.as_deref(), Some("para"));
assert_eq!(f.title.as_deref(), Some("New"));
assert_eq!(f.parent.as_deref(), Some("bl-p"));
assert!(f.no_parent);
assert_eq!(f.subtask_of.as_deref(), Some("bl-e"));
assert_eq!(f.blocks, ["bl-g:close"]);
assert_eq!(f.needs, ["bl-n"]);
assert_eq!(f.no_needs, ["bl-rm"]);
assert_eq!(f.priority, Some(3));
assert!(f.no_priority);
assert_eq!(f.tags, ["x"]);
assert_eq!(f.no_tags, ["y"]);
assert!(f.edit);
assert_eq!(f.positionals, ["the-id", "k=v"]);
assert_eq!(parse(&[], "default").unwrap().actor, "default");
}
#[test]
fn parse_rejects_an_unknown_flag() {
assert!(parse(&strs(&["--nope"]), "me").is_err());
}
#[test]
fn parse_resolves_the_per_op_remote_override() {
assert_eq!(parse(&strs(&["--remote", "r"]), "me").unwrap().remote.as_deref(), Some("r"));
let err = parse(&strs(&["--center", "c"]), "me").unwrap_err();
assert!(err.to_string().contains("unexpected flag '--center'"), "{err}");
}
#[test]
fn parse_accepts_glued_short_flags() {
let f = parse(&strs(&["a title", "-p1", "-turgent", "-mglued note"]), "me").unwrap();
assert_eq!(f.priority, Some(1));
assert_eq!(f.tags, ["urgent"]);
assert_eq!(f.message.as_deref(), Some("glued note"));
assert_eq!(f.positionals, ["a title"]);
assert_eq!(parse(&strs(&["-p-5"]), "me").unwrap().priority, Some(-5));
assert_eq!(parse(&strs(&["-p", "2"]), "me").unwrap().priority, Some(2));
assert!(parse(&strs(&["-x1"]), "me").is_err());
}
#[test]
fn parse_honors_the_end_of_options_separator() {
let f = parse(&strs(&["-p", "1", "--", "--title", "-p2", "--"]), "me").unwrap();
assert_eq!(f.priority, Some(1));
assert!(f.title.is_none());
assert_eq!(f.positionals, ["--title", "-p2", "--"]);
assert_eq!(parse(&strs(&["--", "-p1"]), "me").unwrap().positionals, ["-p1"]);
assert!(parse(&strs(&["--"]), "me").unwrap().positionals.is_empty());
}
#[test]
fn parse_errors_on_a_flag_missing_its_value() {
let err = parse(&strs(&["--as"]), "me").unwrap_err();
assert!(err.to_string().contains("--as needs a value"));
}
#[test]
fn parse_rejects_a_non_integer_priority() {
let err = parse(&strs(&["-p", "high"]), "me").unwrap_err();
assert!(err.to_string().contains("not an integer"));
}
#[test]
fn parse_admits_pointer_tags_and_refuses_unsafe_ones() {
let pointers = ["up:balls/team#bl-12ab", "up:git@host:hub.git#bl-12ab", "jira:PROJ-123", "gh:owner/repo#42"];
for t in pointers {
assert_eq!(parse(&strs(&["-t", t]), "me").unwrap().tags, [t], "{t}");
}
for bad in ["", "a b", "a,b", "tab\there", "nl\n"] {
let err = parse(&strs(&["-t", bad]), "me").unwrap_err().to_string();
assert!(err.contains("is not a tag"), "{bad:?}: {err}");
}
assert_eq!(parse(&strs(&["--no-tag", "a b"]), "me").unwrap().no_tags, ["a b"]);
}