use smol_bitmap::SmolBitmap;
#[test]
fn test_extract_word_basic() {
let mut bitmap = SmolBitmap::new();
bitmap.insert(0);
bitmap.insert(1);
bitmap.insert(63);
let word0 = bitmap.extract_word(0);
assert_eq!(word0, (1u64 << 63) | 3);
assert_eq!(bitmap.extract_word(5), 0);
}
#[test]
fn test_extract_word_inline_bit_127() {
let mut bitmap = SmolBitmap::new();
bitmap.insert(64);
bitmap.insert(126);
let word1 = bitmap.extract_word(1);
assert_eq!(word1, (1u64 << 62) | 1); assert!(!bitmap.is_spilled());
}
#[test]
fn test_put_word_basic() {
let mut bitmap = SmolBitmap::new();
bitmap.put_word(0, 0xDEADBEEF);
assert_eq!(bitmap.extract_word(0), 0xDEADBEEF);
assert!(!bitmap.is_spilled());
for i in 0..32 {
assert_eq!(bitmap.get(i), ((0xDEADBEEFu64 >> i) & 1) != 0);
}
}
#[test]
fn test_put_word_promotion() {
let mut bitmap = SmolBitmap::new();
bitmap.put_word(1, 0x7FFF_FFFF_FFFF_FFFF);
assert!(!bitmap.is_spilled());
assert_eq!(bitmap.extract_word(1), 0x7FFF_FFFF_FFFF_FFFF);
bitmap.put_word(1, 0x8000_0000_0000_0000);
assert!(bitmap.is_spilled());
assert_eq!(bitmap.extract_word(1), 0x8000_0000_0000_0000);
assert!(bitmap.get(127));
}
#[test]
fn test_put_word_extend() {
let mut bitmap = SmolBitmap::new();
bitmap.put_word(10, 0x1234_5678_9ABC_DEF0);
assert!(bitmap.is_spilled()); assert_eq!(bitmap.extract_word(10), 0x1234_5678_9ABC_DEF0);
for i in 0..10 {
assert_eq!(bitmap.extract_word(i), 0);
}
}
#[test]
fn test_word_ops_roundtrip() {
let mut bitmap = SmolBitmap::new();
let patterns = [
0x0000_0000_0000_0000,
0xFFFF_FFFF_FFFF_FFFF,
0xAAAA_AAAA_AAAA_AAAA,
0x5555_5555_5555_5555,
0x0F0F_0F0F_0F0F_0F0F,
0xF0F0_F0F0_F0F0_F0F0,
];
for &pattern in &patterns {
bitmap.put_word(0, pattern);
assert_eq!(bitmap.extract_word(0), pattern);
}
for &pattern in &patterns {
let safe_pattern = pattern & !(1u64 << 63);
bitmap.put_word(1, safe_pattern);
assert_eq!(bitmap.extract_word(1), safe_pattern);
assert!(!bitmap.is_spilled());
}
}
#[test]
fn test_extract_word_after_spill() {
let mut bitmap = SmolBitmap::new();
bitmap.put_word(0, 0x1111_1111_1111_1111);
bitmap.put_word(1, 0x2222_2222_2222_2222);
bitmap.insert(127);
assert!(bitmap.is_spilled());
assert_eq!(bitmap.extract_word(0), 0x1111_1111_1111_1111);
assert_eq!(bitmap.extract_word(1), 0x2222_2222_2222_2222 | (1u64 << 63));
}
#[test]
fn test_put_word_updates_existing() {
let mut bitmap = SmolBitmap::new();
bitmap.put_word(0, 0xAAAA_AAAA_AAAA_AAAA);
assert_eq!(bitmap.extract_word(0), 0xAAAA_AAAA_AAAA_AAAA);
bitmap.put_word(0, 0x5555_5555_5555_5555);
assert_eq!(bitmap.extract_word(0), 0x5555_5555_5555_5555);
for i in 0..64 {
assert_eq!(bitmap.get(i), ((0x5555_5555_5555_5555u64 >> i) & 1) != 0);
}
}