voidmc_codec/primitives/
booleans.rs1use 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}