use super::*;
use crate::git_tree::ToolCallState;
use crate::nav::convs::{Flight, STRIP_HOVER, age_label, conversation_flight, strip};
const NOW: i64 = 1_800_000_000;
fn stamped(id: &str, name: &str, state: AgentState) -> Agent {
let mut a = agent(id, state, 1);
a.goal_name = Some(name.to_owned());
a
}
fn streaming(text: &str, ago: Option<i64>) -> Agent {
let mut a = stamped("r-0", "stench-pug", AgentState::InFlight);
a.stream.text = Some(text.into());
a.call_start_unix = ago.map(|s| NOW - s);
a
}
fn tool_line(name: Option<&str>, start: Option<i64>) -> Option<String> {
let mut a = named_tool(
"r-0",
AgentState::Live,
ToolCallState::InFlight,
name,
start,
);
a.goal_name = Some("stench-pug".into());
strip(&[a], "r-0", NOW).map(|s| s.facts)
}
#[test]
fn inference_states_who_is_streaming_how_much_landed_and_how_long_it_has_run() {
let s = strip(&[streaming("hello", Some(42))], "r-0", NOW).unwrap();
assert_eq!(s.class, Flight::Inference);
assert_eq!(s.facts, "5 chars streamed · 42s");
assert!(!s.facts.contains("stench-pug"), "{}", s.facts);
}
#[test]
fn a_call_whose_first_token_has_not_arrived_says_so_rather_than_nothing() {
let mut root = stamped("r-0", "stench-pug", AgentState::InFlight);
root.call_start_unix = Some(NOW - 3);
assert_eq!(
strip(&[root], "r-0", NOW).unwrap().facts,
"0 chars streamed · 3s"
);
assert_eq!(
strip(&[streaming("h", Some(3))], "r-0", NOW).unwrap().facts,
"1 char streamed · 3s"
);
}
#[test]
fn a_step_with_no_readable_request_stamp_drops_the_elapsed_not_the_line() {
assert_eq!(
strip(&[streaming("hello", None)], "r-0", NOW)
.unwrap()
.facts,
"5 chars streamed"
);
}
#[test]
fn the_strip_names_the_member_working_never_the_conversation_it_sits_under() {
let root = stamped("r-0", "stench-pug", AgentState::Quiescent);
let mut child = stamped("r-0-c-1", "thistle-vane", AgentState::InFlight);
child.stream.text = Some("abc".into());
child.call_start_unix = Some(NOW - 7200);
let s = strip(&[root, child], "r-0", NOW).unwrap();
assert_eq!(s.class, Flight::Inference);
assert_eq!(s.facts, "thistle-vane · 3 chars streamed · 2h");
}
#[test]
fn tools_states_the_running_tool_by_name_and_how_long_it_has_been_running() {
let mut a = named_tool(
"r-0",
AgentState::Live,
ToolCallState::InFlight,
Some("Bash"),
Some(NOW - 420),
);
a.goal_name = Some("stench-pug".into());
let s = strip(&[a], "r-0", NOW).unwrap();
assert_eq!(s.class, Flight::Tools);
assert_eq!(s.facts, "Bash · 7m");
}
#[test]
fn the_tool_name_and_the_tool_elapsed_are_independently_omitted() {
assert_eq!(tool_line(None, Some(NOW - 9)), Some("9s".to_owned()));
assert_eq!(tool_line(Some("Bash"), None), Some("Bash".to_owned()));
assert_eq!(tool_line(None, None), None);
}
#[test]
fn subagents_counts_the_children_and_counts_them_in_english() {
let root = stamped("r-0", "stench-pug", AgentState::Quiescent);
let one = [root.clone(), agent("r-0-c-1", AgentState::Live, 2)];
let s = strip(&one, "r-0", NOW).unwrap();
assert_eq!(s.class, Flight::Subagents);
assert_eq!(s.facts, "1 child running");
let two = [
root,
agent("r-0-c-1", AgentState::Live, 2),
agent("r-0-c-2", AgentState::Live, 3),
agent("r-0-c-3", AgentState::Stopped, 4),
];
assert_eq!(strip(&two, "r-0", NOW).unwrap().facts, "2 children running");
}
#[test]
fn subagents_shows_no_elapsed_even_when_the_children_carry_starts() {
let root = stamped("r-0", "stench-pug", AgentState::Quiescent);
let mut child = agent("r-0-c-1", AgentState::Live, 2);
child.call_start_unix = Some(NOW - 60);
assert_eq!(
strip(&[root, child], "r-0", NOW).unwrap().facts,
"1 child running"
);
}
#[test]
fn the_elapsed_label_is_the_row_age_label_not_a_second_spelling() {
for ago in [0_i64, 42, 420, 7200, 200_000] {
let s = strip(&[streaming("x", Some(ago))], "r-0", NOW).unwrap();
assert_eq!(s.facts, format!("1 char streamed · {}", age_label(ago)));
}
let mut ahead = streaming("x", Some(0));
ahead.call_start_unix = Some(NOW + 90);
assert_eq!(
strip(&[ahead], "r-0", NOW).unwrap().facts,
"1 char streamed · 0s"
);
}
#[test]
fn nothing_in_flight_is_no_strip_at_all() {
let settled = [
agent("r-0", AgentState::Quiescent, 1),
agent("r-0-c-1", AgentState::Stopped, 2),
];
assert_eq!(strip(&settled, "r-0", NOW), None);
assert_eq!(strip(&settled, "ghost", NOW), None);
assert_eq!(strip(&[], "r-0", NOW), None);
}
#[test]
fn the_strip_is_the_third_seat_of_one_derivation_not_a_second_one() {
let root = streaming("hi", Some(5));
let child = named_tool(
"r-0-c-1",
AgentState::Live,
ToolCallState::InFlight,
Some("Read"),
Some(NOW - 3600),
);
let agents = [root, child];
let s = strip(&agents, "r-0", NOW).unwrap();
assert_eq!(s.class, conversation_flight(&agents, "r-0").unwrap());
assert_eq!(s.class, Flight::Inference);
assert_eq!(s.facts, "2 chars streamed · 5s");
}
#[test]
fn the_seat_explains_itself_on_hover() {
assert!(!STRIP_HOVER.is_empty());
assert!(STRIP_HOVER.contains("in flight"));
}