use std::sync::Arc;
use super::fixture::World;
use crate::cli_outbound::Cli;
use crate::git_tree::AgentState;
use crate::keymap::InspectorTab;
const AGENT: &str = "c-1";
fn text_delta(fragment: &str) -> String {
format!(
"{{\"type\":\"content_delta\",\"index\":0,\"delta\":{{\"text_delta\":\"{fragment}\"}}}}\n"
)
}
fn flying(world: &mut World) {
let ws = world.ws.clone();
let mut snap = (**world.model.derivation()).clone();
if let Some(tree) = snap.trees.get_mut(&ws) {
for agent in tree.agents.iter_mut().filter(|a| a.agent_id == AGENT) {
agent.state = AgentState::InFlight;
agent.stream = crate::git_tree::stream_from_disk(&ws, AGENT);
}
}
assert!(
snap.trees.get(&ws).is_some_and(|t| t
.agents
.iter()
.any(|a| a.agent_id == AGENT && a.state == AgentState::InFlight)),
"the fixture's conversation is where this beat thinks it is"
);
crate::state::publish_snapshot(&world.model.snapshot_cell(), Arc::new(snap));
world.model.refresh();
}
fn append(world: &World, bytes: &str) {
use std::io::Write;
let path = crate::git_tree::latest_response_path(&world.ws, AGENT)
.expect("the fixture's conversation has a step");
let mut file = std::fs::OpenOptions::new()
.create(true)
.append(true)
.open(path)
.expect("open response");
file.write_all(bytes.as_bytes()).expect("append");
}
#[test]
fn appended_bytes_reach_the_glass_with_no_derivation_and_no_asker_pass() {
let (lernie, bl, bz) = (Cli::new("lernie"), Cli::new("bl"), Cli::new("bz"));
let mut world = super::fixture::world();
let ws = world.ws.clone();
world.model.focus_agent(&ws, AGENT);
world.model.select_tab(InspectorTab::Transcript);
flying(&mut world);
let settled = super::painted(&mut world, &lernie, &bl);
assert!(
!settled.contains("hark"),
"nothing has been said yet:\n{settled}"
);
let pinned = Arc::clone(world.model.derivation());
let ctx = egui::Context::default();
let frame = |world: &mut World| {
crate::paint_probe::text_of(&ctx.run(super::input(), |ctx| {
super::super::render(ctx, &mut world.model, &mut world.state, &lernie, &bl, &bz);
}))
};
let _ = frame(&mut world);
let _ = frame(&mut world);
append(&world, &text_delta("hark"));
world.follows();
world.model.refresh();
let _ = frame(&mut world);
let live = frame(&mut world);
assert!(
live.contains("hark"),
"the character the model just wrote is on the glass:\n{live}"
);
assert!(
Arc::ptr_eq(&pinned, world.model.derivation()),
"and no derivation ran to put it there — this is the whole claim"
);
append(&world, &text_delta(", a lark"));
world.follows();
world.model.refresh();
let _ = frame(&mut world);
let grown = frame(&mut world);
assert!(
grown.contains("hark, a lark"),
"every character that landed is on the frame:\n{grown}"
);
assert!(Arc::ptr_eq(&pinned, world.model.derivation()));
let mut settled = (*pinned).clone();
if let Some(tree) = settled.trees.get_mut(&ws) {
for agent in tree.agents.iter_mut().filter(|a| a.agent_id == AGENT) {
agent.state = AgentState::Quiescent;
}
}
crate::state::publish_snapshot(&world.model.snapshot_cell(), Arc::new(settled));
world.follows();
world.model.refresh();
let _ = frame(&mut world);
let closed = frame(&mut world);
assert!(
!closed.contains("hark"),
"the tail retires with its stream rather than standing over a \
transcript that has moved on:\n{closed}"
);
assert!(
closed.contains("pong reply"),
"and the committed conversation is still what the pane paints:\n{closed}"
);
}
#[test]
fn with_no_lane_the_tail_still_arrives_on_the_pull_path() {
let (lernie, bl) = (Cli::new("lernie"), Cli::new("bl"));
let mut world = super::fixture::world();
let ws = world.ws.clone();
world.model.focus_agent(&ws, AGENT);
world.model.select_tab(InspectorTab::Transcript);
append(&world, &text_delta("still heard"));
flying(&mut world);
let bz = Cli::new("bz");
let ctx = egui::Context::default();
let frame = |world: &mut World| {
crate::paint_probe::text_of(&ctx.run(super::input(), |ctx| {
super::super::render(ctx, &mut world.model, &mut world.state, &lernie, &bl, &bz);
}))
};
let _ = frame(&mut world);
let _ = frame(&mut world);
world.model.refresh();
world.reads();
world.acts();
let _ = frame(&mut world);
world.model.refresh();
let _ = frame(&mut world);
let painted = frame(&mut world);
assert!(
painted.contains("still heard"),
"the tail arrives on the pull path when nothing else does:\n{painted}"
);
}