bv 0.11.1

Bit-vectors and bit-slices
Documentation
use super::*;

#[test]
fn bit_slicing() {
    let v: BitVec<u8> = bit_vec![ false, true, true, false, true, false, false, true,
                                  true, false, false, true, false, true, true, false ];
    assert!( !v.get_bit(0) );
    assert!(  v.get_bit(1) );
    assert!(  v.get_bit(2) );
    assert!( !v.get_bit(3) );

    let w = v.bit_slice(2..14);
    assert_eq!( w.bit_len(), 12 );

    assert!(  w.get_bit(0) );
    assert!( !w.get_bit(1) );

    assert_eq!( w.get_bits(2, 4), 0b00001001 );
    assert_eq!( w.get_bits(2, 5), 0b00011001 );
    assert_eq!( w.get_bits(2, 8), 0b10011001 );
    assert_eq!( w.get_bits(3, 8), 0b01001100 );

    assert_eq!( w.get_block(0), 0b01100101 );
    assert_eq!( w.get_block(1), 0b00001010 );
}

#[test]
fn resize() {
    let mut v: BitVec<u8> = bit_vec![ true; 13 ];
    assert_eq!( v.len(), 13 );

    v.resize(50, false);
    assert_eq!( v.len(), 50 );
    assert_eq!( v.get_bit(12), true );
    assert_eq!( v.get_bit(13), false );
    assert_eq!( v.get_bit(49), false );

    v.resize(67, true);
    assert_eq!( v.len(), 67 );
    assert_eq!( v.get_bit(12), true );
    assert_eq!( v.get_bit(13), false );
    assert_eq!( v.get_bit(49), false );
    assert_eq!( v.get_bit(50), true );
    assert_eq!( v.get_bit(66), true );

    v.set_bit(3, false);
    assert_eq!( v.get_bit(3), false );

    v.resize(17, false);
    assert_eq!( v.len(), 17 );
    assert_eq!( v.get_bit(1), true );
    assert_eq!( v.get_bit(2), true );
    assert_eq!( v.get_bit(3), false );
    assert_eq!( v.get_bit(4), true );
    assert_eq!( v.get_bit(16), false );
}

#[test]
fn shrink_to_fit() {
    let mut v: BitVec<u8> = BitVec::with_capacity(100);
    assert_eq!( v.capacity(), 104 );

    v.push(true);
    v.push(false);
    assert_eq!( v.len(), 2 );
    assert_eq!( v.capacity(), 104 );

    v.shrink_to_fit();
    assert_eq!( v.len(), 2 );
    assert_eq!( v.capacity(), 8 );
}

#[test]
fn into_boxed_slice() {
    let v: BitVec<u8> = bit_vec![ true, false, true ];
    assert_eq!( v.capacity(), 8 );
    let bs = v.into_boxed_slice();
    assert_eq!( bs.len(), 1 );
    assert_eq!( bs[0], 0b00000101 );
}

#[test]
fn truncate() {
    let mut v: BitVec<u8> = BitVec::new_fill(true, 80);
    assert_eq!( v.len(), 80 );
    assert_eq!( v.get_bit(34), true );

    v.truncate(45);
    assert_eq!( v.len(), 45 );
    assert_eq!( v.get_bit(34), true );
}

#[test]
fn as_mut_slice() {
    let mut v: BitVec<u8> = BitVec::new_fill(true, 77);
    let w = v.as_mut_slice();
    assert_eq!( w.len(), 77 );
    assert_eq!( w.get_block(0), 0b11111111 );
}

#[test]
fn pop() {
    let mut v: BitVec<u8> = bit_vec![true, false, true];
    assert_eq!( v.pop(), Some(true) );
    assert_eq!( v.pop(), Some(false) );
    assert_eq!( v.pop(), Some(true) );
    assert_eq!( v.pop(), None );
}

#[test]
fn clear_and_is_empty() {
    let mut v: BitVec<u8> = bit_vec![true, false, true];
    assert_eq!( v.len(), 3 );
    assert!( !v.is_empty() );
    v.clear();
    assert_eq!( v.len(), 0 );
    assert!( v.is_empty() );
}

#[test]
fn push_bit_and_pop_bit() {
    let mut v: BitVec<u8> = BitVec::new();
    v.push_bit(true);
    v.push_bit(false);
    assert_eq!( v.pop_bit(), Some(false) );
    assert_eq!( v.pop_bit(), Some(true) );
    assert_eq!( v.pop_bit(), None );
}

#[test]
fn set_through_slice() {
    let mut v: BitVec<u8> = bit_vec![true, false, true];

    {
        let mut w = v.as_mut_slice().bit_slice(1..2);
        assert_eq!(w.get_block(0), 0);
        w.set_bit(0, true);
    }

    assert_eq!(v, bit_vec![true, true, true] );
}

#[test]
fn set_bits_one_block_fastpath() {
    let mut v: BitVec<u8> = bit_vec![false; 8];
    v.set_bits(2, 4, 0b1111);
    assert_eq!( v.get_block(0), 0b00111100 );
}

#[test]
fn from_bits() {
    let mut bits = vec![true; 20];
    bits[3] = false;
    let bv = BitVec::from_bits(&bits);
    assert_eq!( bv.len(), 20 );
    assert!(  bv[0] );
    assert!(  bv[1] );
    assert!(  bv[2] );
    assert!( !bv[3] );
    assert!(  bv[4] );
    assert!(  bv[19] );
}

#[test]
fn from_bits_slice() {
    let mut bits: BitVec = bit_vec![true; 20];
    bits.set_bit(3, false);
    let slice = bits.bit_slice(1..);
    let bv = BitVec::from_bits(&slice);
    assert_eq!( bv.len(), 19 );
    assert!(  bv[0] );
    assert!(  bv[1] );
    assert!( !bv[2] );
    assert!(  bv[3] );
    assert!(  bv[18] );
}

#[test]
fn disequality() {
    let bv1: BitVec = bit_vec![true, true, false];
    let bv2         = bit_vec![true, true];
    assert_ne!( bv1, bv2 );
}

#[test]
fn mixed_equality() {
    let bv: BitVec<u8> = bit_vec![true, false, true];
    let array: &[bool] = &[true, false, true];
    assert_eq!( bv, array );
}