1pub mod decoder;
2pub mod encoder;
3
4#[test]
5fn test_encode_numbers_little() {
6 let to_encode_numbers = &[
7 encoder::EncodeType::Int8(-10),
8 encoder::EncodeType::Int16(-2212),
9 encoder::EncodeType::Int32(-2123453),
10 encoder::EncodeType::Int64(-23334232333),
11 encoder::EncodeType::Int128(-456784564567848),
12 encoder::EncodeType::Uint8(122),
13 encoder::EncodeType::Int16(2212),
14 encoder::EncodeType::Int32(2123453),
15 encoder::EncodeType::Int64(23334232333),
16 encoder::EncodeType::Uint128(456784564567848),
17 ];
18
19 let decoded_expected_numbers = &[
20 decoder::DecodedData::Int8(-10),
21 decoder::DecodedData::Int16(-2212),
22 decoder::DecodedData::Int32(-2123453),
23 decoder::DecodedData::Int64(-23334232333),
24 decoder::DecodedData::Int128(-456784564567848),
25 decoder::DecodedData::Uint8(122),
26 decoder::DecodedData::Int16(2212),
27 decoder::DecodedData::Int32(2123453),
28 decoder::DecodedData::Int64(23334232333),
29 decoder::DecodedData::Uint128(456784564567848),
30 ];
31
32 let decoded_expected_types = &[
33 decoder::DecodeType::Int8,
34 decoder::DecodeType::Int16,
35 decoder::DecodeType::Int32,
36 decoder::DecodeType::Int64,
37 decoder::DecodeType::Int128,
38 decoder::DecodeType::Uint8,
39 decoder::DecodeType::Int16,
40 decoder::DecodeType::Int32,
41 decoder::DecodeType::Int64,
42 decoder::DecodeType::Uint128,
43 ];
44
45 let encoded_data_result =
47 encoder::encode_packed(to_encode_numbers, encoder::EncodeOrder::Little);
48
49 assert_eq!(encoded_data_result.is_ok(), true);
50
51 let encoded_data = encoded_data_result.unwrap();
53 assert_eq!(encoded_data.len(), 31 * 2);
54
55 let decoded_data_result = decoder::decode_packed(
57 decoded_expected_types,
58 &encoded_data,
59 decoder::DecodeOrder::Little,
60 );
61
62 assert_eq!(decoded_data_result.is_ok(), true);
63
64 let decoded_data = decoded_data_result.unwrap();
66 for (idx, entry) in decoded_data.iter().enumerate() {
67 assert_eq!(*entry == decoded_expected_numbers[idx], true);
68 }
69}
70
71#[test]
72fn test_encode_numbers_big() {
73 let to_encode_numbers = &[
74 encoder::EncodeType::Int8(-10),
75 encoder::EncodeType::Int16(-2212),
76 encoder::EncodeType::Int32(-2123453),
77 encoder::EncodeType::Int64(-23334232333),
78 encoder::EncodeType::Int128(-456784564567848),
79 encoder::EncodeType::Uint8(122),
80 encoder::EncodeType::Int16(2212),
81 encoder::EncodeType::Int32(2123453),
82 encoder::EncodeType::Int64(23334232333),
83 encoder::EncodeType::Uint128(456784564567848),
84 ];
85
86 let decoded_expected_numbers = &[
87 decoder::DecodedData::Int8(-10),
88 decoder::DecodedData::Int16(-2212),
89 decoder::DecodedData::Int32(-2123453),
90 decoder::DecodedData::Int64(-23334232333),
91 decoder::DecodedData::Int128(-456784564567848),
92 decoder::DecodedData::Uint8(122),
93 decoder::DecodedData::Int16(2212),
94 decoder::DecodedData::Int32(2123453),
95 decoder::DecodedData::Int64(23334232333),
96 decoder::DecodedData::Uint128(456784564567848),
97 ];
98
99 let decoded_expected_types = &[
100 decoder::DecodeType::Int8,
101 decoder::DecodeType::Int16,
102 decoder::DecodeType::Int32,
103 decoder::DecodeType::Int64,
104 decoder::DecodeType::Int128,
105 decoder::DecodeType::Uint8,
106 decoder::DecodeType::Int16,
107 decoder::DecodeType::Int32,
108 decoder::DecodeType::Int64,
109 decoder::DecodeType::Uint128,
110 ];
111
112 let encoded_data_result = encoder::encode_packed(to_encode_numbers, encoder::EncodeOrder::Big);
114
115 assert_eq!(encoded_data_result.is_ok(), true);
116
117 let encoded_data = encoded_data_result.unwrap();
119 assert_eq!(encoded_data.len(), 31 * 2);
120
121 let decoded_data_result = decoder::decode_packed(
123 decoded_expected_types,
124 &encoded_data,
125 decoder::DecodeOrder::Big,
126 );
127
128 assert_eq!(decoded_data_result.is_ok(), true);
129
130 let decoded_data = decoded_data_result.unwrap();
132 for (idx, entry) in decoded_data.iter().enumerate() {
133 assert_eq!(*entry == decoded_expected_numbers[idx], true);
134 }
135}
136
137#[test]
138fn test_strings_and_bytes() {
139 let to_encode_data = &[
140 encoder::EncodeType::Str("hello".to_string()),
141 encoder::EncodeType::Bytes(vec![0, 1, 2, 3, 4]),
142 encoder::EncodeType::Bytes(vec![0, 10, 20, 30]),
143 encoder::EncodeType::Str("world!!".to_string()),
144 ];
145
146 let expected_decoded_data = &[
147 decoder::DecodedData::Str("hello".to_string()),
148 decoder::DecodedData::Bytes(vec![0, 1, 2, 3, 4]),
149 decoder::DecodedData::Bytes(vec![0, 10, 20, 30]),
150 decoder::DecodedData::Str("world!!".to_string()),
151 ];
152
153 let decoded_data_types = &[
154 decoder::DecodeType::Str(5),
155 decoder::DecodeType::Bytes(5),
156 decoder::DecodeType::Bytes(4),
157 decoder::DecodeType::Str(7),
158 ];
159
160 let encoded_result = encoder::encode_packed(to_encode_data, encoder::EncodeOrder::Little);
161
162 assert_eq!(encoded_result.is_ok(), true);
163 let encoded_data = encoded_result.unwrap();
164
165 assert_eq!(encoded_data.len(), 21);
166
167 let decoded_result = decoder::decode_packed(
169 decoded_data_types,
170 &encoded_data,
171 decoder::DecodeOrder::Little,
172 );
173 assert_eq!(decoded_result.is_ok(), true);
174
175 let decoded_data = decoded_result.unwrap();
176
177 for (idx, element) in decoded_data.iter().enumerate() {
178 assert_eq!(*element == expected_decoded_data[idx], true);
179 }
180}
181
182#[test]
183fn encode_decode_mixed() {
184 let to_encode = &[
185 encoder::EncodeType::Int128(-234984564544),
186 encoder::EncodeType::Str("this-is-good".to_owned()),
187 encoder::EncodeType::Uint64(837477899),
188 encoder::EncodeType::Int8(10),
189 encoder::EncodeType::Bytes(vec![0xff, 0xab, 0x12, 0x33]),
190 ];
191
192 let encoded_result = encoder::encode_packed(to_encode, encoder::EncodeOrder::Little);
193 assert_eq!(encoded_result.is_ok(), true);
194
195 let encoded_data = encoded_result.unwrap();
196
197 let to_decode = &[
198 decoder::DecodeType::Int128,
199 decoder::DecodeType::Str(12),
200 decoder::DecodeType::Uint64,
201 decoder::DecodeType::Int8,
202 decoder::DecodeType::Bytes(4),
203 ];
204
205 let expected_decoded_data = &[
206 decoder::DecodedData::Int128(-234984564544),
207 decoder::DecodedData::Str("this-is-good".to_owned()),
208 decoder::DecodedData::Uint64(837477899),
209 decoder::DecodedData::Int8(10),
210 decoder::DecodedData::Bytes(vec![0xff, 0xab, 0x12, 0x33]),
211 ];
212
213 let decoded_result =
214 decoder::decode_packed(to_decode, &encoded_data, decoder::DecodeOrder::Little);
215 assert_eq!(decoded_result.is_ok(), true);
216
217 let decoded_data = decoded_result.unwrap();
218
219 for (idx, element) in decoded_data.iter().enumerate() {
220 assert_eq!(*element == expected_decoded_data[idx], true);
221 }
222}
223
224#[test]
225fn test_struct_interoperability() {
226 #[repr(C, packed)]
227 struct Sample {
228 pub x: u8,
229 pub y: [u8; 5],
230 pub z: i64,
231 pub a: [char; 5],
232 }
233
234 let to_encode = &[
235 encoder::EncodeType::Uint8(100),
236 encoder::EncodeType::Bytes(vec![0, 1, 2, 3, 4]),
237 encoder::EncodeType::Int64(256),
238 encoder::EncodeType::Str("hello".to_owned()),
239 ];
240
241 let encode_result = encoder::encode_packed(to_encode, encoder::EncodeOrder::Little);
242 assert_eq!(encode_result.is_ok(), true);
243
244 let encoded_data = encode_result.unwrap();
245
246 unsafe {
247 let sample: *const Sample = encoded_data.as_ptr() as *const Sample;
248 assert_eq!((*sample).x == 100, true);
249 assert_eq!((*sample).y == [0, 1, 2, 3, 4], true);
250 assert_eq!((*sample).z == 256, true);
251 }
252}