use crate::storage::replacer::LruKReplacer;
#[test]
fn lruk_prefers_frames_with_less_than_k_history() {
let mut replacer = LruKReplacer::new(10, 2);
replacer.record_access(1);
replacer.record_access(2);
replacer.record_access(2);
replacer.set_evictable(1, true);
replacer.set_evictable(2, true);
let evicted = replacer.evict().expect("expected one frame");
assert_eq!(evicted, 1);
}
#[test]
fn lruk_uses_oldest_kth_access_for_eviction() {
let mut replacer = LruKReplacer::new(10, 2);
replacer.record_access(3); replacer.record_access(4); replacer.record_access(3); replacer.record_access(4);
replacer.set_evictable(3, true);
replacer.set_evictable(4, true);
let evicted = replacer.evict().expect("expected one frame");
assert_eq!(evicted, 3);
}
#[test]
fn set_evictable_and_remove_update_size() {
let mut replacer = LruKReplacer::new(5, 2);
replacer.record_access(0);
replacer.record_access(1);
replacer.set_evictable(0, true);
replacer.set_evictable(1, true);
assert_eq!(replacer.size(), 2);
replacer.set_evictable(1, false);
assert_eq!(replacer.size(), 1);
replacer.remove(0);
assert_eq!(replacer.size(), 0);
}
#[test]
fn replacer_never_evicts_non_evictable_frames() {
let mut replacer = LruKReplacer::new(3, 2);
replacer.record_access(0);
replacer.record_access(1);
replacer.record_access(2);
replacer.set_evictable(0, true);
replacer.set_evictable(1, false);
replacer.set_evictable(2, false);
assert_eq!(replacer.evict(), Some(0));
assert_eq!(replacer.evict(), None);
}