diff options
author | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-02-10 15:53:15 +0100 |
---|---|---|
committer | Lizzy Fleckenstein <eliasfleckenstein@web.de> | 2023-02-10 15:53:15 +0100 |
commit | 6c875082474431a39596b1547b436a9bec1f5533 (patch) | |
tree | bafa770893e6a5a1daea8b57cc5a3f3574da3cb6 /tests/random.rs | |
download | mt_net-6c875082474431a39596b1547b436a9bec1f5533.tar.xz |
Initial commit
Diffstat (limited to 'tests/random.rs')
-rw-r--r-- | tests/random.rs | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/tests/random.rs b/tests/random.rs new file mode 100644 index 0000000..4d2ad42 --- /dev/null +++ b/tests/random.rs @@ -0,0 +1,49 @@ +use libtest_mimic::{Arguments, Failed, Trial}; + +use mt_net::{generate_random::GenerateRandomVariant, rand, ToCltPkt, ToSrvPkt}; +use mt_ser::{DefCfg, MtDeserialize, MtSerialize}; +use std::{error::Error, fmt::Debug}; + +fn test_reserialize<T>(type_name: &'static str) -> impl Iterator<Item = Trial> +where + T: MtSerialize + MtDeserialize + GenerateRandomVariant + PartialEq + Debug, +{ + (0..T::num_variants()).map(move |i| { + Trial::test(format!("{type_name}::{}", T::variant_name(i)), move || { + let mut rng = rand::thread_rng(); + + for _ in 0..100 { + let input = T::generate_random_variant(&mut rng, i); + + let mut writer = Vec::new(); + input + .mt_serialize::<DefCfg>(&mut writer) + .map_err(|e| format!("serialize error: {e}\ninput: {input:?}"))?; + + let mut reader = std::io::Cursor::new(writer); + let output = T::mt_deserialize::<DefCfg>(&mut reader) + .map_err(|e| format!("deserialize error: {e}\ninput: {input:?}"))?; + + if input != output { + return Err(format!( + "output did not match input\n\ + input: {input:?}\n\ + output: {output:?}", + ) + .into()); + } + } + + Ok(()) + }) + .with_kind("random") + }) +} + +fn main() -> Result<(), Box<dyn Error>> { + let args = Arguments::from_args(); + let tests = test_reserialize::<ToSrvPkt>("ToSrvPkt") + .chain(test_reserialize::<ToCltPkt>("ToCltPkt")) + .collect(); + libtest_mimic::run(&args, tests).exit(); +} |