lilliput_core/header/
float.rs1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6#[cfg_attr(any(test, feature = "testing"), derive(Arbitrary))]
8#[derive(Copy, Clone, Eq, PartialEq, Debug)]
9pub struct FloatHeader {
10 #[cfg_attr(
11 any(test, feature = "testing"),
12 proptest(strategy = "(1..=FloatHeader::MAX_VALUE_WIDTH)")
13 )]
14 width: u8,
15}
16
17impl FloatHeader {
18 pub fn new(width: u8) -> Self {
20 assert!(width >= 1);
21 assert!(width <= 8);
22
23 Self { width }
24 }
25
26 pub fn width(&self) -> u8 {
28 self.width
29 }
30}
31
32impl FloatHeader {
33 pub(crate) const MASK: u8 = 0b00001111;
34 pub(crate) const MAX_VALUE_WIDTH: u8 = Self::VALUE_WIDTH_BITS + 1;
35
36 pub(crate) const TYPE_BITS: u8 = 0b00001000;
37
38 pub(crate) const VALUE_WIDTH_BITS: u8 = 0b00000111;
39}
40
41#[cfg(test)]
42mod tests {
43 use proptest::prelude::*;
44 use test_log::test;
45
46 use crate::{
47 config::EncoderConfig,
48 decoder::Decoder,
49 encoder::Encoder,
50 io::{SliceReader, VecWriter},
51 };
52
53 use super::*;
54
55 proptest::proptest! {
56 #[test]
57 fn encode_decode_roundtrip(header in FloatHeader::arbitrary(), config in EncoderConfig::arbitrary()) {
58 let mut encoded: Vec<u8> = Vec::new();
59 let writer = VecWriter::new(&mut encoded);
60 let mut encoder = Encoder::new(writer, config);
61 encoder.encode_float_header(&header).unwrap();
62
63 prop_assert!(encoded.len() == 1);
64
65 let reader = SliceReader::new(&encoded);
66 let mut decoder = Decoder::from_reader(reader);
67 let decoded = decoder.decode_float_header().unwrap();
68 prop_assert_eq!(&decoded, &header);
69 }
70 }
71}