#[cfg(test)]
#[path = "auto_compact_modes.rs"]
mod modes;
#[cfg(test)]
#[path = "auto_compact_poll.rs"]
mod poll;
#[cfg(test)]
#[path = "auto_compact_support.rs"]
mod support;
use super::super::super::agent::StreamMsg;
use saya_agent::{AgentOutput, TokenUsage};
use support::{answering_report, app_with_model, output, run_turn_maybe_compacting};
#[test]
fn crossing_95_at_a_turn_boundary_fires_exactly_one_compaction() {
let (mut app, mut state) = app_with_model("gpt-4o");
for index in 0..5 {
state.record_turn(format!("q{index}"), format!("a{index}"), false, Vec::new());
}
let fired = run_turn_maybe_compacting(
&mut app,
&mut state,
vec![
answering_report(121_600),
StreamMsg::Done(Ok(output(TokenUsage::new(121_600, 20)))),
],
);
assert!(
fired,
"crossing 95% at a turn boundary must start one compaction"
);
assert!(
app.compact_task.is_some(),
"exactly one worker is in flight"
);
}
#[test]
fn unknown_window_never_fires_even_at_96_percent_of_a_known_one() {
let (mut app, mut state) = app_with_model("mystery-model");
for index in 0..5 {
state.record_turn(format!("q{index}"), format!("a{index}"), false, Vec::new());
}
let fired = run_turn_maybe_compacting(
&mut app,
&mut state,
vec![
answering_report(122_880),
StreamMsg::Done(Ok(output(TokenUsage::new(122_880, 20)))),
],
);
assert!(
!fired,
"an unknown window must never fire, whatever the numerator"
);
}
#[test]
fn mid_continuation_never_fires() {
let (mut app, mut state) = app_with_model("gpt-4o");
for index in 0..5 {
state.record_turn(format!("q{index}"), format!("a{index}"), false, Vec::new());
}
let continued = AgentOutput {
truncated: true,
..output(TokenUsage::new(121_600, 20))
};
let fired = run_turn_maybe_compacting(
&mut app,
&mut state,
vec![answering_report(121_600), StreamMsg::Done(Ok(continued))],
);
assert!(
!fired,
"a continued turn must not compact: the resume anchors live in earlier tool results"
);
}