use std::collections::HashMap;
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use serde_json::to_value;
use crate::to_bytes;
use super::*;
#[track_caller]
fn rtt<X: Serialize + PartialEq + std::fmt::Debug>(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::<serde_json::Value>(&b).unwrap());
// println!("{b:?}");
let f = from_bytes::<X>(&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::<u8, u16>::from_iter([(1, 5), (4, 2)]));
rtt(Some(4));
rtt(None::<u8>);
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<HashMap<u16, f32>>,
}
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<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
y: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
z: Option<u32>,
}
rtt(A {
x: Some(4),
y: None,
z: Some(5),
});
}