chapa 0.1.2

Bitfield structs, batteries included!
Documentation
use chapa::bitfield;

#[bitfield(u16, order = lsb0)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct StatusReg {
    #[bits(0..=3)]
    low_nibble: u8,
    #[bits(12..=15)]
    high_nibble: u8,
}

#[test]
fn new_is_zero() {
    let r = StatusReg::new();
    assert_eq!(r.raw(), 0);
}

#[test]
fn with_low_nibble() {
    let r = StatusReg::new().with_low_nibble(0xA);
    assert_eq!(r.raw(), 0x000A);
    assert_eq!(r.low_nibble(), 0xA);
    assert_eq!(r.high_nibble(), 0);
}

#[test]
fn with_high_nibble() {
    let r = StatusReg::new().with_high_nibble(0xB);
    assert_eq!(r.raw(), 0xB000);
    assert_eq!(r.high_nibble(), 0xB);
    assert_eq!(r.low_nibble(), 0);
}

#[test]
fn round_trip() {
    let r = StatusReg::new().with_low_nibble(0x5).with_high_nibble(0xC);
    assert_eq!(r.raw(), 0xC005);
    assert_eq!(r.low_nibble(), 0x5);
    assert_eq!(r.high_nibble(), 0xC);
}

#[test]
fn from_raw() {
    let r = StatusReg::from_raw(0xF00F);
    assert_eq!(r.low_nibble(), 0xF);
    assert_eq!(r.high_nibble(), 0xF);
}

#[test]
fn set_mutate() {
    let mut r = StatusReg::new();
    r.set_low_nibble(3);
    r.set_high_nibble(7);
    assert_eq!(r.low_nibble(), 3);
    assert_eq!(r.high_nibble(), 7);
}

#[test]
fn all_ones() {
    let r = StatusReg::from_raw(0xFFFF);
    assert_eq!(r.low_nibble(), 0xF);
    assert_eq!(r.high_nibble(), 0xF);
}