lilliput_core/header/
bool.rs

1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6/// Header representing a boolean.
7#[cfg_attr(any(test, feature = "testing"), derive(Arbitrary))]
8#[derive(Copy, Clone, Eq, PartialEq, Debug)]
9pub struct BoolHeader {
10    value: bool,
11}
12
13impl BoolHeader {
14    /// Creates a header from its `value`.
15    #[inline]
16    pub fn new(value: bool) -> Self {
17        Self { value }
18    }
19
20    /// Returns the associated value.
21    #[inline]
22    pub fn value(&self) -> bool {
23        self.value
24    }
25}
26
27impl BoolHeader {
28    pub(crate) const MASK: u8 = 0b0000011;
29    pub(crate) const TYPE_BITS: u8 = 0b0000010;
30
31    pub(crate) const VALUE_BIT: u8 = 0b0000001;
32}
33
34#[cfg(test)]
35mod tests {
36    use proptest::prelude::*;
37    use test_log::test;
38
39    use crate::{
40        config::EncoderConfig,
41        decoder::Decoder,
42        encoder::Encoder,
43        io::{SliceReader, VecWriter},
44    };
45
46    use super::*;
47
48    proptest! {
49        #[test]
50        fn encode_decode_roundtrip(header in BoolHeader::arbitrary(), config in EncoderConfig::arbitrary()) {
51            let mut encoded: Vec<u8> = Vec::new();
52            let writer = VecWriter::new(&mut encoded);
53            let mut encoder = Encoder::new(writer, config);
54            encoder.encode_bool_header(&header).unwrap();
55
56            prop_assert!(encoded.len() == 1);
57
58            let reader = SliceReader::new(&encoded);
59            let mut decoder = Decoder::from_reader(reader);
60            let decoded = decoder.decode_bool_header().unwrap();
61            prop_assert_eq!(&decoded, &header);
62        }
63    }
64}