bencode inspired tight self describing serialization format
Diffstat (limited to 'src/de/tests.rs')
| -rw-r--r-- | src/de/tests.rs | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/de/tests.rs b/src/de/tests.rs new file mode 100644 index 0000000..746d5b3 --- /dev/null +++ b/src/de/tests.rs @@ -0,0 +1,101 @@ +use std::collections::HashMap; + +use lsp_types::{CompletionRegistrationOptions, CompletionResponse}; +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},"); + } + } + 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), + }); +} |