arrow2 0.7.1

Unofficial implementation of Apache Arrow spec in safe Rust
Documentation
mod bitmap_ops;
mod immutable;
mod mutable;
mod utils;

use proptest::prelude::*;

use arrow2::{bitmap::Bitmap, buffer::MutableBuffer};

/// Returns a strategy of an arbitrary sliced [`Bitmap`] of size up to 1000
pub(crate) fn bitmap_strategy() -> impl Strategy<Value = Bitmap> {
    prop::collection::vec(any::<bool>(), 1..1000)
        .prop_flat_map(|vec| {
            let len = vec.len();
            (Just(vec), 0..len)
        })
        .prop_flat_map(|(vec, index)| {
            let len = vec.len();
            (Just(vec), Just(index), 0..len - index)
        })
        .prop_flat_map(|(vec, index, len)| {
            let bitmap = Bitmap::from(&vec);
            let bitmap = bitmap.slice(index, len);
            Just(bitmap)
        })
}

fn create_bitmap<P: AsRef<[u8]>>(bytes: P, len: usize) -> Bitmap {
    let buffer = MutableBuffer::<u8>::from(bytes.as_ref());
    Bitmap::from_u8_buffer(buffer, len)
}

#[test]
fn eq() {
    let lhs = create_bitmap([0b01101010], 8);
    let rhs = create_bitmap([0b01001110], 8);
    assert!(lhs != rhs);
}

#[test]
fn eq_len() {
    let lhs = create_bitmap([0b01101010], 6);
    let rhs = create_bitmap([0b00101010], 6);
    assert!(lhs == rhs);
    let rhs = create_bitmap([0b00001010], 6);
    assert!(lhs != rhs);
}

#[test]
fn eq_slice() {
    let lhs = create_bitmap([0b10101010], 8).slice(1, 7);
    let rhs = create_bitmap([0b10101011], 8).slice(1, 7);
    assert!(lhs == rhs);

    let lhs = create_bitmap([0b10101010], 8).slice(2, 6);
    let rhs = create_bitmap([0b10101110], 8).slice(2, 6);
    assert!(lhs != rhs);
}

#[test]
fn and() {
    let lhs = create_bitmap([0b01101010], 8);
    let rhs = create_bitmap([0b01001110], 8);
    let expected = create_bitmap([0b01001010], 8);
    assert_eq!(&lhs & &rhs, expected);
}

#[test]
fn or_large() {
    let input: &[u8] = &[
        0b00000000, 0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000,
        0b01000010, 0b11111111,
    ];
    let input1: &[u8] = &[
        0b00000000, 0b00000001, 0b10000000, 0b10000000, 0b10000000, 0b10000000, 0b10000000,
        0b10000000, 0b11111111,
    ];
    let expected: &[u8] = &[
        0b00000000, 0b00000001, 0b10000010, 0b10000100, 0b10001000, 0b10010000, 0b10100000,
        0b11000010, 0b11111111,
    ];

    let lhs = create_bitmap(input, 62);
    let rhs = create_bitmap(input1, 62);
    let expected = create_bitmap(expected, 62);
    assert_eq!(&lhs | &rhs, expected);
}

#[test]
fn and_offset() {
    let lhs = create_bitmap([0b01101011], 8).slice(1, 7);
    let rhs = create_bitmap([0b01001111], 8).slice(1, 7);
    let expected = create_bitmap([0b01001010], 8).slice(1, 7);
    assert_eq!(&lhs & &rhs, expected);
}

#[test]
fn or() {
    let lhs = create_bitmap([0b01101010], 8);
    let rhs = create_bitmap([0b01001110], 8);
    let expected = create_bitmap([0b01101110], 8);
    assert_eq!(&lhs | &rhs, expected);
}

#[test]
fn not() {
    let lhs = create_bitmap([0b01101010], 6);
    let expected = create_bitmap([0b00010101], 6);
    assert_eq!(!&lhs, expected);
}