use super::super::{
DETACHED_EXIT, DRIFT_EXIT, OpEntry, OpRow, Origin, PIPED_UNOBSERVED, SYNTHETIC_EXIT, YOG_STEP,
};
use super::ExitKind;
fn row(exit: i32, stderr: &str) -> OpRow {
OpRow::from(&OpEntry {
ts: "TS".into(),
argv: vec!["litany".into(), "prompt".into(), "/ws".into()],
cwd: "/proj".into(),
exit,
stdout: String::new(),
stderr: stderr.into(),
origin: Origin::default(),
client: crate::registry::Client::default(),
})
}
#[test]
fn a_clean_detached_handoff_renders_as_detached() {
let r = row(DETACHED_EXIT, "");
assert_eq!(r.exit_label(), "detached — handed off, no exit to observe");
assert!(!r.failed());
assert!(!r.exit_label().contains("-2"));
}
#[test]
fn a_spawn_that_never_started_renders_as_failed_to_spawn() {
let r = row(SYNTHETIC_EXIT, "failed to spawn /bin/nope: No such file");
assert_eq!(r.exit_label(), "failed to spawn — never started");
assert!(r.failed());
}
#[test]
fn a_signal_death_renders_as_the_signal() {
let r = row(128 + 9, "");
assert_eq!(r.exit_label(), "killed by signal 9 (exit 137)");
assert!(r.failed());
}
#[test]
fn the_three_detached_and_signal_renderings_never_collide() {
let labels = [
row(DETACHED_EXIT, "").exit_label(),
row(SYNTHETIC_EXIT, "boom").exit_label(),
row(128 + 15, "").exit_label(),
];
for (i, a) in labels.iter().enumerate() {
for b in labels.iter().skip(i + 1) {
assert_ne!(a, b, "two exit facts must never render alike");
}
}
}
#[test]
fn a_failed_yog_step_is_not_worded_as_a_spawn() {
let e = OpEntry::step_failure(
"TS".into(),
"mint",
"/proj".into(),
"pool exhausted".into(),
Origin::default(),
crate::registry::Client::default(),
);
let r = OpRow::from(&e);
assert_eq!(r.argv, format!("{YOG_STEP} mint"));
assert_eq!(r.exit_label(), "step failed — nothing was spawned");
assert!(r.failed());
}
#[test]
fn real_codes_and_the_unobserved_sentinel_state_themselves() {
assert_eq!(row(0, "").exit_label(), "exit 0");
assert!(!row(0, "").failed());
assert_eq!(row(2, "gate").exit_label(), "exit 2");
assert!(row(2, "gate").failed());
assert_eq!(
row(PIPED_UNOBSERVED, "").exit_label(),
"ran; exit not observable"
);
assert!(!row(PIPED_UNOBSERVED, "").failed());
}
#[test]
fn drift_says_it_is_not_an_action() {
let e = OpEntry::drift("TS".into(), "unannounced", "/state".into(), "/root".into());
let r = OpRow::from(&e);
assert!(r.drift() && !r.failed());
assert_eq!(
r.exit_label(),
"drift observation — not an attempted action"
);
assert!(!row(0, "").drift());
}
#[test]
fn the_signal_reading_is_bounded_at_both_ends() {
assert_eq!(
ExitKind::of(SIGNAL_TOP, ""),
ExitKind::Signal(super::SIGNAL_MAX)
);
assert_eq!(
ExitKind::of(SIGNAL_TOP + 1, ""),
ExitKind::Code(SIGNAL_TOP + 1)
);
assert_eq!(ExitKind::of(super::SIGNAL_BASE, ""), ExitKind::Code(128));
assert_eq!(ExitKind::of(-9, ""), ExitKind::Code(-9));
}
const SIGNAL_TOP: i32 = super::SIGNAL_BASE + super::SIGNAL_MAX;
const NOTICE: &str = "litany: compaction landing [c-2] superseded — a compaction landed \
since its fork point (ARCH §2.6); the branch continues\n";
#[test]
fn a_driver_that_died_after_launching_stays_detached_and_fails() {
let r = row(DETACHED_EXIT, "refusing: version skew\n");
assert_eq!(r.exit_label(), "detached — handed off, no exit to observe");
assert!(r.failed());
assert!(!r.drift());
assert_eq!(ExitKind::of(DRIFT_EXIT, "yog-drift"), ExitKind::Drift);
}
#[test]
fn detached_is_true_only_for_a_clean_handoff() {
assert!(row(DETACHED_EXIT, "").detached());
assert!(
!row(DETACHED_EXIT, "refusing: version skew\n").detached(),
"a post-launch death is a failure, not a bare handoff"
);
assert!(!row(0, "").detached());
assert!(!row(SYNTHETIC_EXIT, "boom").detached());
assert!(!row(PIPED_UNOBSERVED, "").detached());
}
#[test]
fn the_sink_is_no_longer_read_for_what_it_says() {
let spoke = row(DETACHED_EXIT, NOTICE);
assert!(
spoke.failed(),
"a folded tail is the derivation's verdict, not litany's prose"
);
assert!(spoke.detached_died());
assert!(!spoke.detached());
assert_eq!(
spoke.exit_label(),
"detached — handed off, no exit to observe"
);
let unfolded = row(DETACHED_EXIT, "");
assert!(!unfolded.failed(), "and an unfolded handoff is no failure");
assert!(unfolded.detached());
}
#[test]
fn the_detached_sentinels_two_readings_never_overlap() {
for stderr in ["", NOTICE, "refusing: version skew\n"] {
let r = row(DETACHED_EXIT, stderr);
let hits = u8::from(r.detached()) + u8::from(r.detached_died());
assert_eq!(hits, 1, "not exactly one reading of {stderr:?}");
}
}
#[test]
fn the_detached_readings_are_of_that_sentinel_only() {
assert!(!row(0, NOTICE).detached_died());
assert!(!row(2, NOTICE).detached_died());
assert!(row(2, NOTICE).failed(), "a real non-zero exit still fails");
}