1use std::any::type_name;
2use std::fmt::Debug;
3use std::io;
4
5use crate::codec::Codec;
6
7pub fn test_codec<D: Codec + PartialEq + Debug>(
9 encoded_bytes: &[u8],
10 v: &D,
11) -> Result<(), io::Error> {
12 let correct_str = String::from_utf8_lossy(encoded_bytes);
14 println!("correct data: {}", correct_str);
15
16 let mes = format!("Type: {} encoded data: {:?}", type_name::<D>(), correct_str);
17
18 {
20 let mut b = Vec::new();
21 let n = v.encode(&mut b)?;
22 assert_eq!(n, b.len(), "output len, {}", &mes);
23 assert_eq!(b, encoded_bytes, "output data, {}", &mes);
24 }
25
26 {
29 let b = encoded_bytes.to_vec();
30 let decoded = D::decode(&mut b.as_slice())?;
31 assert_eq!(v, &decoded, "decode, {}", &mes);
32 }
33
34 for i in 0..encoded_bytes.len() {
36 let mut corrupted = encoded_bytes.to_vec();
37 corrupted[i] = corrupted[i].wrapping_add(1);
38
39 let res = D::decode(&mut corrupted.as_slice());
40 assert!(
41 res.is_err(),
42 "change {}-th byte for type {}; the correct encoded data is: {}",
43 i,
44 type_name::<D>(),
45 correct_str
46 );
47 }
48
49 Ok(())
50}