1#![no_std]
2
3extern crate alloc;
4
5mod bytes_de;
6mod bytes_err;
7mod bytes_ser;
8
9pub use bytes_de::{bytes_to_number, from_bytes};
10pub use bytes_err::SDError;
11pub use bytes_ser::{to_bytes, u64_to_bytes};
12
13#[cfg(test)]
14pub mod tests {
15 use super::*;
16 use alloc::vec::Vec;
17 use core::fmt::Debug;
18 use serde::{Deserialize, Serialize};
19
20 pub fn the_same<V>(element: V)
21 where
22 V: serde::Serialize + serde::de::DeserializeOwned + PartialEq + Debug + 'static,
23 {
24 let serialized_bytes = to_bytes(&element).unwrap();
25 let deserialized: V = from_bytes(serialized_bytes.as_slice()).unwrap();
26 assert_eq!(deserialized, element);
27 }
28
29 pub fn check_top_encode_decode<V>(element: V, expected_bytes: &[u8])
30 where
31 V: serde::Serialize + serde::de::DeserializeOwned + PartialEq + Debug + 'static,
32 {
33 let serialized_bytes = to_bytes(&element).unwrap();
35 assert_eq!(serialized_bytes.as_slice(), expected_bytes);
36
37 let deserialized: V = from_bytes(serialized_bytes.as_slice()).unwrap();
39 assert_eq!(deserialized, element);
40 }
41
42 #[test]
43 fn test_top_compacted_numbers() {
44 check_top_encode_decode(0u8, &[]);
46 check_top_encode_decode(0u16, &[]);
47 check_top_encode_decode(0u32, &[]);
48 check_top_encode_decode(0u64, &[]);
49 check_top_encode_decode(0usize, &[]);
50 check_top_encode_decode(5u8, &[5]);
52 check_top_encode_decode(5u16, &[5]);
53 check_top_encode_decode(5u32, &[5]);
54 check_top_encode_decode(5u64, &[5]);
55 check_top_encode_decode(5usize, &[5]);
56 check_top_encode_decode(5i8, &[5]);
58 check_top_encode_decode(5i16, &[5]);
59 check_top_encode_decode(5i32, &[5]);
60 check_top_encode_decode(5i64, &[5]);
61 check_top_encode_decode(5isize, &[5]);
62 check_top_encode_decode(-5i8, &[251]);
64 check_top_encode_decode(-5i16, &[251]);
65 check_top_encode_decode(-5i32, &[251]);
66 check_top_encode_decode(-5i64, &[251]);
67 check_top_encode_decode(-5isize, &[251]);
68 }
69
70 #[test]
71 fn test_top_compacted_bool() {
72 check_top_encode_decode(true, &[1]);
73 check_top_encode_decode(false, &[]);
74 }
75
76 #[test]
77 fn test_top_bytes_compacted() {
78 check_top_encode_decode(Vec::<u8>::new(), &[]);
79 check_top_encode_decode([1u8, 2u8, 3u8].to_vec(), &[1u8, 2u8, 3u8]);
80 }
81
82 #[test]
83 fn test_vec_i32_compacted() {
84 let v = [1i32, 2i32, 3i32].to_vec();
85 let expected: &[u8] = &[0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3];
86 check_top_encode_decode(v, expected);
87 }
88
89 #[test]
90 fn test_option_vec_i32() {
91 let some_v = Some([1i32, 2i32, 3i32].to_vec());
92 let expected: &[u8] = &[
93 1, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0,
94 0, 3,
95 ];
96 check_top_encode_decode(some_v, expected);
97
98 let none_v: Option<Vec<i32>> = None;
99 check_top_encode_decode(none_v, &[0]);
100 }
101
102 #[test]
103 fn test_struct() {
104 #[derive(Serialize, Deserialize, PartialEq, Debug)]
105 struct Test {
106 int: u16,
107 seq: Vec<u8>,
108 another_byte: u8,
109 }
110
111 let test = Test {
112 int: 1,
113 seq: [5, 6].to_vec(),
114 another_byte: 7,
115 };
116 the_same(test);
117 }
118
119 #[test]
120 fn test_wrapped_array() {
121 #[derive(Serialize, Deserialize, PartialEq, Debug, Clone, Copy)]
122 struct WrappedArray([u8; 5]);
123
124 let wa = WrappedArray([1, 2, 3, 4, 5]);
125 check_top_encode_decode(wa, &[1, 2, 3, 4, 5]);
126
127 let mut v: Vec<WrappedArray> = Vec::new();
128 v.push(wa);
129 v.push(WrappedArray([6, 7, 8, 9, 0]));
130 check_top_encode_decode(v, &[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]);
131 }
132}