use super::*;
use crate::boundary::{Gesture, codec, line};
use serde_json::json;
#[test]
fn every_row_describes_a_real_gesture() {
for row in &table() {
assert!(known(row.verb), "{} is not known to itself", row.verb);
assert!(
line::parse(&format!("/{}", row.verb), &line::Context::default()).is_ok()
|| line::parse(&format!("/{} x", row.verb), &line::Context::default()).is_err()
|| line::parse(&format!("/{} x y", row.verb), &line::Context::default()).is_err(),
"{} must be readable as a line",
row.verb
);
assert!(row.usage.starts_with('/'), "{} usage is a line", row.verb);
assert!(!row.summary.is_empty() && !row.detail.is_empty());
assert!(
row.detail.len() > row.summary.len(),
"{}'s page says no more than its one-liner",
row.verb
);
}
}
#[test]
fn every_gesture_the_codec_reads_has_a_page() {
for row in &table() {
let envelope = json!({ "op": row.verb });
let decoded = codec::decode(&envelope);
assert!(
!matches!(&decoded, Err(reason) if reason.contains("unknown op")),
"{} is helped but unspellable as an envelope: {decoded:?}",
row.verb
);
}
}
#[test]
fn a_foot_gesture_is_never_owed_a_control() {
let table = table();
let mut judged = 0;
for gesture in codec::tests::surface::gestures() {
if !crate::registry::peer::Grade::Foot.admits(&gesture) {
continue;
}
let envelope = codec::encode(&gesture);
let op = envelope.get("op").and_then(serde_json::Value::as_str);
let row = op.and_then(|op| table.iter().find(|row| row.verb == op));
assert_eq!(
row.map(|row| row.surface),
Some(Surface::Machine),
"{op:?} is admitted to a foot but is not classed machine"
);
judged += 1;
}
assert!(judged >= 3, "the foot's own three gestures went unwalked");
}
#[test]
fn a_page_is_detail_and_a_roster_is_summaries() {
let page = render(&rows(Some("scan")));
assert!(page.starts_with("/scan"), "{page}");
assert!(
page.contains("silent-death sweep") || page.contains("epitaph"),
"{page}"
);
let roster = roster();
for row in &table() {
assert!(roster.contains(row.usage), "{} is unlisted", row.verb);
assert!(roster.contains(row.summary));
}
assert!(
!roster.contains(table()[0].detail),
"the roster must not print pages"
);
}
#[test]
fn help_about_nothing_is_refused_at_the_edge() {
assert!(!known("enhance"));
let refused = codec::decode(&json!({ "op": "help", "verb": "enhance" }));
assert_eq!(refused, Err("help: unknown verb \"enhance\"".to_owned()));
let read = codec::decode(&json!({ "op": "help", "verb": "close" }));
assert!(matches!(read, Ok(Gesture::Ask(_))));
}