]> git.lizzy.rs Git - mt_net.git/blob - tests/random.rs
Tweak random tests
[mt_net.git] / tests / random.rs
1 use libtest_mimic::{Arguments, Trial};
2
3 use mt_net::{generate_random::GenerateRandomVariant, rand, ToCltPkt, ToSrvPkt};
4 use mt_ser::{DefCfg, MtDeserialize, MtSerialize};
5 use std::{error::Error, fmt::Debug};
6
7 fn test_reserialize<T>(type_name: &'static str) -> impl Iterator<Item = Trial>
8 where
9     T: MtSerialize + MtDeserialize + GenerateRandomVariant + PartialEq + Debug,
10 {
11     (0..T::num_variants()).map(move |i| {
12         Trial::test(format!("{type_name}::{}", T::variant_name(i)), move || {
13             let mut rng = rand::thread_rng();
14
15             for _ in 0..100 {
16                 let input = T::generate_random_variant(&mut rng, i);
17
18                 let mut writer = Vec::new();
19                 input
20                     .mt_serialize::<DefCfg>(&mut writer)
21                     .map_err(|e| format!("serialize error: {e}\ninput: {input:?}"))?;
22
23                 let mut reader = std::io::Cursor::new(writer);
24                 let output = T::mt_deserialize::<DefCfg>(&mut reader).map_err(|e| {
25                     format!(
26                         "deserialize error: {e}\ninput: {input:?}\npayload: {:?}",
27                         reader.get_ref()
28                     )
29                 })?;
30
31                 if input != output {
32                     return Err(format!(
33                         "output did not match input\n\
34                                                 input: {input:?}\n\
35                                                 payload: {:?}\n\
36                                                 output: {output:?}",
37                         reader.get_ref(),
38                     )
39                     .into());
40                 }
41             }
42
43             Ok(())
44         })
45         .with_kind("random")
46     })
47 }
48
49 fn main() -> Result<(), Box<dyn Error>> {
50     let args = Arguments::from_args();
51     let tests = test_reserialize::<ToSrvPkt>("ToSrvPkt")
52         .chain(test_reserialize::<ToCltPkt>("ToCltPkt"))
53         .collect();
54     libtest_mimic::run(&args, tests).exit();
55 }