use super::SpongeQueue;
use reedline::HistoryItemId;
fn make_id(id: i64) -> HistoryItemId {
HistoryItemId::new(id)
}
fn run_commands(commands: &[(bool, i64)], delay: usize) -> Vec<HistoryItemId> {
let mut queue = SpongeQueue::new();
let mut deleted = Vec::new();
for &(is_failure, id) in commands {
let history_id = Some(make_id(id));
if let Some(id_to_delete) = queue.record_command(is_failure, history_id, delay) {
deleted.push(id_to_delete);
}
}
deleted
}
#[test]
fn test_sponge_delay_keeps_recent_failures() {
let commands = vec![
(true, 1), (false, 2), (false, 3), ];
let deleted = run_commands(&commands, 2);
assert_eq!(deleted.len(), 1);
assert_eq!(deleted[0], make_id(1));
}
#[test]
fn test_sponge_delay_zero_deletes_immediately() {
let commands = vec![
(true, 1), ];
let deleted = run_commands(&commands, 0);
assert_eq!(deleted.len(), 1);
assert_eq!(deleted[0], make_id(1));
}
#[test]
fn test_sponge_success_does_not_delete() {
let commands = vec![
(false, 1), (false, 2), (false, 3), ];
let deleted = run_commands(&commands, 2);
assert!(deleted.is_empty(), "No failures to delete");
}
#[test]
fn test_sponge_multiple_failures_fifo() {
let commands = vec![
(true, 1), (true, 2), (true, 3), (false, 4), ];
let deleted = run_commands(&commands, 2);
assert_eq!(deleted.len(), 2);
assert_eq!(deleted[0], make_id(1)); assert_eq!(deleted[1], make_id(2)); }
#[test]
fn test_sponge_interleaved_success_failure() {
let commands = vec![
(true, 1), (false, 2), (true, 3), (false, 4), (false, 5), ];
let deleted = run_commands(&commands, 3);
assert_eq!(deleted.len(), 1);
assert_eq!(deleted[0], make_id(1));
}
#[test]
fn test_sponge_large_delay_no_deletion() {
let commands = vec![(true, 1), (true, 2), (true, 3), (false, 4), (false, 5)];
let deleted = run_commands(&commands, 100);
assert!(deleted.is_empty(), "Delay is larger than command count");
}
#[test]
fn test_sponge_delay_one_keeps_one_command() {
let commands = vec![
(true, 1), (false, 2), (true, 3), (true, 4), ];
let deleted = run_commands(&commands, 1);
assert_eq!(deleted.len(), 2);
assert_eq!(deleted[0], make_id(1));
assert_eq!(deleted[1], make_id(3));
}
#[test]
fn test_sponge_realistic_scenario() {
let commands = vec![
(true, 100), (false, 101), (false, 102), ];
let deleted = run_commands(&commands, 2);
assert_eq!(deleted.len(), 1);
assert_eq!(deleted[0], make_id(100));
}
#[test]
fn test_sponge_drain_failed_ids() {
let mut queue = SpongeQueue::new();
queue.record_command(true, Some(make_id(1)), 100);
queue.record_command(false, Some(make_id(2)), 100);
queue.record_command(true, Some(make_id(3)), 100);
queue.record_command(false, Some(make_id(4)), 100);
let drained: Vec<_> = queue.drain_failed_ids().collect();
assert_eq!(drained.len(), 2);
assert_eq!(drained[0], make_id(1));
assert_eq!(drained[1], make_id(3));
assert!(queue.is_empty());
}