use roaring::RoaringBitmap;
#[test]
fn next_range_basic() {
let bm = RoaringBitmap::from([1, 2, 4, 5]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=2));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next_range(), Some(5..=5));
assert_eq!(iter.next(), None);
assert_eq!(iter.next_range(), None);
}
#[test]
fn next_range_back_basic() {
let bm = RoaringBitmap::from([1, 2, 4, 5]);
let mut iter = bm.iter();
assert_eq!(iter.next_range_back(), Some(4..=5));
assert_eq!(iter.next_back(), Some(2));
assert_eq!(iter.next_range_back(), Some(1..=1));
assert_eq!(iter.next_back(), None);
assert_eq!(iter.next_range_back(), None);
}
#[test]
fn next_range_single_elements() {
let bm = RoaringBitmap::from([1, 3, 5, 7]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=1));
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next_range(), Some(5..=5));
assert_eq!(iter.next(), Some(7));
assert_eq!(iter.next_range(), None);
assert_eq!(iter.next(), None);
}
#[test]
fn next_range_long_consecutive() {
let bm = RoaringBitmap::from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=10));
assert_eq!(iter.next(), None);
assert_eq!(iter.next_range(), None);
}
#[test]
fn next_range_partial_consumption() {
let bm = RoaringBitmap::from([1, 2, 3, 4, 5, 10, 11, 12]);
let mut iter = bm.iter();
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next_range(), Some(3..=5));
assert_eq!(iter.next(), Some(10));
assert_eq!(iter.next_range(), Some(11..=12));
}
#[test]
fn next_range_back_partial_consumption() {
let bm = RoaringBitmap::from([1, 2, 3, 10, 11, 12]);
let mut iter = bm.iter();
assert_eq!(iter.next_back(), Some(12));
assert_eq!(iter.next_back(), Some(11));
assert_eq!(iter.next_range_back(), Some(10..=10));
assert_eq!(iter.next_back(), Some(3));
assert_eq!(iter.next_range_back(), Some(1..=2));
}
#[test]
fn next_range_empty_bitmap() {
let bm = RoaringBitmap::new();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), None);
assert_eq!(iter.next_range_back(), None);
}
#[test]
fn next_range_single_element_bitmap() {
let bm = RoaringBitmap::from([42]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(42..=42));
assert_eq!(iter.next(), None);
let mut iter = bm.iter();
assert_eq!(iter.next_range_back(), Some(42..=42));
assert_eq!(iter.next_back(), None);
}
#[test]
fn next_range_mixed_operations() {
let bm = RoaringBitmap::from([1, 2, 3, 10, 11, 12, 20]);
let mut iter = bm.iter();
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next_back(), Some(20));
assert_eq!(iter.next_range(), Some(2..=3));
assert_eq!(iter.next_range_back(), Some(10..=12));
assert_eq!(iter.next(), None);
assert_eq!(iter.next_back(), None);
}
#[test]
fn next_range_multi_container() {
let bm = RoaringBitmap::from([1, 2, 0x1_0000, 0x1_0001, 0x1_0002]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=2));
assert_eq!(iter.next(), Some(0x1_0000));
assert_eq!(iter.next_range(), Some(0x1_0001..=0x1_0002));
assert_eq!(iter.next(), None);
}
#[test]
fn next_range_u32_max_boundary() {
let bm = RoaringBitmap::from([u32::MAX - 2, u32::MAX - 1, u32::MAX]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some((u32::MAX - 2)..=u32::MAX));
assert_eq!(iter.next(), None);
}
#[test]
fn next_range_advance_to_integration() {
let bm = RoaringBitmap::from([1, 2, 3, 4, 5, 10, 11, 12, 13]);
let mut iter = bm.iter();
iter.advance_to(3);
assert_eq!(iter.next_range(), Some(3..=5));
assert_eq!(iter.next(), Some(10));
assert_eq!(iter.next_range(), Some(11..=13));
}
#[test]
fn next_range_advance_back_to_integration() {
let bm = RoaringBitmap::from([1, 2, 3, 4, 5, 10, 11, 12, 13]);
let mut iter = bm.iter();
iter.advance_back_to(12);
assert_eq!(iter.next_range_back(), Some(10..=12));
assert_eq!(iter.next_back(), Some(5));
assert_eq!(iter.next_range_back(), Some(1..=4));
}
#[test]
fn into_iter_next_range_basic() {
let bm = RoaringBitmap::from([1, 2, 4, 5]);
let mut iter = bm.into_iter();
assert_eq!(iter.next_range(), Some(1..=2));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next_range(), Some(5..=5));
}
#[test]
fn into_iter_next_range_back_basic() {
let bm = RoaringBitmap::from([1, 2, 4, 5]);
let mut iter = bm.into_iter();
assert_eq!(iter.next_range_back(), Some(4..=5));
assert_eq!(iter.next_back(), Some(2));
assert_eq!(iter.next_range_back(), Some(1..=1));
}
#[test]
fn next_range_exhausted_iterator() {
let bm = RoaringBitmap::from([1, 2, 3]);
let mut iter = bm.iter();
iter.next();
iter.next();
iter.next();
assert_eq!(iter.next_range(), None);
assert_eq!(iter.next_range_back(), None);
}
#[test]
fn next_range_overlapping_calls() {
let bm = RoaringBitmap::from([1, 2, 3, 10, 11]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=3));
assert_eq!(iter.next_range(), Some(10..=11));
assert_eq!(iter.next_range(), None);
}
#[test]
fn next_range_very_sparse() {
let bm = RoaringBitmap::from([0, 1000, 2000, 3000]);
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=0));
assert_eq!(iter.next(), Some(1000));
assert_eq!(iter.next_range(), Some(2000..=2000));
assert_eq!(iter.next(), Some(3000));
assert_eq!(iter.next_range(), None);
}
#[test]
fn next_range_dense_bitmap() {
let mut bm = RoaringBitmap::new();
for i in 0..100 {
bm.insert(i);
}
for i in 200..300 {
bm.insert(i);
}
for i in 500..600 {
bm.insert(i);
}
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=99));
assert_eq!(iter.next(), Some(200));
assert_eq!(iter.next_range(), Some(201..=299));
assert_eq!(iter.next(), Some(500));
assert_eq!(iter.next_range(), Some(501..=599));
assert_eq!(iter.next(), None);
}
#[test]
fn next_range_multi_container_range() {
let mut bm = RoaringBitmap::new();
bm.insert_range(0..=0x4_0000);
let mut iter = bm.iter();
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next_range(), Some(2..=0x4_0000));
assert_eq!(iter.next_range(), None);
assert_eq!(iter.next(), None);
}
#[test]
fn next_range_bitmap_store_forced() {
let mut bm = RoaringBitmap::new();
for i in (0..20000).step_by(4) {
bm.insert(i); bm.insert(i + 1); }
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=1));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next_range(), Some(5..=5));
}
#[test]
fn next_range_back_bitmap_store_forced() {
let mut bm = RoaringBitmap::new();
for i in (0..20000).step_by(4) {
bm.insert(i);
bm.insert(i + 1);
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range_back(), Some(19996..=19997));
}
#[test]
fn next_range_bitmap_store_dense_with_gaps() {
let mut bm = RoaringBitmap::new();
for i in 0..10000 {
if i % 3 != 0 {
bm.insert(i);
}
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(1..=2));
assert_eq!(iter.next(), Some(4));
assert_eq!(iter.next_range(), Some(5..=5));
}
#[test]
fn next_range_bitmap_store_partial_consumption() {
let mut bm = RoaringBitmap::new();
for i in (1000..8000).step_by(3) {
bm.insert(i);
bm.insert(i + 1);
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next(), Some(1000));
assert_eq!(iter.next(), Some(1001));
assert_eq!(iter.next_range(), Some(1003..=1004));
}
#[test]
fn next_range_bitmap_store_mixed_operations() {
let mut bm = RoaringBitmap::new();
for i in (0..10000).step_by(3) {
bm.insert(i);
bm.insert(i + 1);
}
bm.remove_run_compression();
let last_element = bm.iter().next_back().unwrap();
let mut iter = bm.iter();
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next_back(), Some(last_element));
assert_eq!(iter.next_range(), Some(1..=1));
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next_range(), Some(4..=4));
}
#[test]
fn next_range_bitmap_store_single_elements() {
let mut bm = RoaringBitmap::new();
for i in (0..20000).step_by(5) {
bm.insert(i);
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=0));
assert_eq!(iter.next(), Some(5));
assert_eq!(iter.next_range(), Some(10..=10));
assert_eq!(iter.next(), Some(15));
assert_eq!(iter.next_range(), Some(20..=20));
}
#[test]
fn next_range_bitmap_store_alternating_pattern() {
let mut bm = RoaringBitmap::new();
for i in (0..10000).step_by(2) {
bm.insert(i);
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=0));
assert_eq!(iter.next(), Some(2));
assert_eq!(iter.next_range(), Some(4..=4));
assert_eq!(iter.next(), Some(6));
assert_eq!(iter.next_range(), Some(8..=8));
}
#[test]
fn next_range_bitmap_store_with_small_clusters() {
let mut bm = RoaringBitmap::new();
for base in (0..15000).step_by(8) {
bm.insert(base);
bm.insert(base + 1);
bm.insert(base + 2);
}
bm.remove_run_compression();
let mut iter = bm.iter();
assert_eq!(iter.next_range(), Some(0..=2));
assert_eq!(iter.next(), Some(8));
assert_eq!(iter.next_range(), Some(9..=10));
assert_eq!(iter.next(), Some(16));
assert_eq!(iter.next_range(), Some(17..=18));
}
#[test]
fn range_partial_consume() {
let mut bitmap = RoaringBitmap::new();
bitmap.insert_range(0..=0x3FFF);
let mut iter = bitmap.iter();
iter.next();
assert_eq!(iter.next_range_back(), Some(1..=0x3FFF));
}
#[test]
fn range_with_initial_next() {
let mut bitmap = RoaringBitmap::new();
bitmap.insert_range(69311..=180090);
let mut iter = bitmap.iter();
assert_eq!(iter.next(), Some(69311));
assert_eq!(iter.next_range_back(), Some(69312..=180090));
}
#[test]
fn range_with_gap() {
let mut bitmap = RoaringBitmap::new();
bitmap.insert_range(0x2_0000..=0x2_FFFF);
bitmap.remove(0x2_1000);
bitmap.remove_run_compression();
let mut iter = bitmap.iter();
assert_eq!(iter.next_range(), Some(0x2_0000..=0x2_0FFF));
assert_eq!(iter.next(), Some(0x2_1001));
}
#[test]
fn range_back_after_next() {
let mut bitmap = RoaringBitmap::new();
bitmap.insert_range(0..=0x3_FFFF);
bitmap.remove(0x0_3000);
let mut iter = bitmap.iter();
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next_range_back(), Some(0x0_3001..=0x3_FFFF));
}