use super::prompt::{make_fifo, prepared, workspace};
use super::{World, write_exec};
use crate::cli_outbound::Cli;
use crate::start::execute_prompt;
#[test]
fn prompt_pins_the_bound_projects_instructions_before_the_goal() {
let w = World::new();
let fifo = w.bin.path().join("report");
make_fifo(&fifo);
let body = format!(
"#!/bin/sh\nprintf '%s\\037%s\\037%s\\037%s\\037%s' \"$4\" \"$5\" \"$6\" \"$7\" \"$8\" > '{}'\n",
fifo.display()
);
let litany = Cli::new(write_exec(w.bin.path(), "litany", &body));
let ws = workspace(&w);
let target = w.balls.path().join("work");
std::fs::create_dir_all(target.join(".git")).unwrap();
std::fs::write(target.join("AGENTS.md"), "house rules").unwrap();
execute_prompt(
&litany,
w.state.path(),
"TS",
&crate::start::Fire {
workspace: ws.clone(),
prepared: prepared("cobalt-gecko", Some(&target)).clone(),
goal: "do it".to_owned(),
},
&[],
&super::rng(),
)
.unwrap();
let recorded = std::fs::read_to_string(&fifo).unwrap();
let fields: Vec<&str> = recorded.split('\u{1f}').collect();
let spec = format!(
"instructions/00/AGENTS.md={}",
target.join("AGENTS.md").display()
);
assert_eq!(fields[0], "--cwd");
assert_eq!(fields[1], target.to_string_lossy());
assert_eq!(fields[2], "--pin");
assert_eq!(fields[3], spec);
assert_eq!(
fields[4],
ws.to_string_lossy(),
"the workspace still follows"
);
let e = &w.ops()[0];
assert_eq!(&e.argv[6..8], ["--pin", spec.as_str()]);
assert_eq!(e.argv[9], "do it", "the goal is still last");
}
#[test]
fn an_unbound_rung_freezes_no_instructions() {
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 {
workspace: ws.clone(),
prepared: prepared("cobalt-gecko", None).clone(),
goal: "do it".to_owned(),
},
&[],
&super::rng(),
)
.unwrap();
let recorded = std::fs::read_to_string(&fifo).unwrap();
assert_eq!(recorded, format!("{}\u{1f}do it", ws.to_string_lossy()));
}