pub mod data; pub mod transient_0; #[cfg(test)] mod test { use std::io::Cursor; use super::data::{EnumWithVariants, InnerStruct, OuterStruct, StructWithBool, StructWithInt32, StructWithInt64, StructWithList, StructWithOption, StructWithString, SumWithVariants, VariantOne, VariantTwo }; #[test] fn struct_with_bool() { let value = StructWithBool { a: true, b: false }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_bool, super::data::transient_0::decode_struct_with_bool, ); } #[test] fn struct_with_int_32() { let value = StructWithInt32 { a: 10, b: 25 }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_int_32, super::data::transient_0::decode_struct_with_int_32, ); } #[test] fn struct_with_int_64() { let value = StructWithInt64 { a: 10, b: 25 }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_int_64, super::data::transient_0::decode_struct_with_int_64, ); } #[test] fn struct_with_string() { let value = StructWithString { a: "abc".to_string(), b: "def".to_string() }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_string, super::data::transient_0::decode_struct_with_string, ); } #[test] fn nested_struct() { let value = OuterStruct { inner: InnerStruct { a: 10, b: 25 }, c: 42 }; assert_round_trip_encoding( value, super::data::transient_0::encode_outer_struct, super::data::transient_0::decode_outer_struct, ); } #[test] fn struct_with_list() { let value = StructWithList { a: vec![10, 25], b: vec![ InnerStruct { a: 42, b: 47 }, InnerStruct { a: 52, b: 57 }, InnerStruct { a: 62, b: 67 }, ], }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_list, super::data::transient_0::decode_struct_with_list, ); } #[test] fn struct_with_option_none() { let value = StructWithOption { a: None, b: None, }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_option, super::data::transient_0::decode_struct_with_option, ); } #[test] fn struct_with_option_some() { let value = StructWithOption { a: Some(10), b: Some(InnerStruct { a: 42, b: 47 }), }; assert_round_trip_encoding( value, super::data::transient_0::encode_struct_with_option, super::data::transient_0::decode_struct_with_option, ); } #[test] fn enum_with_variants() { assert_round_trip_encoding( EnumWithVariants::Zero, super::data::transient_0::encode_enum_with_variants, super::data::transient_0::decode_enum_with_variants, ); assert_round_trip_encoding( EnumWithVariants::One, super::data::transient_0::encode_enum_with_variants, super::data::transient_0::decode_enum_with_variants, ); assert_round_trip_encoding( EnumWithVariants::Two, super::data::transient_0::encode_enum_with_variants, super::data::transient_0::decode_enum_with_variants, ); } #[test] fn sum_with_variants() { assert_round_trip_encoding( SumWithVariants::VariantOne(VariantOne { a: 10 }), super::data::transient_0::encode_sum_with_variants, super::data::transient_0::decode_sum_with_variants, ); assert_round_trip_encoding( SumWithVariants::VariantTwo(VariantTwo { a: 25 }), super::data::transient_0::encode_sum_with_variants, super::data::transient_0::decode_sum_with_variants, ); } fn assert_round_trip_encoding( value: T, encode: impl Fn(&T, &mut Cursor>) -> std::io::Result<()>, decode: impl Fn(&mut Cursor>) -> std::io::Result, ) { let mut bytes = Cursor::new(Vec::new()); encode(&value, &mut bytes).unwrap(); bytes.set_position(0); let decoded_value = decode(&mut bytes).unwrap(); assert_eq!(value, decoded_value); } }