bencode inspired tight self describing serialization format
Diffstat (limited to 'src/de/tests.rs')
-rw-r--r--src/de/tests.rs101
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),
+ });
+}