mod corpus;
use super::{Verb, find, table};
use crate::envelope::OP;
use serde_json::json;
#[test]
fn every_verb_builds_an_envelope_whose_op_is_its_own_word() {
for verb in table() {
let args = verb
.params
.iter()
.map(|p| format!("a-{p}"))
.collect::<Vec<String>>();
let built = verb.envelope(args).expect("the right arity");
assert_eq!(built[OP], json!(verb.word), "{}", verb.word);
for param in verb.params {
assert_eq!(built[*param], json!(format!("a-{param}")), "{}", verb.word);
}
}
}
#[test]
fn the_roster_is_the_verbs_the_seat_can_read_the_answers_to() {
let words: Vec<&str> = table().iter().map(|verb| verb.word).collect();
assert_eq!(
words,
vec![
"workspaces",
"attention",
"balls",
"board",
"search",
"conversations",
"workspace-balls",
"marks",
"science",
"work-diff",
"transcript",
"follow",
"agent",
"steps",
"step",
"files",
"inbox",
"rail",
"governing",
"roles",
"clients",
"lineages",
"providers",
"models",
"login-tail",
"message",
"interrupt",
"nudge",
"stop",
"retarget",
"flag",
"seen",
"answer",
"revoke",
"restore",
"delete-agent",
"enroll",
"login",
"model",
"pin",
"unpin",
"ack",
"scan",
"arm",
"disarm",
"disband",
"clear-trail",
"assign",
"release",
"close",
"delete-workspace"
]
);
}
#[test]
fn a_typed_verb_and_a_hand_written_envelope_are_one_object() {
let verb = find("message").expect("a verb");
let built = verb
.envelope(
["home", "20260830T051200Z-a1b2", "ship it"]
.iter()
.map(|w| (*w).to_owned())
.collect(),
)
.expect("three arguments");
assert_eq!(
built,
json!({"op": "message", "workspace": "home",
"agent": "20260830T051200Z-a1b2", "content": "ship it"})
);
}
#[test]
fn a_wrong_arity_refuses_naming_the_verb_and_its_usage() {
let verb = find("message").expect("a verb");
for count in [0, 2, 4] {
let refusal = verb
.envelope((0..count).map(|n| n.to_string()).collect())
.expect_err("the wrong arity");
assert!(refusal.contains("`lernie message`"), "{refusal}");
assert!(refusal.contains("takes 3 argument(s)"), "{refusal}");
assert!(
refusal.contains("usage: lernie message <workspace> <agent> <content>"),
"{refusal}"
);
}
}
#[test]
fn the_bare_read_takes_nothing() {
let verb = find("workspaces").expect("a verb");
assert_eq!(verb.envelope(Vec::new()), Ok(json!({"op": "workspaces"})));
assert!(verb.envelope(vec!["home".to_owned()]).is_err());
}
#[test]
fn a_usage_line_is_derived_from_the_word_and_its_parameters() {
assert_eq!(
find("transcript").expect("a verb").usage(),
"lernie transcript <workspace> <agent>"
);
assert_eq!(
find("workspaces").expect("a verb").usage(),
"lernie workspaces"
);
let made = Verb {
word: "later",
params: &["one", "two"],
flags: &[],
summary: "",
detail: "",
};
assert_eq!(made.usage(), "lernie later <one> <two>");
}
#[test]
fn a_word_that_is_not_a_verb_is_not_found() {
for word in ["ask", "entries", "help", "invocations", ""] {
assert_eq!(find(word), None, "{word:?}");
}
}
#[test]
fn a_flag_is_raised_by_its_own_word_and_absent_otherwise() {
let made = Verb {
word: "later",
params: &["one"],
flags: &["deeply"],
summary: "",
detail: "",
};
assert_eq!(made.usage(), "lernie later <one> [deeply]");
assert_eq!(
made.envelope(vec!["a".to_owned()]),
Ok(json!({"op": "later", "one": "a"}))
);
assert_eq!(
made.envelope(vec!["a".to_owned(), "deeply".to_owned()]),
Ok(json!({"op": "later", "one": "a", "deeply": true}))
);
}
#[test]
fn a_wrong_tail_is_told_apart_from_a_wrong_count() {
let made = Verb {
word: "later",
params: &["one"],
flags: &["deeply"],
summary: "",
detail: "",
};
let counted = made
.envelope(vec!["a".to_owned(), "deeply".to_owned(), "b".to_owned()])
.expect_err("three is past the range");
assert!(
counted.contains("takes 1 to 2 argument(s) and got 3"),
"{counted}"
);
let named = made
.envelope(vec!["a".to_owned(), "shallowly".to_owned()])
.expect_err("that is not the word");
assert!(named.contains("no word \"shallowly\""), "{named}");
assert!(named.contains("\"deeply\""), "{named}");
}
#[test]
fn the_stop_cascade_is_the_word_children_and_the_bare_form_says_nothing() {
assert_eq!(
super::stop("home".to_owned(), "c-1".to_owned(), false),
json!({"op": "stop", "workspace": "home", "agent": "c-1"})
);
assert_eq!(
super::stop("home".to_owned(), "c-1".to_owned(), true),
json!({"op": "stop", "workspace": "home", "agent": "c-1", "children": true})
);
assert_eq!(
find("stop").expect("a verb").usage(),
"lernie stop <workspace> <agent> [children]"
);
}