bincode/tests/serde.rs

128 lines
3.3 KiB
Rust

#![cfg(all(feature = "serde", feature = "alloc", feature = "derive"))]
extern crate alloc;
use alloc::string::String;
use bincode::config::Configuration;
use serde_derive::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, bincode::Encode, bincode::Decode)]
#[serde(crate = "serde_incl")]
pub struct SerdeRoundtrip {
pub a: u32,
#[serde(skip)]
pub b: u32,
}
#[test]
fn test_serde_round_trip() {
// validate serde attribute working
let json = serde_json::to_string(&SerdeRoundtrip { a: 5, b: 5 }).unwrap();
assert_eq!("{\"a\":5}", json);
let result: SerdeRoundtrip = serde_json::from_str(&json).unwrap();
assert_eq!(result.a, 5);
assert_eq!(result.b, 0);
// validate bincode working
let bytes =
bincode::encode_to_vec(SerdeRoundtrip { a: 15, b: 15 }, Configuration::standard()).unwrap();
assert_eq!(bytes, &[15, 15]);
let result: SerdeRoundtrip =
bincode::decode_from_slice(&bytes, Configuration::standard()).unwrap();
assert_eq!(result.a, 15);
assert_eq!(result.b, 15);
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(crate = "serde_incl")]
pub struct SerdeWithBorrowedData<'a> {
pub a: u32,
#[serde(skip)]
pub b: u32,
pub str: &'a str,
}
#[test]
fn test_serialize_deserialize_borrowed_data() {
let input = SerdeWithBorrowedData {
a: 5,
b: 5,
str: "Hello world",
};
#[rustfmt::skip]
let expected = &[
5, // a
// b is skipped
11, // str length
b'H', b'e', b'l', b'l', b'o', b' ', b'w', b'o', b'r', b'l', b'd' // str
];
let mut result = [0u8; 20];
let len =
bincode::serde_encode_to_slice(&input, &mut result, Configuration::standard()).unwrap();
let result = &result[..len];
assert_eq!(result, expected);
let result = bincode::serde_encode_to_vec(&input, Configuration::standard()).unwrap();
assert_eq!(result, expected);
let output: SerdeWithBorrowedData =
bincode::serde_decode_borrowed_from_slice(&result, Configuration::standard()).unwrap();
assert_eq!(
SerdeWithBorrowedData {
b: 0, // remember: b is skipped
..input
},
output
);
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
#[serde(crate = "serde_incl")]
pub struct SerdeWithOwnedData {
pub a: u32,
#[serde(skip)]
pub b: u32,
pub str: String,
}
#[test]
fn test_serialize_deserialize_owned_data() {
let input = SerdeWithOwnedData {
a: 5,
b: 5,
str: String::from("Hello world"),
};
#[rustfmt::skip]
let expected = &[
5, // a
// b is skipped
11, // str length
b'H', b'e', b'l', b'l', b'o', b' ', b'w', b'o', b'r', b'l', b'd' // str
];
let mut result = [0u8; 20];
let len =
bincode::serde_encode_to_slice(&input, &mut result, Configuration::standard()).unwrap();
let result = &result[..len];
assert_eq!(result, expected);
let result = bincode::serde_encode_to_vec(&input, Configuration::standard()).unwrap();
assert_eq!(result, expected);
let output: SerdeWithOwnedData =
bincode::serde_decode_from_slice(&result, Configuration::standard()).unwrap();
assert_eq!(
SerdeWithOwnedData {
b: 0, // remember: b is skipped
..input
},
output
);
}