#[cfg(feature = "pathmap-backend")]
mod wrapper_composition {
use libdictenstein::MappedDictionary;
use liblevenshtein::cache::eviction::{Age, CostAware, Lfu, Lru, MemoryPressure, Noop, Ttl};
use liblevenshtein::prelude::*;
use std::thread;
use std::time::Duration;
#[test]
fn test_lru_ttl_composition() {
let dict =
PathMapDictionary::from_terms_with_values([("foo", 42), ("bar", 99), ("baz", 123)]);
let ttl = Ttl::new(dict, Duration::from_secs(1));
let lru = Lru::new(ttl);
assert_eq!(lru.get_value("foo"), Some(42));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("bar"), Some(99));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("baz"), Some(123));
let lru_term = lru.find_lru(&["foo", "bar", "baz"]);
assert_eq!(lru_term, Some("foo".to_string()));
thread::sleep(Duration::from_secs(2));
assert_eq!(lru.get_value("foo"), None);
assert_eq!(lru.get_value("bar"), None);
assert_eq!(lru.get_value("baz"), None);
}
#[test]
fn test_lfu_age_composition() {
let dict =
PathMapDictionary::from_terms_with_values([("first", 1), ("second", 2), ("third", 3)]);
let age = Age::new(dict);
let lfu = Lfu::new(age);
assert_eq!(lfu.get_value("first"), Some(1));
thread::sleep(Duration::from_millis(10));
assert_eq!(lfu.get_value("second"), Some(2));
assert_eq!(lfu.get_value("second"), Some(2));
thread::sleep(Duration::from_millis(10));
assert_eq!(lfu.get_value("third"), Some(3));
assert_eq!(lfu.get_value("third"), Some(3));
assert_eq!(lfu.get_value("third"), Some(3));
let lfu_term = lfu.find_lfu(&["first", "second", "third"]);
assert_eq!(lfu_term, Some("first".to_string()));
let oldest = lfu.inner().find_oldest(&["first", "second", "third"]);
assert_eq!(oldest, Some("first".to_string()));
}
#[test]
fn test_memory_pressure_cost_aware_composition() {
let dict = PathMapDictionary::from_terms_with_values([
("large", vec![1, 2, 3, 4, 5]),
("medium", vec![1, 2, 3]),
("small", vec![1]),
]);
let memory = MemoryPressure::new(dict);
let cost = CostAware::new(memory);
cost.get_value("large");
cost.get_value("medium");
cost.get_value("small");
thread::sleep(Duration::from_millis(20));
assert!(cost.cost_score("large").is_some());
assert!(cost.cost_score("medium").is_some());
assert!(cost.cost_score("small").is_some());
assert!(cost.inner().memory_pressure_score("large").is_some());
assert!(cost.inner().memory_pressure_score("medium").is_some());
assert!(cost.inner().memory_pressure_score("small").is_some());
}
#[test]
fn test_triple_wrapper_composition() {
let dict =
PathMapDictionary::from_terms_with_values([("alpha", 1), ("beta", 2), ("gamma", 3)]);
let age = Age::new(dict);
let ttl = Ttl::new(age, Duration::from_secs(2));
let lru = Lru::new(ttl);
assert_eq!(lru.get_value("alpha"), Some(1));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("beta"), Some(2));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("gamma"), Some(3));
let lru_term = lru.find_lru(&["alpha", "beta", "gamma"]);
assert_eq!(lru_term, Some("alpha".to_string()));
let oldest = lru.inner().inner().find_oldest(&["alpha", "beta", "gamma"]);
assert_eq!(oldest, Some("alpha".to_string()));
thread::sleep(Duration::from_secs(3));
assert_eq!(lru.get_value("alpha"), None);
}
#[test]
fn test_noop_passthrough() {
let dict = PathMapDictionary::from_terms_with_values([("test", 42)]);
let noop = Noop::new(dict);
let lru = Lru::new(noop);
assert_eq!(lru.get_value("test"), Some(42));
let unwrapped = lru.into_inner().into_inner();
assert_eq!(unwrapped.get_value("test"), Some(42));
}
#[test]
fn test_into_inner_unwrapping() {
let dict = PathMapDictionary::from_terms_with_values([("data", 100)]);
let lfu = Lfu::new(dict);
let lru = Lru::new(lfu);
assert_eq!(lru.get_value("data"), Some(100));
let lfu_wrapper = lru.into_inner();
assert_eq!(lfu_wrapper.get_value("data"), Some(100));
let base_dict = lfu_wrapper.into_inner();
assert_eq!(base_dict.get_value("data"), Some(100));
}
#[test]
fn test_metadata_independence() {
let dict = PathMapDictionary::from_terms_with_values([("item", 50)]);
let lfu = Lfu::new(dict);
let lru = Lru::new(lfu);
assert_eq!(lru.get_value("item"), Some(50));
assert!(lru.recency("item").is_some());
assert!(lru.inner().access_count("item").is_some());
assert_eq!(lru.inner().access_count("item"), Some(1));
assert_eq!(lru.get_value("item"), Some(50));
assert_eq!(lru.inner().access_count("item"), Some(2));
assert!(lru.recency("item").is_some());
}
#[test]
fn test_eviction_coordination() {
let dict = PathMapDictionary::from_terms_with_values([("keep", 1), ("evict", 2)]);
let lru = Lru::new(dict);
assert_eq!(lru.get_value("keep"), Some(1));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("evict"), Some(2));
thread::sleep(Duration::from_millis(10));
assert_eq!(lru.get_value("keep"), Some(1));
let lru_term = lru.find_lru(&["keep", "evict"]);
assert_eq!(lru_term, Some("evict".to_string()));
let evicted = lru.evict_lru(&["keep", "evict"]);
assert_eq!(evicted, Some("evict".to_string()));
assert_eq!(lru.recency("evict"), None);
assert_eq!(lru.get_value("evict"), Some(2));
}
#[test]
fn test_clear_metadata_composition() {
let dict = PathMapDictionary::from_terms_with_values([("data", 42)]);
let lfu = Lfu::new(dict);
let lru = Lru::new(lfu);
assert_eq!(lru.get_value("data"), Some(42));
assert!(lru.recency("data").is_some());
assert!(lru.inner().access_count("data").is_some());
lru.clear_metadata();
assert_eq!(lru.recency("data"), None);
assert!(lru.inner().access_count("data").is_some());
lru.inner().clear_metadata();
assert_eq!(lru.inner().access_count("data"), None);
}
}