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
|
extern crate roaring;
use roaring::RoaringBitmap;
#[test]
fn or() {
let mut rb1 = (1..4).collect::<RoaringBitmap>();
let rb2 = (3..6).collect::<RoaringBitmap>();
let rb3 = (1..6).collect::<RoaringBitmap>();
assert_eq!(rb3, &rb1 | &rb2);
assert_eq!(rb3, &rb1 | rb2.clone());
assert_eq!(rb3, rb1.clone() | &rb2);
assert_eq!(rb3, rb1.clone() | rb2.clone());
assert_eq!(rb3.len(), rb1.union_len(&rb2));
rb1 |= &rb2;
rb1 |= rb2;
assert_eq!(rb3, rb1);
}
#[test]
fn and() {
let mut rb1 = (1..4).collect::<RoaringBitmap>();
let rb2 = (3..6).collect::<RoaringBitmap>();
let rb3 = (3..4).collect::<RoaringBitmap>();
assert_eq!(rb3, &rb1 & &rb2);
assert_eq!(rb3, &rb1 & rb2.clone());
assert_eq!(rb3, rb1.clone() & &rb2);
assert_eq!(rb3, rb1.clone() & rb2.clone());
assert_eq!(rb3.len(), rb1.intersection_len(&rb2));
rb1 &= &rb2;
rb1 &= rb2;
assert_eq!(rb3, rb1);
}
#[test]
fn sub() {
let mut rb1 = (1..4000).collect::<RoaringBitmap>();
let rb2 = (3..5000).collect::<RoaringBitmap>();
let rb3 = (1..3).collect::<RoaringBitmap>();
assert_eq!(rb3, &rb1 - &rb2);
assert_eq!(rb3, &rb1 - rb2.clone());
assert_eq!(rb3, rb1.clone() - &rb2);
assert_eq!(rb3, rb1.clone() - rb2.clone());
assert_eq!(rb3.len(), rb1.difference_len(&rb2));
rb1 -= &rb2;
rb1 -= rb2;
assert_eq!(rb3, rb1);
}
// See issue #327
#[test]
fn subtraction_preserves_zero_element() {
let mut a = RoaringBitmap::from([0, 35, 80, 104, 138, 214, 235, 258]);
let b = RoaringBitmap::from([9, 35, 42, 51, 111, 134, 231, 239]);
a -= b;
// The bug: element 0 should still be present but was being removed
assert!(a.contains(0), "Element 0 should be present after subtraction");
// Verify the complete result
let expected: Vec<u32> = vec![0, 80, 104, 138, 214, 235, 258];
let actual: Vec<u32> = a.iter().collect();
assert_eq!(actual, expected, "Subtraction result should match expected values");
}
#[test]
fn xor() {
let mut rb1 = (1..4).collect::<RoaringBitmap>();
let rb2 = (3..6).collect::<RoaringBitmap>();
let rb3 = (1..3).chain(4..6).collect::<RoaringBitmap>();
let rb4 = (0..0).collect::<RoaringBitmap>();
assert_eq!(rb3, &rb1 ^ &rb2);
assert_eq!(rb3, &rb1 ^ rb2.clone());
assert_eq!(rb3, rb1.clone() ^ &rb2);
assert_eq!(rb3, rb1.clone() ^ rb2.clone());
assert_eq!(rb3.len(), rb1.symmetric_difference_len(&rb2));
rb1 ^= &rb2;
assert_eq!(rb3, rb1);
rb1 ^= rb3;
assert_eq!(rb4, rb1);
}
|