use sparsemap::SparseMap;
use std::collections::BTreeSet;
const KEYS: &[u64] = &[
0x0000_0000_ffff_ffff, 0x0000_0001_0000_0000, 0x0000_0001_0000_0001,
0x0000_4000_0000_0000,
0x0000_9c40_0000_3039, 0xffff_ffff_ffff_f800, ];
#[test]
fn add_contains_round_trip_above_2_to_32() {
let mut m = SparseMap::new();
for &k in KEYS {
assert!(m.insert(k), "insert reported already-present for {k:#x}");
assert!(m.contains(k), "contains lost {k:#x} after insert");
}
assert_eq!(m.cardinality(), KEYS.len() as u64);
}
#[test]
fn min_max_rank_select_at_64_bit_magnitudes() {
let m: SparseMap = KEYS.iter().copied().collect();
let mut sorted: Vec<u64> = KEYS.to_vec();
sorted.sort_unstable();
assert_eq!(m.min(), Some(sorted[0]));
assert_eq!(m.max(), Some(*sorted.last().unwrap()));
for (i, &bit) in sorted.iter().enumerate() {
assert_eq!(m.select(i as u64), Some(bit));
assert_eq!(m.rank(bit), i as u64);
}
}
#[test]
fn iteration_yields_every_64_bit_index() {
let m: SparseMap = KEYS.iter().copied().collect();
let mut sorted: Vec<u64> = KEYS.to_vec();
sorted.sort_unstable();
let got: Vec<u64> = m.iter().collect();
assert_eq!(got, sorted);
}
#[test]
fn serialize_round_trip_preserves_64_bit_indices() {
let m: SparseMap = KEYS.iter().copied().collect();
let bytes = m.to_bytes();
let back = SparseMap::from_bytes(&bytes).expect("4.x reads its own output");
assert_eq!(back, m);
let want: BTreeSet<u64> = KEYS.iter().copied().collect();
let got: BTreeSet<u64> = back.iter().collect();
assert_eq!(got, want);
}
#[test]
fn remove_clears_above_2_to_32() {
let mut m: SparseMap = KEYS.iter().copied().collect();
let target = KEYS[1]; assert!(m.remove(target));
assert!(!m.contains(target));
assert!(!m.remove(target)); assert_eq!(m.cardinality(), (KEYS.len() - 1) as u64);
for &k in KEYS.iter().filter(|&&k| k != target) {
assert!(m.contains(k), "remove touched the wrong bit (lost {k:#x})");
}
}
#[test]
fn set_ops_at_64_bit_magnitudes() {
let a: SparseMap = KEYS[..3].iter().copied().collect();
let b: SparseMap = KEYS[2..].iter().copied().collect();
let want_union: BTreeSet<u64> = KEYS.iter().copied().collect();
let want_inter: BTreeSet<u64> = [KEYS[2]].into_iter().collect();
let want_diff: BTreeSet<u64> = KEYS[..2].iter().copied().collect();
let to_set = |m: &SparseMap| -> BTreeSet<u64> { m.iter().collect() };
assert_eq!(to_set(&(&a | &b)), want_union);
assert_eq!(to_set(&(&a & &b)), want_inter);
assert_eq!(to_set(&(&a - &b)), want_diff);
}