workflow_serializer/
tests.rs

1#[allow(clippy::module_inception)]
2#[cfg(test)]
3mod tests {
4
5    use crate::prelude::{load, store, Deserializer, Serializable, Serializer};
6    use crate::result::IoResult;
7    use borsh::{BorshDeserialize, BorshSerialize};
8
9    #[derive(BorshSerialize, BorshDeserialize, Debug, PartialEq)]
10    struct MyStruct {
11        field1: u32,
12        field2: String,
13    }
14
15    #[test]
16    fn test_serializer_store_and_load() -> Result<(), Box<dyn std::error::Error>> {
17        let value = MyStruct {
18            field1: 42,
19            field2: String::from("Hello, world!"),
20        };
21
22        // Serialize (store)
23        let mut buffer = Vec::new();
24        store!(MyStruct, &value, &mut buffer)?;
25
26        // Deserialize (load)
27        let deserialized_value: MyStruct = load!(MyStruct, &mut buffer.as_slice())?;
28
29        // Assert the original and deserialized values are the same
30        assert_eq!(value, deserialized_value);
31
32        Ok(())
33    }
34
35    struct MyVersionedStruct {
36        field1: u32,
37        field2: String,
38        field3: bool,
39    }
40
41    impl Serializer for MyVersionedStruct {
42        fn serialize<W: std::io::Write>(&self, writer: &mut W) -> std::io::Result<()> {
43            // Serialize the version
44            store!(u32, &1, writer)?;
45            // Serialize the fields
46            store!(u32, &self.field1, writer)?;
47            store!(String, &self.field2, writer)?;
48            store!(bool, &self.field3, writer)?;
49
50            Ok(())
51        }
52    }
53
54    impl Deserializer for MyVersionedStruct {
55        fn deserialize<R: std::io::Read>(reader: &mut R) -> IoResult<Self> {
56            // Deserialize the version
57            let version: u32 = load!(u32, reader)?;
58            // Deserialize the fields
59            let field1: u32 = load!(u32, reader)?;
60            let field2: String = load!(String, reader)?;
61            let field3: bool = load!(bool, reader)?;
62
63            assert_eq!(version, 1);
64
65            Ok(Self {
66                field1,
67                field2,
68                field3,
69            })
70        }
71    }
72
73    #[test]
74    fn test_serializer_versioning() -> Result<(), Box<dyn std::error::Error>> {
75        let value = MyVersionedStruct {
76            field1: 42,
77            field2: String::from("Hello, world!"),
78            field3: true,
79        };
80
81        let serializable = Serializable(value);
82        let mut buffer = Vec::new();
83        borsh::BorshSerialize::serialize(&serializable, &mut buffer)?;
84
85        let deserialized: Serializable<MyVersionedStruct> =
86            borsh::BorshDeserialize::deserialize(&mut buffer.as_slice())?;
87        let deserialized_value = deserialized.into_inner();
88
89        // assert_eq!(version, 1);
90        assert_eq!(deserialized_value.field1, 42);
91        assert!(deserialized_value.field2 == "Hello, world!");
92        assert!(deserialized_value.field3);
93
94        Ok(())
95    }
96}