use super::{ASK, ENTRIES, HELP, OPS, START, find, table};
#[test]
fn every_door_prints_the_line_an_operator_types() {
assert_eq!(
START.usage(),
"lernie start <workspace> <goal> [<dir>] [--role <name>]"
);
assert_eq!(ASK.usage(), "lernie ask <envelope>");
assert_eq!(OPS.usage(), "lernie ops [<max>]");
assert_eq!(ENTRIES.usage(), "lernie entries");
assert_eq!(HELP.usage(), "lernie help [<verb>]");
}
#[test]
fn an_arity_refusal_names_the_word_and_what_it_takes() {
assert_eq!(
ENTRIES.refused(2),
"`lernie entries` takes 0 argument(s) and got 2 — usage: lernie entries"
);
assert_eq!(
START.refused(1),
"`lernie start` takes 2 to 5 argument(s) and got 1 — usage: lernie start \
<workspace> <goal> [<dir>] [--role <name>]",
"a door with an optional argument says the whole range, not its top"
);
assert_eq!(
HELP.refused(2),
"`lernie help` takes 0 to 1 argument(s) and got 2 — usage: lernie \
help [<verb>]",
"a door whose two arities differ says so"
);
}
#[test]
fn a_door_is_found_by_its_word_and_a_stranger_is_not() {
for door in table() {
assert_eq!(find(door.word), Some(door), "{}", door.word);
}
assert_eq!(find("workspaces"), None, "a gesture verb is not a door");
assert_eq!(find("bogus"), None);
}
#[test]
fn every_word_the_usage_lists_has_a_page() {
for word in table()
.iter()
.map(|door| door.word)
.chain(crate::verbs::table().iter().map(|verb| verb.word))
{
let page = crate::verbs::help::page(word).unwrap_or_else(|why| panic!("{word}: {why}"));
assert!(
page.starts_with(&format!("usage: lernie {word}")),
"{word}: {page}"
);
}
assert!(
crate::verbs::help::page("bogus")
.expect_err("a stranger is refused")
.contains(r#"no word named "bogus""#)
);
}
#[test]
fn the_usage_s_door_section_is_this_table() {
let printed = crate::cli::usage();
for door in table() {
assert!(printed.contains(&door.usage()), "{}", door.usage());
let opening = door
.detail
.split_whitespace()
.take(4)
.collect::<Vec<&str>>()
.join(" ");
assert!(printed.contains(&opening), "{opening}");
}
}