use super::*;
use crate::opslog::Origin;
use crate::start::Prepared;
use std::path::PathBuf;
#[test]
fn every_flat_receipt_says_what_happened() {
let started = encode(&Reply::Started {
conversation: "brave-fox".into(),
});
assert_eq!(started["ok"], true);
assert_eq!(started["conversation"], "brave-fox");
let deleted = encode(&Reply::Deleted);
assert_eq!(deleted["kind"], "deleted");
assert_eq!(deleted["ok"], true);
assert_eq!(encode(&Reply::Acked)["kind"], "acked");
let nudged = encode(&Reply::Nudged);
assert_eq!(nudged["kind"], "nudged");
assert_eq!(nudged["ok"], true);
assert_eq!(encode(&Reply::TrailCleared)["kind"], "trail-cleared");
let armed = encode(&Reply::Armed { armed: true });
assert_eq!(armed["kind"], "armed");
assert_eq!(armed["armed"], true);
assert_eq!(encode(&Reply::Armed { armed: false })["armed"], false);
assert_eq!(encode(&Reply::Flagged)["kind"], "flagged");
let answered = encode(&Reply::Answered {
tool_use: "toolu_42".into(),
tool: "bash".into(),
ruling: crate::control::judge::Ruling::Pass,
advanced: true,
});
assert_eq!(answered["kind"], "answered");
assert_eq!(answered["tool_use"], "toolu_42");
assert_eq!(answered["tool"], "bash");
assert_eq!(answered["verdict"], "pass");
assert_eq!(answered["advanced"], true);
let floored = encode(&Reply::Floored { standing: true });
assert_eq!(floored["kind"], "floored");
assert_eq!(floored["standing"], true);
assert_eq!(
encode(&Reply::Floored { standing: false })["standing"],
false
);
}
#[test]
fn the_fan_reply_rows_re_enter_as_prompt_gestures() {
let prepared = Prepared {
workspace: crate::naming::leaf(&(PathBuf::from("/ws"))),
binding: Some(PathBuf::from("/state/balls/attempts/dev/proj/at-0badcafe")),
goal: "g".into(),
origin: Origin::Balls,
lineage: None,
};
let v = encode(&Reply::Fanned(vec![prepared.clone()]));
assert_eq!(v["ok"], true);
assert_eq!(v["kind"], "fanned");
let back = serde_json::json!({ "op": "prompt", "prepared": v["rows"][0], "goal": "g2" });
assert_eq!(
crate::boundary::codec::decode(&back),
Ok(crate::boundary::Gesture::Act(
crate::boundary::Action::Prompt {
prepared,
goal: "g2".into(),
seed: None,
}
))
);
for discarded in [false, true] {
let v = encode(&Reply::Retired { discarded });
assert_eq!(v["kind"], "retired");
assert_eq!(v["discarded"], discarded);
assert_eq!(v["ok"], true);
}
}
#[test]
fn a_delivery_receipt_says_absence_by_saying_nothing() {
let v = encode(&Reply::Delivered(crate::fan::Delivery {
target: "work/bl-1".into(),
base: "aaa1".into(),
source: None,
commit: None,
}));
assert_eq!(v["kind"], "delivered");
assert_eq!(v["target"], "work/bl-1");
assert!(v.get("source").is_none(), "{v}");
assert!(v.get("commit").is_none(), "{v}");
}