lilliput_core/value/
bool.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(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}