Skip to main content

voidmc_codec/primitives/
booleans.rs

1use crate::{Decode, DecodeError, Encode};
2
3impl Encode for bool {
4    fn encode(&self, buf: &mut Vec<u8>) {
5        buf.push(if *self { 1 } else { 0 });
6    }
7}
8
9impl Decode for bool {
10    fn decode(buf: &mut &[u8]) -> Result<Self, DecodeError> {
11        if buf.is_empty() {
12            return Err(DecodeError::UnexpectedEof);
13        }
14
15        let value = buf[0] != 0;
16        *buf = &buf[1..];
17        Ok(value)
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    #[test]
26    fn test_bool_true() {
27        let value = true;
28        let mut buf = Vec::new();
29        value.encode(&mut buf);
30        assert_eq!(buf, vec![1]);
31
32        let mut slice = buf.as_slice();
33        let decoded = bool::decode(&mut slice).unwrap();
34        assert_eq!(decoded, value);
35    }
36
37    #[test]
38    fn test_bool_false() {
39        let value = false;
40        let mut buf = Vec::new();
41        value.encode(&mut buf);
42        assert_eq!(buf, vec![0]);
43
44        let mut slice = buf.as_slice();
45        let decoded = bool::decode(&mut slice).unwrap();
46        assert_eq!(decoded, value);
47    }
48
49    #[test]
50    fn test_bool_exact_encoding() {
51        let mut buf = Vec::new();
52        true.encode(&mut buf);
53        assert_eq!(buf, vec![1]);
54
55        buf.clear();
56        false.encode(&mut buf);
57        assert_eq!(buf, vec![0]);
58    }
59
60    #[test]
61    fn test_bool_only_zero_decodes_false() {
62        let mut slice = &[0u8][..];
63        let decoded = bool::decode(&mut slice).unwrap();
64        assert!(!decoded);
65    }
66
67    #[test]
68    fn test_bool_non_zero_decodes_true() {
69        for byte in 1u8..=255u8 {
70            let mut slice = &[byte][..];
71            let decoded = bool::decode(&mut slice).unwrap();
72            assert!(decoded, "byte {} should decode to true", byte);
73        }
74    }
75
76    #[test]
77    fn test_bool_sequence() {
78        let values = [true, false, true, true, false];
79        let mut buf = Vec::new();
80        for &val in &values {
81            val.encode(&mut buf);
82        }
83
84        assert_eq!(buf.len(), 5);
85        assert_eq!(buf, vec![1, 0, 1, 1, 0]);
86    }
87}