1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558
|
use roaring::RoaringBitmap;
#[test]
fn next_range_basic() {
let bm = RoaringBitmap::from([1, 2, 4, 5]);
let mut iter = bm.iter();
// First consecutive range: 1..=2
assert_eq!(iter.next_range(), Some(1..=2));
// Iterator should now point at 4
assert_eq!(iter.next(), Some(4));
// Second consecutive range: 5..=5 (single element)
assert_eq!(iter.next_range(), Some(5..=5));
// Iterator should now be exhausted
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();
// Last consecutive range from back: 4..=5
assert_eq!(iter.next_range_back(), Some(4..=5));
// Iterator back should now point at 2
assert_eq!(iter.next_back(), Some(2));
// Previous consecutive range from back: 1..=1 (single element)
assert_eq!(iter.next_range_back(), Some(1..=1));
// Iterator should now be exhausted from back
assert_eq!(iter.next_back(), None);
assert_eq!(iter.next_range_back(), None);
}
#[test]
fn next_range_single_elements() {
// All single-element ranges
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() {
// Long consecutive sequence
let bm = RoaringBitmap::from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
let mut iter = bm.iter();
// Should get the entire range
assert_eq!(iter.next_range(), Some(1..=10));
// Iterator should be exhausted after consuming the range
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();
// Consume some elements first
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next(), Some(2));
// Should get remaining range from current position
assert_eq!(iter.next_range(), Some(3..=5));
// Continue with next range
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();
// Consume some elements from back first
assert_eq!(iter.next_back(), Some(12));
assert_eq!(iter.next_back(), Some(11));
// Should get remaining range from back position
assert_eq!(iter.next_range_back(), Some(10..=10));
// Continue with previous range
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);
// Reset for back test
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();
// Mix forward and backward operations
assert_eq!(iter.next(), Some(1));
assert_eq!(iter.next_back(), Some(20));
// Get remaining range from front (from current position 2)
assert_eq!(iter.next_range(), Some(2..=3));
// Get remaining range from back (should be 10..=12)
assert_eq!(iter.next_range_back(), Some(10..=12));
// Both ranges consumed, iterator should be empty
assert_eq!(iter.next(), None);
assert_eq!(iter.next_back(), None);
}
#[test]
fn next_range_multi_container() {
// Test across container boundaries
let bm = RoaringBitmap::from([1, 2, 0x1_0000, 0x1_0001, 0x1_0002]);
let mut iter = bm.iter();
// First container range
assert_eq!(iter.next_range(), Some(1..=2));
// Second container range
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() {
// Test behavior at u32::MAX boundary
let bm = RoaringBitmap::from([u32::MAX - 2, u32::MAX - 1, u32::MAX]);
let mut iter = bm.iter();
// Should handle u32::MAX correctly with RangeInclusive
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();
// Advance to middle of a consecutive range
iter.advance_to(3);
// Should get remaining part of the range
assert_eq!(iter.next_range(), Some(3..=5));
// Continue with next range
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();
// Advance back to middle of a consecutive range
iter.advance_back_to(12);
// Should get range from start to current back position
assert_eq!(iter.next_range_back(), Some(10..=12));
// Continue with previous range
assert_eq!(iter.next_back(), Some(5));
assert_eq!(iter.next_range_back(), Some(1..=4));
}
// Test IntoIter variants
#[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();
// Consume all elements
iter.next();
iter.next();
iter.next();
// Iterator should be exhausted
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();
// Get first range
assert_eq!(iter.next_range(), Some(1..=3));
// Iterator advanced past first range, get second range
assert_eq!(iter.next_range(), Some(10..=11));
// No more ranges
assert_eq!(iter.next_range(), None);
}
#[test]
fn next_range_very_sparse() {
// Very sparse bitmap
let bm = RoaringBitmap::from([0, 1000, 2000, 3000]);
let mut iter = bm.iter();
// Each element should be its own range
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() {
// Dense bitmap with large consecutive ranges
let mut bm = RoaringBitmap::new();
// Add ranges: 0-99, 200-299, 500-599
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() {
// Single element bitmap
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);
}
// Tests for bitmap store - these should trigger the todo!() implementations
#[test]
fn next_range_bitmap_store_forced() {
// Create a sparse pattern that exceeds ARRAY_LIMIT but is inefficient as runs
let mut bm = RoaringBitmap::new();
// Add alternating ranges to create many gaps - inefficient as runs
for i in (0..20000).step_by(4) {
bm.insert(i); // bit at i
bm.insert(i + 1); // bit at i+1
// gaps at i+2, i+3
}
// Force removal of run compression to ensure bitmap store
bm.remove_run_compression();
let mut iter = bm.iter();
// First consecutive range should be 0..=1
assert_eq!(iter.next_range(), Some(0..=1));
// Iterator should now point at 4
assert_eq!(iter.next(), Some(4));
// Second consecutive range: 5..=5 (single element)
assert_eq!(iter.next_range(), Some(5..=5));
}
#[test]
fn next_range_back_bitmap_store_forced() {
// Create a sparse pattern that exceeds ARRAY_LIMIT but is inefficient as runs
let mut bm = RoaringBitmap::new();
// Add alternating ranges to create many gaps
for i in (0..20000).step_by(4) {
bm.insert(i);
bm.insert(i + 1);
}
// Force removal of run compression
bm.remove_run_compression();
let mut iter = bm.iter();
// Last consecutive range from back should be the last pair
// The last elements should be 19996, 19997
assert_eq!(iter.next_range_back(), Some(19996..=19997));
}
#[test]
fn next_range_bitmap_store_dense_with_gaps() {
// Create a dense bitmap with strategic gaps to force bitmap store
let mut bm = RoaringBitmap::new();
// Add most elements but with regular gaps to make runs inefficient
for i in 0..10000 {
if i % 3 != 0 {
// Skip every 3rd element
bm.insert(i);
}
}
// Force bitmap representation
bm.remove_run_compression();
let mut iter = bm.iter();
// First consecutive range should be 1..=2
assert_eq!(iter.next_range(), Some(1..=2));
// Next element should be 4
assert_eq!(iter.next(), Some(4));
// Next range should be 5..=5
assert_eq!(iter.next_range(), Some(5..=5));
}
#[test]
fn next_range_bitmap_store_partial_consumption() {
// Create bitmap that forces bitmap store
let mut bm = RoaringBitmap::new();
// Add elements in groups of 2 with gaps
for i in (1000..8000).step_by(3) {
bm.insert(i);
bm.insert(i + 1);
}
bm.remove_run_compression();
let mut iter = bm.iter();
// Consume first few elements
assert_eq!(iter.next(), Some(1000));
assert_eq!(iter.next(), Some(1001));
// Should get next range starting at 1003
assert_eq!(iter.next_range(), Some(1003..=1004));
}
#[test]
fn next_range_bitmap_store_mixed_operations() {
let mut bm = RoaringBitmap::new();
// Create pattern that forces bitmap store
for i in (0..10000).step_by(3) {
bm.insert(i);
bm.insert(i + 1);
}
bm.remove_run_compression();
// The pattern will be: 0,1 gap 3,4 gap 6,7 gap ... 9996,9997 gap 9999
// Last iteration: i=9999, so we insert 9999 and 10000
// But 10000 might be in a different container, so let's find the actual last element
let last_element = bm.iter().next_back().unwrap();
let mut iter = bm.iter();
// Mix forward and backward operations
assert_eq!(iter.next(), Some(0));
assert_eq!(iter.next_back(), Some(last_element));
// Get remaining range from front
assert_eq!(iter.next_range(), Some(1..=1));
// Continue to next range
assert_eq!(iter.next(), Some(3));
assert_eq!(iter.next_range(), Some(4..=4));
}
#[test]
fn next_range_bitmap_store_single_elements() {
// Create very sparse bitmap that forces bitmap store
let mut bm = RoaringBitmap::new();
// Add individual elements spread far apart
for i in (0..20000).step_by(5) {
bm.insert(i);
}
bm.remove_run_compression();
let mut iter = bm.iter();
// Each element should be its own single-element range
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() {
// Create alternating pattern that's inefficient for run encoding
let mut bm = RoaringBitmap::new();
// Every other bit set in a large range
for i in (0..10000).step_by(2) {
bm.insert(i);
}
bm.remove_run_compression();
let mut iter = bm.iter();
// Each bit should be its own range due to alternating pattern
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() {
// Create small clusters of bits separated by gaps
let mut bm = RoaringBitmap::new();
// Add clusters of 3 bits separated by gaps of 5
for base in (0..15000).step_by(8) {
bm.insert(base);
bm.insert(base + 1);
bm.insert(base + 2);
// gap of 5 (base+3, base+4, base+5, base+6, base+7)
}
bm.remove_run_compression();
let mut iter = bm.iter();
// First cluster: 0..=2
assert_eq!(iter.next_range(), Some(0..=2));
// Next cluster starts at 8
assert_eq!(iter.next(), Some(8));
assert_eq!(iter.next_range(), Some(9..=10));
// Next cluster starts at 16
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));
}
|