Skip to main content

spl_pod/
primitives.rs

1//! Primitive types that can be used in `Pod`s.
2//!
3//! These are re-exported from [`solana_zero_copy::unaligned`].
4#[cfg(not(target_arch = "bpf"))]
5pub use solana_zero_copy::unaligned::U128 as PodU128;
6pub use solana_zero_copy::unaligned::{
7    Bool as PodBool, I16 as PodI16, I64 as PodI64, U16 as PodU16, U32 as PodU32, U64 as PodU64,
8};
9
10#[cfg(test)]
11mod tests {
12    use {super::*, crate::bytemuck::pod_from_bytes};
13
14    #[test]
15    fn test_pod_bool() {
16        assert!(pod_from_bytes::<PodBool>(&[]).is_err());
17        assert!(pod_from_bytes::<PodBool>(&[0, 0]).is_err());
18
19        for i in 0..=u8::MAX {
20            assert_eq!(i != 0, bool::from(pod_from_bytes::<PodBool>(&[i]).unwrap()));
21        }
22    }
23
24    #[cfg(feature = "serde-traits")]
25    #[test]
26    fn test_pod_bool_serde() {
27        let pod_false: PodBool = false.into();
28        let pod_true: PodBool = true.into();
29
30        let serialized_false = serde_json::to_string(&pod_false).unwrap();
31        let serialized_true = serde_json::to_string(&pod_true).unwrap();
32        assert_eq!(&serialized_false, "false");
33        assert_eq!(&serialized_true, "true");
34
35        let deserialized_false = serde_json::from_str::<PodBool>(&serialized_false).unwrap();
36        let deserialized_true = serde_json::from_str::<PodBool>(&serialized_true).unwrap();
37        assert_eq!(pod_false, deserialized_false);
38        assert_eq!(pod_true, deserialized_true);
39    }
40
41    #[test]
42    fn test_pod_u16() {
43        assert!(pod_from_bytes::<PodU16>(&[]).is_err());
44        assert_eq!(1u16, u16::from(*pod_from_bytes::<PodU16>(&[1, 0]).unwrap()));
45    }
46
47    #[cfg(feature = "serde-traits")]
48    #[test]
49    fn test_pod_u16_serde() {
50        let pod_u16: PodU16 = u16::MAX.into();
51
52        let serialized = serde_json::to_string(&pod_u16).unwrap();
53        assert_eq!(&serialized, "65535");
54
55        let deserialized = serde_json::from_str::<PodU16>(&serialized).unwrap();
56        assert_eq!(pod_u16, deserialized);
57    }
58
59    #[test]
60    fn test_pod_i16() {
61        assert!(pod_from_bytes::<PodI16>(&[]).is_err());
62        assert_eq!(
63            -1i16,
64            i16::from(*pod_from_bytes::<PodI16>(&[255, 255]).unwrap())
65        );
66    }
67
68    #[cfg(feature = "serde-traits")]
69    #[test]
70    fn test_pod_i16_serde() {
71        let pod_i16: PodI16 = i16::MAX.into();
72
73        println!("pod_i16 {:?}", pod_i16);
74
75        let serialized = serde_json::to_string(&pod_i16).unwrap();
76        assert_eq!(&serialized, "32767");
77
78        let deserialized = serde_json::from_str::<PodI16>(&serialized).unwrap();
79        assert_eq!(pod_i16, deserialized);
80    }
81
82    #[test]
83    fn test_pod_u64() {
84        assert!(pod_from_bytes::<PodU64>(&[]).is_err());
85        assert_eq!(
86            1u64,
87            u64::from(*pod_from_bytes::<PodU64>(&[1, 0, 0, 0, 0, 0, 0, 0]).unwrap())
88        );
89    }
90
91    #[cfg(feature = "serde-traits")]
92    #[test]
93    fn test_pod_u64_serde() {
94        let pod_u64: PodU64 = u64::MAX.into();
95
96        let serialized = serde_json::to_string(&pod_u64).unwrap();
97        assert_eq!(&serialized, "18446744073709551615");
98
99        let deserialized = serde_json::from_str::<PodU64>(&serialized).unwrap();
100        assert_eq!(pod_u64, deserialized);
101    }
102
103    #[test]
104    fn test_pod_i64() {
105        assert!(pod_from_bytes::<PodI64>(&[]).is_err());
106        assert_eq!(
107            -1i64,
108            i64::from(
109                *pod_from_bytes::<PodI64>(&[255, 255, 255, 255, 255, 255, 255, 255]).unwrap()
110            )
111        );
112    }
113
114    #[cfg(feature = "serde-traits")]
115    #[test]
116    fn test_pod_i64_serde() {
117        let pod_i64: PodI64 = i64::MAX.into();
118
119        let serialized = serde_json::to_string(&pod_i64).unwrap();
120        assert_eq!(&serialized, "9223372036854775807");
121
122        let deserialized = serde_json::from_str::<PodI64>(&serialized).unwrap();
123        assert_eq!(pod_i64, deserialized);
124    }
125
126    #[cfg(not(target_arch = "bpf"))]
127    #[test]
128    fn test_pod_u128() {
129        assert!(pod_from_bytes::<PodU128>(&[]).is_err());
130        assert_eq!(
131            1u128,
132            u128::from(
133                *pod_from_bytes::<PodU128>(&[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
134                    .unwrap()
135            )
136        );
137    }
138
139    #[cfg(all(feature = "serde-traits", not(target_arch = "bpf")))]
140    #[test]
141    fn test_pod_u128_serde() {
142        let pod_u128: PodU128 = u128::MAX.into();
143
144        let serialized = serde_json::to_string(&pod_u128).unwrap();
145        assert_eq!(&serialized, "340282366920938463463374607431768211455");
146
147        let deserialized = serde_json::from_str::<PodU128>(&serialized).unwrap();
148        assert_eq!(pod_u128, deserialized);
149    }
150
151    #[cfg(feature = "wincode")]
152    mod wincode_tests {
153        use {super::*, test_case::test_case};
154
155        #[test_case(PodBool::from_bool(true))]
156        #[test_case(PodBool::from_bool(false))]
157        #[test_case(PodU16::from_primitive(u16::MAX))]
158        #[test_case(PodI16::from_primitive(i16::MIN))]
159        #[test_case(PodU32::from_primitive(u32::MAX))]
160        #[test_case(PodU64::from_primitive(u64::MAX))]
161        #[test_case(PodI64::from_primitive(i64::MIN))]
162        #[cfg(not(target_arch = "bpf"))]
163        #[test_case(PodU128::from_primitive(u128::MAX))]
164        fn wincode_roundtrip<
165            T: PartialEq
166                + std::fmt::Debug
167                + for<'de> wincode::SchemaRead<'de, wincode::config::DefaultConfig, Dst = T>
168                + wincode::SchemaWrite<wincode::config::DefaultConfig, Src = T>,
169        >(
170            pod: T,
171        ) {
172            let bytes = wincode::serialize(&pod).unwrap();
173            let deserialized: T = wincode::deserialize(&bytes).unwrap();
174            assert_eq!(pod, deserialized);
175        }
176    }
177}