lilliput_core/value/
bool.rs

1#[cfg(any(test, feature = "testing"))]
2use proptest::prelude::*;
3#[cfg(any(test, feature = "testing"))]
4use proptest_derive::Arbitrary;
5
6/// Represents a boolean.
7#[cfg_attr(any(test, feature = "testing"), derive(Arbitrary))]
8#[derive(Default, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
9pub struct BoolValue(pub bool);
10
11impl From<bool> for BoolValue {
12    fn from(value: bool) -> Self {
13        Self(value)
14    }
15}
16
17impl From<BoolValue> for bool {
18    fn from(value: BoolValue) -> Self {
19        value.0
20    }
21}
22
23impl std::fmt::Debug for BoolValue {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        write!(f, "{:?}", self.0)
26    }
27}
28
29impl std::fmt::Display for BoolValue {
30    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
31        write!(f, "{}", self.0)
32    }
33}
34
35#[cfg(feature = "serde")]
36impl serde::Serialize for BoolValue {
37    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
38    where
39        S: serde::Serializer,
40    {
41        serializer.serialize_bool(self.0)
42    }
43}
44
45#[cfg(feature = "serde")]
46impl<'de> serde::Deserialize<'de> for BoolValue {
47    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
48    where
49        D: serde::Deserializer<'de>,
50    {
51        Ok(Self(bool::deserialize(deserializer)?))
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use proptest::prelude::*;
58    use test_log::test;
59
60    use crate::{
61        config::EncoderConfig,
62        decoder::Decoder,
63        encoder::Encoder,
64        io::{SliceReader, VecWriter},
65        value::Value,
66    };
67
68    use super::*;
69
70    #[test]
71    fn display() {
72        assert_eq!(format!("{}", BoolValue::from(false)), "false");
73        assert_eq!(format!("{}", BoolValue::from(true)), "true");
74    }
75
76    #[test]
77    fn debug() {
78        assert_eq!(format!("{:?}", BoolValue::from(false)), "false");
79        assert_eq!(format!("{:?}", BoolValue::from(true)), "true");
80
81        assert_eq!(format!("{:#?}", BoolValue::from(false)), "false");
82        assert_eq!(format!("{:#?}", BoolValue::from(true)), "true");
83    }
84
85    proptest! {
86        #[test]
87        fn encode_decode_roundtrip(value in BoolValue::arbitrary(), config in EncoderConfig::arbitrary()) {
88            let mut encoded: Vec<u8> = Vec::new();
89            let writer = VecWriter::new(&mut encoded);
90            let mut encoder = Encoder::new(writer, config);
91            encoder.encode_bool(value.0).unwrap();
92            prop_assert_eq!(encoded.len(), 1);
93
94            prop_assert!(encoded.len() == 1);
95
96            let reader = SliceReader::new(&encoded);
97            let mut decoder = Decoder::from_reader(reader);
98            let decoded = decoder.decode_bool().unwrap();
99            prop_assert_eq!(decoded, value.0);
100
101            let reader = SliceReader::new(&encoded);
102            let mut decoder = Decoder::from_reader(reader);
103            let decoded = decoder.decode_value().unwrap();
104            let Value::Bool(decoded) = decoded else {
105                panic!("expected bool value");
106            };
107            prop_assert_eq!(&decoded, &value);
108        }
109    }
110}