use super::{LogState, TurnIndexEntry};
fn state_with_turns(turns: usize, events_per_turn: u64) -> LogState {
let mut st = LogState::new("cap-test");
st.manifest.event_count = (turns as u64) * events_per_turn;
let mut offset = 0u64;
for n in 1..=turns {
st.index.entries.push_back(TurnIndexEntry {
turn_number: n as u64,
start_offset: offset,
end_offset: offset + events_per_turn * 10,
event_count: events_per_turn,
ts: "2026-01-01T00:00:00Z".to_string(),
});
offset += events_per_turn * 10;
}
st
}
#[test]
fn no_eviction_when_under_cap() {
let st = state_with_turns(3, 2); assert!(st.plan_cap_eviction(10).is_none());
assert_eq!(st.index.entries.len(), 3, "no turns should be evicted");
}
#[test]
fn no_eviction_when_cap_disabled() {
let st = state_with_turns(5, 2); assert!(st.plan_cap_eviction(0).is_none());
assert_eq!(st.index.entries.len(), 5);
}
#[test]
fn evicts_oldest_turns_to_meet_cap() {
let st = state_with_turns(5, 2);
let plan = st.plan_cap_eviction(6).expect("eviction planned");
assert_eq!(plan.evicted_event_count, 4, "should evict 4 events (2 turns)");
assert_eq!(st.index.entries.len(), 5, "planning must not mutate state");
assert_eq!(plan.truncate_offset, 40);
let mut st = st;
st.apply_cap_eviction(plan, 60);
assert_eq!(st.index.entries.len(), 3, "should keep 3 turns");
assert_eq!(st.index.entries[0].turn_number, 3);
assert_eq!(st.index.entries[2].turn_number, 5);
}
#[test]
fn evicts_all_turns_when_cap_smaller_than_one_turn() {
let st = state_with_turns(3, 5);
let plan = st.plan_cap_eviction(3).expect("eviction planned");
assert_eq!(plan.evicted_event_count, 15, "all events evicted");
let mut st = st;
st.apply_cap_eviction(plan, 0);
assert_eq!(st.index.entries.len(), 0);
}