#![allow(clippy::unwrap_used)]
use std::sync::atomic::Ordering::Relaxed;
use super::*;
use crate::config::Config;
fn engine(threshold: usize) -> Engine {
let mut cfg = Config::new();
cfg.gc_memory_threshold(threshold);
Engine::new(&cfg).unwrap()
}
#[test]
fn below_threshold_does_not_post() {
let engine = engine(1000);
let m = engine.register_gc_request();
engine.add_gc_committed(500);
assert!(!m.load(Relaxed), "no request below the threshold");
assert_eq!(engine.gc_committed_bytes(), 500);
}
#[test]
fn crossing_threshold_posts_to_every_mailbox() {
let engine = engine(1000);
let a = engine.register_gc_request();
let b = engine.register_gc_request();
engine.add_gc_committed(1200); assert!(a.load(Relaxed) && b.load(Relaxed), "all stores notified");
}
#[test]
fn one_store_clears_only_its_own_mailbox() {
let engine = engine(1000);
let a = engine.register_gc_request();
let b = engine.register_gc_request();
engine.add_gc_committed(2000);
assert!(a.swap(false, Relaxed));
assert!(!a.load(Relaxed), "serviced");
assert!(b.load(Relaxed), "other store still has its request");
}
#[test]
fn dead_mailboxes_are_pruned_without_panic() {
let engine = engine(1000);
let a = engine.register_gc_request();
{
let _b = engine.register_gc_request();
} engine.add_gc_committed(2000);
assert!(a.load(Relaxed));
a.store(false, Relaxed);
engine.add_gc_committed(1);
assert!(a.load(Relaxed));
}
#[test]
fn committed_total_tracks_add_and_sub() {
let engine = engine(usize::MAX); engine.add_gc_committed(4096);
engine.add_gc_committed(2048);
assert_eq!(engine.gc_committed_bytes(), 6144);
engine.sub_gc_committed(4096);
assert_eq!(engine.gc_committed_bytes(), 2048);
}