#![cfg(not(debug_assertions))]
use kevy_bench::{bench, black_box};
use kevy_map::KevyMap;
const KEYS: usize = 1024;
fn keys(n: usize) -> Vec<Vec<u8>> {
(0..n).map(|i| format!("key:{i:08}").into_bytes()).collect()
}
#[test]
fn insert_under_budget() {
let ks = keys(KEYS);
let s = bench(30, 200, || {
let mut m = KevyMap::<Vec<u8>, u64>::with_capacity(KEYS);
for (i, k) in ks.iter().enumerate() {
m.insert(black_box(k.clone()), i as u64);
}
black_box(m);
});
let per_insert = s.median_ns / KEYS as u64;
assert!(
per_insert < 200,
"KevyMap per-insert median = {per_insert} ns (KEYS={KEYS}), budget 200"
);
}
#[test]
fn get_hit_under_budget() {
let ks = keys(KEYS);
let mut m = KevyMap::<Vec<u8>, u64>::with_capacity(KEYS);
for (i, k) in ks.iter().enumerate() {
m.insert(k.clone(), i as u64);
}
let s = bench(30, 500, || {
for k in &ks {
black_box(m.get(black_box(k.as_slice())));
}
});
let per_get = s.median_ns / KEYS as u64;
assert!(
per_get < 80,
"KevyMap per-get median = {per_get} ns (KEYS={KEYS}), budget 80"
);
}
#[test]
fn remove_under_budget() {
let ks = keys(KEYS);
let s = bench(30, 200, || {
let mut m = KevyMap::<Vec<u8>, u64>::with_capacity(KEYS);
for (i, k) in ks.iter().enumerate() {
m.insert(k.clone(), i as u64);
}
for k in &ks {
black_box(m.remove(black_box(k.as_slice())));
}
});
let per_op = s.median_ns / (2 * KEYS) as u64;
assert!(
per_op < 250,
"KevyMap insert+remove combined per-op median = {per_op} ns, budget 250"
);
}