use std::collections::HashMap; use serde::{Deserialize, Serialize}; use crate::to_bytes; use super::*; #[track_caller] fn rtt(x: X) where X: for<'a> Deserialize<'a>, { let b = to_bytes(&x).unwrap(); for &ch in &b { if ch.is_ascii_alphabetic() { print!("{},", ch as char); } else { print!("{ch},"); } } println!("{:x?}", b); dbg!(from_bytes::(&b).unwrap()); // println!("{b:?}"); let f = from_bytes::(&b).unwrap_or_else(|e| { println!("{e}"); panic!() }); assert_eq!(f, x); } #[test] fn basic() { rtt(4); rtt([1, 2, 3, 4]); rtt((1, 2, 3)); rtt(("hello".to_string(), 5, vec![1, 2, 3])); rtt(HashMap::::from_iter([(1, 5), (4, 2)])); rtt(Some(4)); rtt(None::); rtt(-1); rtt(-487); let x: &str = from_bytes(&to_bytes(&"hi").unwrap()).unwrap(); } #[test] fn structs() { #[derive(Serialize, Deserialize, Debug, PartialEq)] struct Y { abra: u32, bada: u16, hocu: Vec>, } rtt(Y { abra: 4, bada: 5, hocu: vec![ HashMap::from_iter([(1, 5.0), (41, 41.0)]), HashMap::default(), ], }); #[derive(Serialize, Deserialize, Debug, PartialEq)] struct Z(u32); rtt(Z(4515161)); #[derive(Serialize, Deserialize, Debug, PartialEq)] struct A; rtt(A); } #[test] fn enums() { #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] enum E { Unit, Newtype(u32), Tuple(u32, u32), Struct { a: u32 }, } rtt(E::Unit); rtt(E::Newtype(51)); rtt(E::Tuple(1, 24151561)); rtt(E::Struct { a: 1 }); } #[test] fn postcard_fails_these() { #[derive(Serialize, Deserialize, Debug, PartialEq, Eq)] struct A { #[serde(skip_serializing_if = "Option::is_none")] x: Option, #[serde(skip_serializing_if = "Option::is_none")] y: Option, #[serde(skip_serializing_if = "Option::is_none")] z: Option, } rtt(A { x: Some(4), y: None, z: Some(5), }); }