use super::prompt::{fire, make_fifo, prepared, workspace};
use super::{World, write_exec};
use crate::cli_outbound::Cli;
use crate::start::execute_prompt;
#[test]
fn the_fire_carries_a_named_role_and_omits_an_unnamed_one() {
for (role, want) in [
(Some("planner".to_owned()), vec!["--role", "planner"]),
(None, vec![]),
] {
let w = World::new();
let fifo = w.bin.path().join("report");
make_fifo(&fifo);
let body = format!(
"#!/bin/sh\nprintf '%s\\037%s' \"$4\" \"$5\" > '{}'\n",
fifo.display()
);
let litany = Cli::new(write_exec(w.bin.path(), "litany", &body));
let ws = workspace(&w);
execute_prompt(
&litany,
w.state.path(),
"TS",
&crate::start::Fire {
prepared: crate::start::Prepared {
role,
..prepared("cobalt-gecko", None)
},
..fire(&ws, "cobalt-gecko", None, "do it")
},
&[],
&super::rng(),
)
.unwrap();
let logged = &w.ops()[0].argv;
assert_eq!(logged[4..4 + want.len()], want[..], "role {want:?}");
assert_eq!(
logged[logged.len() - 2..],
[ws.to_string_lossy().into_owned(), "do it".to_owned()],
"the workspace and the goal still trail",
);
let recorded = std::fs::read_to_string(&fifo).unwrap();
let seen: Vec<&str> = recorded.split('\u{1f}').collect();
let expect: Vec<String> = if want.is_empty() {
vec![ws.to_string_lossy().into_owned(), "do it".to_owned()]
} else {
want.iter().map(|s| (*s).to_owned()).collect()
};
assert_eq!(seen, expect);
}
}
#[test]
fn a_lineage_and_a_role_ride_together_in_that_order() {
let w = World::new();
let ws = workspace(&w);
let litany = Cli::new(write_exec(w.bin.path(), "litany", "#!/bin/sh\nexit 0\n"));
execute_prompt(
&litany,
w.state.path(),
"TS",
&crate::start::Fire {
prepared: crate::start::Prepared {
lineage: Some("plan".to_owned()),
role: Some("planner".to_owned()),
..prepared("cobalt-gecko", None)
},
..fire(&ws, "cobalt-gecko", None, "do it")
},
&[],
&super::rng(),
)
.unwrap();
let logged = &w.ops()[0].argv;
assert_eq!(
logged[4..8],
["--config", "plan", "--role", "planner"],
"{logged:?}"
);
}