use ralph::compaction;
use ralph::providers::{Message, MessageContent, Role};
fn make_messages(n: usize, chars_each: usize) -> Vec<Message> {
(0..n)
.map(|i| Message {
role: if i % 2 == 0 {
Role::User
} else {
Role::Assistant
},
content: MessageContent::Text("x".repeat(chars_each)),
tool_call_id: None,
name: None,
reasoning_content: None,
})
.collect()
}
#[test]
fn estimate_tokens_scales_with_content() {
let small = make_messages(1, 4); let large = make_messages(1, 400); assert!(compaction::estimate_tokens(&large) > compaction::estimate_tokens(&small));
}
#[test]
fn should_compact_false_when_below_threshold() {
let messages = make_messages(10, 100);
assert!(!compaction::should_compact(&messages, 200_000, 0));
}
#[test]
fn should_compact_true_when_at_threshold() {
let messages = make_messages(10, 400);
assert!(compaction::should_compact(&messages, 80, 0));
}
#[test]
fn should_compact_false_when_empty() {
let messages = vec![];
assert!(!compaction::should_compact(&messages, 200_000, 0));
}
#[test]
fn should_compact_zero_threshold_always_triggers() {
let messages = make_messages(1, 1);
assert!(compaction::should_compact(&messages, 0, 0));
}