use super::*;
use crate::perf_and_test_utils::{gen_strictly_increasing_sequence, negate_vector};
pub fn test_rank1(ds: &RSNarrow, bv: &BitVector) {
for (rank, pos) in bv.ones().enumerate() {
let result = ds.rank1(pos);
assert_eq!(result, Some(rank));
let result = ds.rank1(pos + 1);
dbg!(pos + 1, rank);
assert_eq!(result, Some(rank + 1));
}
let result = ds.rank1(bv.len() + 1);
assert_eq!(result, None);
}
#[test]
fn test_empty() {
let bv = BitVector::default();
let rs = RSNarrow::new(bv);
assert_eq!(rs.rank1(0), None);
assert_eq!(rs.rank1(100), None);
}
#[test]
fn test_l2_bound() {
let vv: Vec<usize> = vec![0, 12, 33, 42, 55, 61, 62, 63, 128, 129, 254, 511];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
test_rank1(&rs, &rs.bv);
}
#[test]
fn test_n() {
let vv: Vec<usize> = vec![0, 12, 33, 42, 55, 61, 62, 63];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
assert_eq!(rs.rank1(64), Some(8));
}
#[test]
fn test_l1_bound() {
let vv: Vec<usize> = vec![0, 12, 33, 42, 55, 61, 62, 63, 128, 129, 254, 512 * 128 - 1];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
test_rank1(&rs, &rs.bv);
}
#[test]
fn test_large_random() {
let vv = gen_strictly_increasing_sequence(1024 * 4, 1 << 20);
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
test_rank1(&rs, &rs.bv);
}
#[test]
fn test_select1() {
let vv: Vec<usize> = vec![3, 5, 8, 128, 129, 513];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
println!("{:?}", rs.bv);
println!("{:?}", rs.block_rank_pairs);
let i = 5;
let selected = rs.select1(i).unwrap();
println!("select1({}) = {}", i, selected);
let j = selected;
println!("rank1({}) = {}", j, rs.rank1(j).unwrap());
}
#[test]
fn test_select0() {
let vv: Vec<usize> = vec![0, 5, 8, 128, 129, 513];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
println!("{:?}", rs.bv);
println!("{:?}", rs.block_rank_pairs);
let i = 0;
let selected = rs.select0(i).unwrap();
println!("select0({}) = {}", i, selected);
let j = selected;
println!("rank0({}) = {}", j, rs.rank0(j).unwrap());
}
#[test]
fn test_select0_big() {
let vv: Vec<usize> = vec![
3, 5, 8, 128, 129, 513, 1000, 1024, 1025, 4096, 7500, 7600, 7630, 7680, 8000, 8001, 10000,
];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
let zeros_vector = negate_vector(&vv);
for (i, &el) in zeros_vector.iter().enumerate() {
let selected = rs.select0(i);
assert_eq!(selected, Some(el));
}
}
#[test]
fn test_select1_big() {
let vv: Vec<usize> = vec![
3, 5, 8, 128, 129, 513, 1000, 1024, 1025, 4096, 7500, 7600, 7630, 7680, 8000, 8001, 10000,
];
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
for (i, &el) in vv.iter().enumerate() {
let selected = rs.select1(i);
assert_eq!(selected, Some(el));
}
}
#[test]
fn test_random_select1() {
let vv: Vec<usize> = gen_strictly_increasing_sequence(10000, 1 << 20);
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
for (i, &el) in vv.iter().enumerate() {
let selected = rs.select1(i);
assert_eq!(selected, Some(el));
}
}
#[test]
fn test_random_select0() {
let vv: Vec<usize> = gen_strictly_increasing_sequence(10000, 1 << 20);
let bv: BitVector = vv.iter().copied().collect();
let rs = RSNarrow::new(bv);
let zeros_vector = negate_vector(&vv);
for (i, &el) in zeros_vector.iter().enumerate() {
let selected = rs.select0(i);
assert_eq!(selected, Some(el));
}
}