use super::{Standing, standings};
use crate::opslog::{OpRow, Origin};
fn row(argv: &str, exit: i32) -> OpRow {
OpRow {
ts: "1700".to_owned(),
argv: argv.to_owned(),
cwd: "/p".to_owned(),
exit,
stdout: String::new(),
stderr: String::new(),
origin: Origin::Balls,
client: crate::registry::Client::default(),
}
}
fn ack() -> OpRow {
row("yog-step ack-failures", 0)
}
fn words(rows: &[OpRow]) -> Vec<Standing> {
standings(rows).into_iter().map(|v| v.standing).collect()
}
#[test]
fn every_standing_is_reachable_from_one_trail() {
let trail = [
row("bl close x", 1), row("bl close x", 0), row("bz login", 2), ack(),
row("litany prime", 3), row("litany prompt b", crate::opslog::DETACHED_EXIT), ];
assert_eq!(
words(&trail),
[
Standing::Retired,
Standing::Clean,
Standing::Acked,
Standing::Clean,
Standing::Live,
Standing::Detached,
]
);
}
#[test]
fn one_banner_per_origin_is_the_live_rows_grouped_by_origin() {
let mut ball = row("bl close x", 1);
ball.origin = Origin::Balls;
let mut conv = row("litany message y", 1);
conv.origin = Origin::Conversation;
let mut world = row("yog-step mint", crate::opslog::SYNTHETIC_EXIT);
world.origin = Origin::World;
let live: Vec<Origin> = standings(&[ball, conv, world])
.into_iter()
.filter(|v| v.standing == Standing::Live)
.map(|v| v.row.origin)
.collect();
assert_eq!(live, [Origin::Balls, Origin::Conversation, Origin::World]);
}
#[test]
fn a_drift_row_stands_clean() {
let drift = row("yog-drift unannounced", crate::opslog::DRIFT_EXIT);
assert_eq!(words(&[drift]), [Standing::Clean]);
}
#[test]
fn slicing_a_prefix_off_changes_no_row_standing() {
let whole = [ack(), row("litany prime", 1), row("bl close x", 1)];
assert_eq!(
words(&whole),
[Standing::Clean, Standing::Live, Standing::Live]
);
assert_eq!(
words(whole.get(1..).unwrap()),
[Standing::Live, Standing::Live],
"the dropped ack line left both rows after it, which is what they were"
);
}
#[test]
fn each_standing_spells_itself() {
let all = [
Standing::Clean,
Standing::Detached,
Standing::Live,
Standing::Retired,
Standing::Acked,
];
let mut spelled: Vec<&str> = all.iter().map(|s| s.token()).collect();
spelled.sort_unstable();
spelled.dedup();
assert_eq!(spelled.len(), all.len(), "no two standings share a word");
}