use super::*;
#[test]
fn spanned_boundary_count_is_max_compactions_before() {
let turns = vec![
mk_turn(0, Some("a"), Some("b"), 0, 2), mk_turn(1, Some("c"), Some("d"), 0, 1), mk_turn(2, Some("e"), Some("f"), 0, 0), ];
let selected = vec![
Selected {
turn_index: 0,
sides: SelSides::Both,
},
Selected {
turn_index: 1,
sides: SelSides::Both,
},
Selected {
turn_index: 2,
sides: SelSides::Both,
},
];
assert_eq!(spanned_boundary_count(&turns, &selected), 2);
let live_only = vec![Selected {
turn_index: 2,
sides: SelSides::Both,
}];
assert_eq!(spanned_boundary_count(&turns, &live_only), 0);
assert_eq!(spanned_boundary_count(&turns, &[]), 0);
}
#[test]
fn max_compactions_caps_reach() {
let turns = vec![
mk_turn(0, Some("a"), Some("b"), 0, 3),
mk_turn(1, Some("c"), Some("d"), 0, 2),
mk_turn(2, Some("e"), Some("f"), 0, 1),
mk_turn(3, Some("g"), Some("h"), 0, 0),
];
let sr = scan_with_turns(turns, Vec::new());
let capped = plan_session(&sr, 40000, 0.5, 1, &cfg());
for s in &capped.selected {
assert!(s.turn_index >= 2, "turn {} beyond cap leaked", s.turn_index);
}
assert!(capped.spanned_boundaries <= 1);
}
#[test]
fn crossed_summaries_first_turn_crosses_nothing() {
let sums = vec![
summary(100, vec![], 10),
summary(200, vec![], 20),
summary(300, vec![], 30),
];
assert!(crossed_summaries(&sums, None, 2).is_empty());
assert!(crossed_summaries(&sums, None, 0).is_empty());
}
#[test]
fn crossed_summaries_step_emits_each_boundary_once() {
let sums = vec![
summary(100, vec![], 10),
summary(200, vec![], 20),
summary(300, vec![], 30),
];
let crossed = crossed_summaries(&sums, Some(2), 0);
assert_eq!(
crossed.iter().map(|s| s.line_no).collect::<Vec<_>>(),
vec![200, 300]
);
let one = crossed_summaries(&sums, Some(2), 1);
assert_eq!(one.iter().map(|s| s.line_no).collect::<Vec<_>>(), vec![200]);
assert!(crossed_summaries(&sums, Some(1), 1).is_empty());
assert!(crossed_summaries(&sums, Some(1), 2).is_empty());
}
#[test]
fn boundary_banners_total_equals_max_cb_across_walk() {
let sums = vec![
summary(100, vec![], 10),
summary(200, vec![], 20),
summary(300, vec![], 30),
];
let mut prev: Option<usize> = None;
let mut emitted: Vec<usize> = Vec::new();
for cb in [2usize, 1, 0] {
for s in crossed_summaries(&sums, prev, cb) {
emitted.push(s.line_no);
}
prev = Some(cb);
}
assert_eq!(emitted.len(), 2, "banners == max cb (2): {emitted:?}");
let mut sorted = emitted.clone();
sorted.sort_unstable();
assert_eq!(sorted, vec![200, 300]);
}