Skip to main content

numbat_wasm_serde/
lib.rs

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        // serialize
34        let serialized_bytes = to_bytes(&element).unwrap();
35        assert_eq!(serialized_bytes.as_slice(), expected_bytes);
36
37        // deserialize
38        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        // zero
45        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        // unsigned positive
51        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        // signed positive
57        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        // signed negative
63        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            /*opt*/ 1, /*size*/ 0, 0, 0, 3, /*data*/ 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}