use super::*;
use crate::git_tree::AgentState;
use crate::nav::convs::expand::forest_rows;
use crate::nav::convs::tests::{agent, plain, unseen};
fn family() -> [crate::git_tree::Agent; 4] {
let mut named = agent("s-0", AgentState::Quiescent, 90);
named.name = Some("pennant".to_owned());
let mut uncertain = agent("r-0-b-1", AgentState::Quiescent, 12);
uncertain.state_uncertain = true;
[
agent("r-0", AgentState::Quiescent, 10),
agent("r-0-a-1", AgentState::Quiescent, 11),
uncertain,
named,
]
}
fn forest(agents: &[crate::git_tree::Agent]) -> Vec<ConvRow> {
forest_rows(agents, "/ws", &unseen, 100, &plain, &[])
}
#[test]
fn the_gate_reads_each_conversations_own_subtree_and_fails_closed() {
let agents = family();
let rows = forest(&agents);
let seat = liveness_of_rows(&rows);
assert_eq!(seat.len(), 2, "one entry per root, never per member");
let sorted = |mut v: Vec<crate::nav::convs::Conversation>| {
v.sort_by(|a, b| a.name.cmp(&b.name));
v
};
assert_eq!(
sorted(seat.clone()),
sorted(crate::nav::convs::liveness(&agents))
);
let by_name = |name: &str| seat.iter().find(|c| c.name == name).cloned();
assert!(
by_name("r-0").expect("the first root").live,
"an unobservable member counts as live"
);
assert!(
!by_name("pennant").expect("the named root").live,
"the quiet conversation beside it is not"
);
}
#[test]
fn the_occupied_set_is_every_members_stored_name() {
let rows = forest(&family());
assert_eq!(names_in_rows(&rows), ["pennant".to_owned()]);
assert!(
names_in_rows(&[]).is_empty(),
"an unanswered forest occupies nothing"
);
}
#[test]
fn a_subtree_is_the_row_and_the_deeper_run_under_it() {
let rows = forest(&family());
let at = |id: &str| {
rows.iter()
.position(|r| r.root_id == id)
.unwrap_or(rows.len())
};
let ids =
|id: &str| -> Vec<String> { subtree(&rows, at(id)).map(|r| r.root_id.clone()).collect() };
assert_eq!(
ids("r-0"),
["r-0", "r-0-a-1", "r-0-b-1"].map(str::to_owned),
"the root takes its whole descent and stops at the next root"
);
assert_eq!(
ids("r-0-a-1"),
["r-0-a-1".to_owned()],
"a leaf is its own subtree"
);
assert!(ids("nobody").is_empty(), "a row nothing answers has none");
}