bva 0.4.1

bva is a rust crate for manipulating and doing arithmetics on bit vectors of fixed but arbitrary size.
Documentation
use crate::auto::Bv;
use crate::dynamic::Bvd;
use crate::fixed::Bvf;
use crate::tests::{bvf_inner_unroll_cap, random_test_bv};
use crate::{Bit, BitVector, ConvertionError};

fn display_inner<B: BitVector>(capacity: usize) {
    for size in 1..capacity {
        let (bv, bi) = random_test_bv::<B>(size);
        assert_eq!(format!("{}", &bv), format!("{}", &bi));
        assert_eq!(format!("{:010}", &bv), format!("{:010}", &bi));
        assert_eq!(format!("{:b}", &bv), format!("{:b}", &bi));
        assert_eq!(format!("{:#b}", &bv), format!("{:#b}", &bi));
        assert_eq!(format!("{:#0200b}", &bv), format!("{:#0200b}", &bi));
        assert_eq!(format!("{:o}", &bv), format!("{:o}", &bi));
        assert_eq!(format!("{:#o}", &bv), format!("{:#o}", &bi));
        assert_eq!(format!("{:#0100o}", &bv), format!("{:#0100o}", &bi));
        assert_eq!(format!("{:x}", &bv), format!("{:x}", &bi));
        assert_eq!(format!("{:#x}", &bv), format!("{:#x}", &bi));
        assert_eq!(format!("{:#050x}", &bv), format!("{:#050x}", &bi));
        assert_eq!(format!("{:X}", &bv), format!("{:X}", &bi));
        assert_eq!(format!("{:#X}", &bv), format!("{:#X}", &bi));
        assert_eq!(format!("{:#050X}", &bv), format!("{:#050X}", &bi));
    }
}

#[test]
fn display_bit() {
    assert_eq!(format!("{}", Bit::Zero), "0");
    assert_eq!(format!("{}", Bit::One), "1");
}

#[test]
fn display_bvf() {
    bvf_inner_unroll_cap!(display_inner, {u8, u16, u32, u64, u128}, {1, 2, 3, 4, 5});
}

#[test]
fn display_bvd() {
    display_inner::<Bvd>(512);
}

#[test]
fn display_bv() {
    display_inner::<Bv>(512);
}

fn from_string_inner<B: BitVector>(capacity: usize) {
    for size in 1..capacity {
        let (bv, bi) = random_test_bv::<B>(size);
        assert_eq!(B::from_binary(&format!("{:b}", &bi)).unwrap(), bv);
        assert_eq!(B::from_binary(&format!("{:b}", &bv)).unwrap(), bv);
        assert_eq!(B::from_hex(&format!("{:x}", &bi)).unwrap(), bv);
        assert_eq!(B::from_hex(&format!("{:x}", &bv)).unwrap(), bv);
        assert_eq!(B::from_hex(&format!("{:X}", &bi)).unwrap(), bv);
        assert_eq!(B::from_hex(&format!("{:X}", &bv)).unwrap(), bv);
    }

    assert_eq!(
        B::from_binary("000x"),
        Err(ConvertionError::InvalidFormat(3))
    );
    assert_eq!(B::from_hex("0t"), Err(ConvertionError::InvalidFormat(1)));
}

#[test]
fn from_string_bvf() {
    bvf_inner_unroll_cap!(from_string_inner, {u8, u16, u32, u64, u128}, {1, 2, 3, 4, 5});
    assert_eq!(
        Bvf::<u8, 1>::from_binary("0000000001"),
        Err(ConvertionError::NotEnoughCapacity)
    );
    assert_eq!(
        Bvf::<u16, 1>::from_hex("abcde"),
        Err(ConvertionError::NotEnoughCapacity)
    );
}

#[test]
fn from_string_bvd() {
    from_string_inner::<Bvd>(512);
}

#[test]
fn from_string_bv() {
    from_string_inner::<Bv>(512);
}