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",
"search",
"conversations",
"transcript",
"follow",
"steps",
"files",
"roles",
"providers",
"models",
"login-tail",
"message",
"interrupt",
"nudge",
"stop",
"retarget",
"flag",
"seen",
"delete-agent",
"enroll",
"login",
"model",
"pin",
"unpin",
"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"],
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", "board", ""] {
assert_eq!(find(word), None, "{word:?}");
}
}