use super::*;
use crate::control::judge::{Answer, Ruling, Scope};
pub(super) fn surface() -> Vec<Gesture> {
let mut out = Vec::new();
for answer in answers() {
out.push(Gesture::Act(Action::AnswerHold {
workspace: "ws".into(),
agent: "c-1".into(),
answer,
}));
}
for raised in [true, false] {
out.push(Gesture::Act(Action::Floor {
workspace: "ws".into(),
agent: "c-1".into(),
raised,
}));
}
out
}
pub(super) fn answers() -> Vec<Answer> {
let mut out = Vec::new();
for ruling in [Ruling::Pass, Ruling::Hold, Ruling::Refuse] {
for scope in [Scope::Call, Scope::Conversation, Scope::Workspace] {
out.push(Answer { ruling, scope });
}
}
out
}
#[test]
fn the_held_id_is_never_on_the_wire() {
for answer in answers() {
let envelope = encode(&Gesture::Act(Action::AnswerHold {
workspace: "ws".into(),
agent: "c-1".into(),
answer,
}))
.to_string();
assert!(!envelope.contains("tool_use"), "{envelope}");
}
}
#[test]
fn an_unknown_verdict_is_refused() {
let refused = decode(&serde_json::json!({
"op": "answer", "workspace": "/ws", "agent": "c-1", "verdict": "maybe"
}));
assert_eq!(
refused,
Err("answer: unknown verdict \"maybe\"; say pass, hold or refuse".to_owned())
);
assert!(decode(&serde_json::json!({ "op": "answer", "agent": "c-1" })).is_err());
assert!(decode(&serde_json::json!({ "op": "answer", "workspace": "/ws" })).is_err());
}
#[test]
fn an_unknown_or_missing_scope_is_refused() {
let said = |scope: serde_json::Value| {
decode(&serde_json::json!({
"op": "answer", "workspace": "/ws", "agent": "c-1",
"verdict": "pass", "scope": scope
}))
};
assert_eq!(
said(serde_json::json!("everywhere")),
Err("answer: unknown scope \"everywhere\"; say call, conversation or workspace".to_owned())
);
assert!(said(serde_json::json!(1)).is_err(), "not a string");
assert!(
decode(&serde_json::json!({
"op": "answer", "workspace": "/ws", "agent": "c-1", "verdict": "pass"
}))
.is_err(),
"absent is not a default"
);
}
#[test]
fn the_floor_spells_its_direction_as_the_op() {
for raised in [true, false] {
let gesture = Gesture::Act(Action::Floor {
workspace: "ws".into(),
agent: "c-1".into(),
raised,
});
let envelope = encode(&gesture).to_string();
let op = if raised { "revoke" } else { "restore" };
assert!(envelope.contains(op), "{envelope}");
assert!(!envelope.contains("raised"), "{envelope}");
}
assert!(decode(&serde_json::json!({ "op": "revoke", "agent": "c-1" })).is_err());
assert!(decode(&serde_json::json!({ "op": "restore", "workspace": "/ws" })).is_err());
}