1#[cfg(test)]
2mod tests {
3 use crate::account::SerializationHelper;
4 use pinocchio::program_error::ProgramError;
5
6 #[test]
7 fn test_i8_serialization() {
8 let mut data = [0u8; 10];
9 let mut offset = 0usize;
10 let value: i8 = -42;
11
12 SerializationHelper::pack_i8(value, &mut data, &mut offset);
13 assert_eq!(offset, 1);
14 assert_eq!(data[0], (-42i8) as u8);
15
16 let mut offset = 0usize;
17 let unpacked = SerializationHelper::unpack_i8(&data, &mut offset).unwrap();
18 assert_eq!(unpacked, value);
19 assert_eq!(offset, 1);
20 }
21
22 #[test]
23 fn test_i16_serialization() {
24 let mut data = [0u8; 10];
25 let mut offset = 0usize;
26 let value: i16 = -12345;
27
28 SerializationHelper::pack_i16(value, &mut data, &mut offset);
29 assert_eq!(offset, 2);
30
31 let mut offset = 0usize;
32 let unpacked = SerializationHelper::unpack_i16(&data, &mut offset).unwrap();
33 assert_eq!(unpacked, value);
34 assert_eq!(offset, 2);
35 }
36
37 #[test]
38 fn test_i32_serialization() {
39 let mut data = [0u8; 10];
40 let mut offset = 0usize;
41 let value: i32 = -123456789;
42
43 SerializationHelper::pack_i32(value, &mut data, &mut offset);
44 assert_eq!(offset, 4);
45
46 let mut offset = 0usize;
47 let unpacked = SerializationHelper::unpack_i32(&data, &mut offset).unwrap();
48 assert_eq!(unpacked, value);
49 assert_eq!(offset, 4);
50 }
51
52 #[test]
53 fn test_bool_serialization() {
54 let mut data = [0u8; 10];
56 let mut offset = 0usize;
57 let value = true;
58
59 SerializationHelper::pack_bool(value, &mut data, &mut offset);
60 assert_eq!(offset, 1);
61 assert_eq!(data[0], 1);
62
63 let mut offset = 0usize;
64 let unpacked = SerializationHelper::unpack_bool(&data, &mut offset).unwrap();
65 assert_eq!(unpacked, value);
66 assert_eq!(offset, 1);
67
68 let mut data = [0u8; 10];
70 let mut offset = 0usize;
71 let value = false;
72
73 SerializationHelper::pack_bool(value, &mut data, &mut offset);
74 assert_eq!(offset, 1);
75 assert_eq!(data[0], 0);
76
77 let mut offset = 0usize;
78 let unpacked = SerializationHelper::unpack_bool(&data, &mut offset).unwrap();
79 assert_eq!(unpacked, value);
80 assert_eq!(offset, 1);
81 }
82
83 #[test]
84 fn test_invalid_bool_value() {
85 let data = [2u8; 10]; let mut offset = 0usize;
87
88 let result = SerializationHelper::unpack_bool(&data, &mut offset);
89 assert!(matches!(result, Err(ProgramError::InvalidAccountData)));
90 }
91
92 #[test]
93 fn test_string_serialization() {
94 let mut data = [0u8; 20];
95 let mut offset = 0usize;
96 let value = "hello";
97
98 SerializationHelper::pack_string(value, &mut data, &mut offset).unwrap();
99 assert_eq!(offset, 9);
101 assert_eq!(data[0..4], [5, 0, 0, 0]);
103 assert_eq!(data[4..9], [104, 101, 108, 108, 111]);
105
106 let mut offset = 0usize;
107 let unpacked = SerializationHelper::unpack_string(&data, &mut offset).unwrap();
108 assert_eq!(unpacked, "hello");
109 assert_eq!(offset, 9);
110 }
111
112 #[test]
113 fn test_vec_serialization() {
114 let mut data = [0u8; 20];
115 let mut offset = 0usize;
116 let value = vec![1u8, 2, 3, 4, 5];
117
118 SerializationHelper::pack_vec(&value, &mut data, &mut offset).unwrap();
119 assert_eq!(offset, 9);
121 assert_eq!(data[0..4], [5, 0, 0, 0]);
123 assert_eq!(data[4..9], [1, 2, 3, 4, 5]);
125
126 let mut offset = 0usize;
127 let unpacked = SerializationHelper::unpack_vec(&data, &mut offset).unwrap();
128 assert_eq!(unpacked, vec![1u8, 2, 3, 4, 5]);
129 assert_eq!(offset, 9);
130 }
131
132 #[test]
133 fn test_empty_string_serialization() {
134 let mut data = [0u8; 10];
135 let mut offset = 0usize;
136 let value = "";
137
138 SerializationHelper::pack_string(value, &mut data, &mut offset).unwrap();
139 assert_eq!(offset, 4);
141 assert_eq!(data[0..4], [0, 0, 0, 0]);
142
143 let mut offset = 0usize;
144 let unpacked = SerializationHelper::unpack_string(&data, &mut offset).unwrap();
145 assert_eq!(unpacked, "");
146 assert_eq!(offset, 4);
147 }
148
149 #[test]
150 fn test_empty_vec_serialization() {
151 let mut data = [0u8; 10];
152 let mut offset = 0usize;
153 let value: Vec<u8> = vec![];
154
155 SerializationHelper::pack_vec(&value, &mut data, &mut offset).unwrap();
156 assert_eq!(offset, 4);
158 assert_eq!(data[0..4], [0, 0, 0, 0]);
159
160 let mut offset = 0usize;
161 let unpacked = SerializationHelper::unpack_vec(&data, &mut offset).unwrap();
162 assert_eq!(unpacked, Vec::<u8>::new());
163 assert_eq!(offset, 4);
164 }
165
166 #[test]
167 fn test_string_serialization_insufficient_space() {
168 let mut data = [0u8; 5]; let mut offset = 0usize;
170 let value = "hello";
171
172 let result = SerializationHelper::pack_string(value, &mut data, &mut offset);
173 assert!(matches!(result, Err(ProgramError::AccountDataTooSmall)));
174 }
175
176 #[test]
177 fn test_vec_serialization_insufficient_space() {
178 let mut data = [0u8; 5]; let mut offset = 0usize;
180 let value = vec![1u8, 2, 3, 4, 5];
181
182 let result = SerializationHelper::pack_vec(&value, &mut data, &mut offset);
183 assert!(matches!(result, Err(ProgramError::AccountDataTooSmall)));
184 }
185
186 #[test]
187 fn test_string_serialization_invalid_utf8() {
188 let mut data = [0u8; 10];
189 data[0..4].copy_from_slice(&5u32.to_le_bytes()); data[4..9].copy_from_slice(&[0xFF, 0xFE, 0xFD, 0xFC, 0xFB]); let mut offset = 0usize;
193 let result = SerializationHelper::unpack_string(&data, &mut offset);
194 assert!(matches!(result, Err(ProgramError::InvalidAccountData)));
195 }
196
197 #[test]
198 fn test_vec_serialization_truncated_data() {
199 let mut data = [0u8; 6]; data[0..4].copy_from_slice(&10u32.to_le_bytes()); data[4..6].copy_from_slice(&[1, 2]); let mut offset = 0usize;
204 let result = SerializationHelper::unpack_vec(&data, &mut offset);
205 assert!(matches!(result, Err(ProgramError::InvalidAccountData)));
206 }
207}