Documentation
use bitfi::{bitfield, BitField};

#[cfg(test)]
extern crate std;

bitfield! {
    TestBf = u16 {
        on: 2;
        love : 0 ..= 1;
    }

    TestB2 = u32 {
        love : 0 ..= 1;
        love2 : 2 ..= 4;
        war: 5 ..= 8 [mut = false];
    }
}

#[test]
fn test_simple() {
    let mut bf = TestBf::default();

    for i in 0..16 {
        assert!(!bf.get_bit(i), "Joder {i} {:b}", bf.0);
        bf.set_bit(i);
        assert!(bf.get_bit(i), "Joder {i} {:b}", bf.0);
    }
}

#[test]
fn test_ranges() {
    let mut bf = TestB2::new(0);

    assert_eq!(bf.get_love(), 0);
    bf.set_love(0b11);
    assert_eq!(bf.get_love(), 0b11);

    bf.set_love(0b10);
    assert_eq!(bf.get_love(), 0b10);

    bf.set_love(0b01);
    assert_eq!(bf.get_love(), 0b01);

    bf.set_love2(0b101);

    assert_eq!(bf.get_inner(), 0b10101, "{:b} {:b}", bf.get_inner(), 0b10101);
}

#[test]
fn nums() {
    let mut n = 0;

    n.set_bit_range(0..=1, 0b11);
    n.set_bit_range(2..=3, 0b10);

    assert_eq!(n, 0b1011, "{n:b} {:b}", 0b1011);

    let br = n.get_bit_range(0..=1);
    assert_eq!(br, 0b11, "{br:b} {:b}", 0b11);

    let br = n.get_bit_range(2..=3);
    assert_eq!(br, 0b10, "{br:b} {:b}", 0b10);
}