#![deny(missing_docs, unsafe_code)]
use wire_repr::wire_repr;
wire_repr! {
pub layout SequentialBits {
field flags: U8 { position: 1; projections {
bit enabled: 0;
bits mode: 1..=3;
bit r#type: 4;
} }
}
pub absolute layout AbsoluteBits {
field flags: BeU16 { offset: 2; projections {
bit high: 15;
bits low: 0..=3;
} }
}
pub layout LittleBits {
field flags: LeU16 { position: 1; projections {
bit low: 0;
bit high: 15;
} }
}
pub layout Narrow24 {
field top_flags: BeU24 { position: 1; projections {
bit top: 23;
} }
field all_flags: BeU24 { position: 2; projections {
bits all: 0..=23;
} }
}
pub absolute layout Wide {
field value: LeU128 { offset: 0; projections {
bits all: 0..=127;
} }
}
}
#[test]
fn sequential_storage_and_projections_are_both_available() {
let parsed = SequentialBitsView::parse_exact(&[0b0001_1011]);
let view = match parsed {
Ok(value) => value,
Err(error) => panic!("valid sequential layout was rejected: {error}"),
};
assert_eq!(view.flags(), 0b0001_1011);
assert!(view.enabled());
assert_eq!(view.mode(), 5);
assert!(view.r#type());
}
#[test]
fn absolute_and_little_endian_use_semantic_lsb_numbering() {
let absolute = AbsoluteBitsView::parse_exact(&[0xaa, 0xbb, 0x80, 0x09]);
let absolute = match absolute {
Ok(value) => value,
Err(error) => panic!("valid absolute layout was rejected: {error}"),
};
assert_eq!(absolute.as_bytes(), &[0xaa, 0xbb, 0x80, 0x09]);
assert_eq!(absolute.flags(), 0x8009);
assert!(absolute.high());
assert_eq!(absolute.low(), 9);
let little = LittleBitsView::parse_exact(&[0x01, 0x80]);
let little = match little {
Ok(value) => value,
Err(error) => panic!("valid little-endian layout was rejected: {error}"),
};
assert_eq!(little.flags(), 0x8001);
assert!(little.low());
assert!(little.high());
}
#[test]
fn u24_and_u128_ranges_normalize_without_high_bits() {
let narrow = Narrow24View::parse_exact(&[0x80, 0x00, 0x00, 0x80, 0x00, 0x01]);
let narrow = match narrow {
Ok(value) => value,
Err(error) => panic!("valid U24 layout was rejected: {error}"),
};
assert!(narrow.top());
assert_eq!(narrow.all(), 0x0080_0001);
let bytes = [0xff; 16];
let wide = WideView::parse_exact(&bytes);
let wide = match wide {
Ok(value) => value,
Err(error) => panic!("valid U128 layout was rejected: {error}"),
};
assert_eq!(wide.all(), u128::MAX);
}
#[test]
fn parsing_and_errors_remain_owned_by_storage() {
assert!(matches!(
SequentialBitsView::parse_exact(&[]),
Err(SequentialBitsError::InputTooShort {
expected: 1,
actual: 0
})
));
assert!(matches!(
SequentialBitsView::parse_exact(&[1, 2]),
Err(SequentialBitsError::TrailingBytes {
expected: 1,
actual: 2
})
));
assert!(SequentialBitsView::parse_exact(&[0]).is_ok());
}