summaryrefslogtreecommitdiffstats
path: root/third_party/rust/bincode/tests
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:47:29 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 01:47:29 +0000
commit0ebf5bdf043a27fd3dfb7f92e0cb63d88954c44d (patch)
treea31f07c9bcca9d56ce61e9a1ffd30ef350d513aa /third_party/rust/bincode/tests
parentInitial commit. (diff)
downloadfirefox-esr-0ebf5bdf043a27fd3dfb7f92e0cb63d88954c44d.tar.xz
firefox-esr-0ebf5bdf043a27fd3dfb7f92e0cb63d88954c44d.zip
Adding upstream version 115.8.0esr.upstream/115.8.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/bincode/tests')
-rw-r--r--third_party/rust/bincode/tests/test.rs899
1 files changed, 899 insertions, 0 deletions
diff --git a/third_party/rust/bincode/tests/test.rs b/third_party/rust/bincode/tests/test.rs
new file mode 100644
index 0000000000..23d65f48a3
--- /dev/null
+++ b/third_party/rust/bincode/tests/test.rs
@@ -0,0 +1,899 @@
+#[macro_use]
+extern crate serde_derive;
+
+extern crate bincode;
+#[macro_use]
+extern crate serde;
+extern crate serde_bytes;
+
+use std::borrow::Cow;
+use std::collections::HashMap;
+use std::fmt::{self, Debug};
+use std::result::Result as StdResult;
+
+use bincode::{
+ deserialize, deserialize_from, deserialize_in_place, serialize, serialized_size,
+ DefaultOptions, ErrorKind, Options, Result,
+};
+use serde::de::{Deserialize, DeserializeSeed, Deserializer, SeqAccess, Visitor};
+
+const LEN_SIZE: u64 = 8;
+
+fn the_same_impl<V, O>(element: V, options: &mut O)
+where
+ V: serde::Serialize + serde::de::DeserializeOwned + PartialEq + Debug + 'static,
+ O: Options,
+{
+ let size = options.serialized_size(&element).unwrap();
+
+ {
+ let encoded = options.serialize(&element).unwrap();
+ let decoded: V = options.deserialize(&encoded[..]).unwrap();
+ let decoded_reader = options.deserialize_from(&mut &encoded[..]).unwrap();
+
+ assert_eq!(element, decoded);
+ assert_eq!(element, decoded_reader);
+ assert_eq!(size, encoded.len() as u64);
+ }
+}
+
+fn the_same<V>(element: V)
+where
+ V: serde::Serialize + serde::de::DeserializeOwned + PartialEq + Debug + Clone + 'static,
+{
+ // add a new macro which calls the previous when you add a new option set
+ macro_rules! all_endians {
+ ($element:expr, $options:expr) => {
+ the_same_impl($element.clone(), &mut $options.with_native_endian());
+ the_same_impl($element.clone(), &mut $options.with_big_endian());
+ the_same_impl($element.clone(), &mut $options.with_little_endian());
+ };
+ }
+
+ macro_rules! all_integer_encodings {
+ ($element:expr, $options:expr) => {
+ all_endians!($element, $options.with_fixint_encoding());
+ all_endians!($element, $options.with_varint_encoding());
+ };
+ }
+
+ all_integer_encodings!(element, DefaultOptions::new());
+}
+
+#[test]
+fn test_numbers() {
+ // unsigned positive
+ the_same(5u8);
+ the_same(5u16);
+ the_same(5u32);
+ the_same(5u64);
+ the_same(5usize);
+ // signed positive
+ the_same(5i8);
+ the_same(5i16);
+ the_same(5i32);
+ the_same(5i64);
+ the_same(5isize);
+ // signed negative
+ the_same(-5i8);
+ the_same(-5i16);
+ the_same(-5i32);
+ the_same(-5i64);
+ the_same(-5isize);
+ // floating
+ the_same(-100f32);
+ the_same(0f32);
+ the_same(5f32);
+ the_same(-100f64);
+ the_same(5f64);
+}
+
+serde_if_integer128! {
+ #[test]
+ fn test_numbers_128bit() {
+ // unsigned positive
+ the_same(5u128);
+ the_same(u128::max_value());
+ // signed positive
+ the_same(5i128);
+ the_same(i128::max_value());
+ // signed negative
+ the_same(-5i128);
+ the_same(i128::min_value());
+ }
+}
+
+#[test]
+fn test_string() {
+ the_same("".to_string());
+ the_same("a".to_string());
+}
+
+#[test]
+fn test_tuple() {
+ the_same((1isize,));
+ the_same((1isize, 2isize, 3isize));
+ the_same((1isize, "foo".to_string(), ()));
+}
+
+#[test]
+fn test_basic_struct() {
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ struct Easy {
+ x: isize,
+ s: String,
+ y: usize,
+ }
+ the_same(Easy {
+ x: -4,
+ s: "foo".to_string(),
+ y: 10,
+ });
+}
+
+#[test]
+fn test_nested_struct() {
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ struct Easy {
+ x: isize,
+ s: String,
+ y: usize,
+ }
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ struct Nest {
+ f: Easy,
+ b: usize,
+ s: Easy,
+ }
+
+ the_same(Nest {
+ f: Easy {
+ x: -1,
+ s: "foo".to_string(),
+ y: 20,
+ },
+ b: 100,
+ s: Easy {
+ x: -100,
+ s: "bar".to_string(),
+ y: 20,
+ },
+ });
+}
+
+#[test]
+fn test_struct_newtype() {
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ struct NewtypeStr(usize);
+
+ the_same(NewtypeStr(5));
+}
+
+#[test]
+fn test_struct_tuple() {
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ struct TubStr(usize, String, f32);
+
+ the_same(TubStr(5, "hello".to_string(), 3.2));
+}
+
+#[test]
+fn test_option() {
+ the_same(Some(5usize));
+ the_same(Some("foo bar".to_string()));
+ the_same(None::<usize>);
+}
+
+#[test]
+fn test_enum() {
+ #[derive(Serialize, Deserialize, PartialEq, Debug, Clone)]
+ enum TestEnum {
+ NoArg,
+ OneArg(usize),
+ Args(usize, usize),
+ AnotherNoArg,
+ StructLike { x: usize, y: f32 },
+ }
+ the_same(TestEnum::NoArg);
+ the_same(TestEnum::OneArg(4));
+ //the_same(TestEnum::Args(4, 5));
+ the_same(TestEnum::AnotherNoArg);
+ the_same(TestEnum::StructLike { x: 4, y: 3.14159 });
+ the_same(vec![
+ TestEnum::NoArg,
+ TestEnum::OneArg(5),
+ TestEnum::AnotherNoArg,
+ TestEnum::StructLike { x: 4, y: 1.4 },
+ ]);
+}
+
+#[test]
+fn test_vec() {
+ let v: Vec<u8> = vec![];
+ the_same(v);
+ the_same(vec![1u64]);
+ the_same(vec![1u64, 2, 3, 4, 5, 6]);
+}
+
+#[test]
+fn test_map() {
+ let mut m = HashMap::new();
+ m.insert(4u64, "foo".to_string());
+ m.insert(0u64, "bar".to_string());
+ the_same(m);
+}
+
+#[test]
+fn test_bool() {
+ the_same(true);
+ the_same(false);
+}
+
+#[test]
+fn test_unicode() {
+ the_same("å".to_string());
+ the_same("aåååååååa".to_string());
+}
+
+#[test]
+fn test_fixed_size_array() {
+ the_same([24u32; 32]);
+ the_same([1u64, 2, 3, 4, 5, 6, 7, 8]);
+ the_same([0u8; 19]);
+}
+
+#[test]
+fn deserializing_errors() {
+ match *deserialize::<bool>(&vec![0xA][..]).unwrap_err() {
+ ErrorKind::InvalidBoolEncoding(0xA) => {}
+ _ => panic!(),
+ }
+
+ let invalid_str = vec![1, 0, 0, 0, 0, 0, 0, 0, 0xFF];
+
+ match *deserialize::<String>(&invalid_str[..]).unwrap_err() {
+ ErrorKind::InvalidUtf8Encoding(_) => {}
+ _ => panic!(),
+ }
+
+ // Out-of-bounds variant
+ #[derive(Serialize, Deserialize, Debug)]
+ enum Test {
+ One,
+ Two,
+ };
+
+ let invalid_enum = vec![0, 0, 0, 5];
+
+ match *deserialize::<Test>(&invalid_enum[..]).unwrap_err() {
+ // Error message comes from serde
+ ErrorKind::Custom(_) => {}
+ _ => panic!(),
+ }
+ match *deserialize::<Option<u8>>(&vec![5, 0][..]).unwrap_err() {
+ ErrorKind::InvalidTagEncoding(_) => {}
+ _ => panic!(),
+ }
+}
+
+#[test]
+fn trailing_bytes() {
+ match DefaultOptions::new()
+ .deserialize::<char>(b"1x")
+ .map_err(|e| *e)
+ {
+ Err(ErrorKind::Custom(_)) => {}
+ other => panic!("Expecting TrailingBytes, got {:?}", other),
+ }
+}
+
+#[test]
+fn too_big_deserialize() {
+ let serialized = vec![0, 0, 0, 3];
+ let deserialized: Result<u32> = DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(3)
+ .deserialize_from(&mut &serialized[..]);
+ assert!(deserialized.is_err());
+
+ let serialized = vec![0, 0, 0, 3];
+ let deserialized: Result<u32> = DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(4)
+ .deserialize_from(&mut &serialized[..]);
+ assert!(deserialized.is_ok());
+}
+
+#[test]
+fn char_serialization() {
+ let chars = "Aa\0☺♪";
+ for c in chars.chars() {
+ let encoded = DefaultOptions::new()
+ .with_limit(4)
+ .serialize(&c)
+ .expect("serializing char failed");
+ let decoded: char = deserialize(&encoded).expect("deserializing failed");
+ assert_eq!(decoded, c);
+ }
+}
+
+#[test]
+fn too_big_char_deserialize() {
+ let serialized = vec![0x41];
+ let deserialized: Result<char> = DefaultOptions::new()
+ .with_limit(1)
+ .deserialize_from(&mut &serialized[..]);
+ assert!(deserialized.is_ok());
+ assert_eq!(deserialized.unwrap(), 'A');
+}
+
+#[test]
+fn too_big_serialize() {
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(3)
+ .serialize(&0u32)
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(4)
+ .serialize(&0u32)
+ .is_ok());
+
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(LEN_SIZE + 4)
+ .serialize(&"abcde")
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(LEN_SIZE + 5)
+ .serialize(&"abcde")
+ .is_ok());
+}
+
+#[test]
+fn test_serialized_size() {
+ assert!(serialized_size(&0u8).unwrap() == 1);
+ assert!(serialized_size(&0u16).unwrap() == 2);
+ assert!(serialized_size(&0u32).unwrap() == 4);
+ assert!(serialized_size(&0u64).unwrap() == 8);
+
+ // length isize stored as u64
+ assert!(serialized_size(&"").unwrap() == LEN_SIZE);
+ assert!(serialized_size(&"a").unwrap() == LEN_SIZE + 1);
+
+ assert!(serialized_size(&vec![0u32, 1u32, 2u32]).unwrap() == LEN_SIZE + 3 * (4));
+}
+
+#[test]
+fn test_serialized_size_bounded() {
+ // JUST RIGHT
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(1)
+ .serialized_size(&0u8)
+ .unwrap()
+ == 1
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(2)
+ .serialized_size(&0u16)
+ .unwrap()
+ == 2
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(4)
+ .serialized_size(&0u32)
+ .unwrap()
+ == 4
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(8)
+ .serialized_size(&0u64)
+ .unwrap()
+ == 8
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(8)
+ .serialized_size(&"")
+ .unwrap()
+ == LEN_SIZE
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(8 + 1)
+ .serialized_size(&"a")
+ .unwrap()
+ == LEN_SIZE + 1
+ );
+ assert!(
+ DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(LEN_SIZE + 3 * 4)
+ .serialized_size(&vec![0u32, 1u32, 2u32])
+ .unwrap()
+ == LEN_SIZE + 3 * 4
+ );
+ // Below
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(0)
+ .serialized_size(&0u8)
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(1)
+ .serialized_size(&0u16)
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(3)
+ .serialized_size(&0u32)
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(7)
+ .serialized_size(&0u64)
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(7)
+ .serialized_size(&"")
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(8 + 0)
+ .serialized_size(&"a")
+ .is_err());
+ assert!(DefaultOptions::new()
+ .with_fixint_encoding()
+ .with_limit(8 + 3 * 4 - 1)
+ .serialized_size(&vec![0u32, 1u32, 2u32])
+ .is_err());
+}
+
+#[test]
+fn encode_box() {
+ the_same(Box::new(5));
+}
+
+#[test]
+fn test_cow_serialize() {
+ let large_object = vec![1u32, 2, 3, 4, 5, 6];
+ let mut large_map = HashMap::new();
+ large_map.insert(1, 2);
+
+ #[derive(Serialize, Deserialize, Debug)]
+ enum Message<'a> {
+ M1(Cow<'a, Vec<u32>>),
+ M2(Cow<'a, HashMap<u32, u32>>),
+ }
+
+ // Test 1
+ {
+ let serialized = serialize(&Message::M1(Cow::Borrowed(&large_object))).unwrap();
+ let deserialized: Message<'static> = deserialize_from(&mut &serialized[..]).unwrap();
+
+ match deserialized {
+ Message::M1(b) => assert!(&b.into_owned() == &large_object),
+ _ => assert!(false),
+ }
+ }
+
+ // Test 2
+ {
+ let serialized = serialize(&Message::M2(Cow::Borrowed(&large_map))).unwrap();
+ let deserialized: Message<'static> = deserialize_from(&mut &serialized[..]).unwrap();
+
+ match deserialized {
+ Message::M2(b) => assert!(&b.into_owned() == &large_map),
+ _ => assert!(false),
+ }
+ }
+}
+
+#[test]
+fn test_strbox_serialize() {
+ let strx: &'static str = "hello world";
+ let serialized = serialize(&Cow::Borrowed(strx)).unwrap();
+ let deserialized: Cow<'static, String> = deserialize_from(&mut &serialized[..]).unwrap();
+ let stringx: String = deserialized.into_owned();
+ assert!(strx == &stringx[..]);
+}
+
+#[test]
+fn test_slicebox_serialize() {
+ let slice = [1u32, 2, 3, 4, 5];
+ let serialized = serialize(&Cow::Borrowed(&slice[..])).unwrap();
+ println!("{:?}", serialized);
+ let deserialized: Cow<'static, Vec<u32>> = deserialize_from(&mut &serialized[..]).unwrap();
+ {
+ let sb: &[u32] = &deserialized;
+ assert!(slice == sb);
+ }
+ let vecx: Vec<u32> = deserialized.into_owned();
+ assert!(slice == &vecx[..]);
+}
+
+#[test]
+fn test_multi_strings_serialize() {
+ assert!(serialize(&("foo", "bar", "baz")).is_ok());
+}
+
+#[test]
+fn test_oom_protection() {
+ use std::io::Cursor;
+ #[derive(Serialize, Deserialize, PartialEq, Debug)]
+ struct FakeVec {
+ len: u64,
+ byte: u8,
+ }
+ let x = DefaultOptions::new()
+ .with_limit(10)
+ .serialize(&FakeVec {
+ len: 0xffffffffffffffffu64,
+ byte: 1,
+ })
+ .unwrap();
+ let y: Result<Vec<u8>> = DefaultOptions::new()
+ .with_limit(10)
+ .deserialize_from(&mut Cursor::new(&x[..]));
+ assert!(y.is_err());
+}
+
+#[test]
+fn path_buf() {
+ use std::path::{Path, PathBuf};
+ let path = Path::new("foo").to_path_buf();
+ let serde_encoded = serialize(&path).unwrap();
+ let decoded: PathBuf = deserialize(&serde_encoded).unwrap();
+ assert!(path.to_str() == decoded.to_str());
+}
+
+#[test]
+fn bytes() {
+ use serde_bytes::Bytes;
+
+ let data = b"abc\0123";
+ let s = serialize(&data[..]).unwrap();
+ let s2 = serialize(&Bytes::new(data)).unwrap();
+ assert_eq!(s[..], s2[..]);
+}
+
+#[test]
+fn serde_bytes() {
+ use serde_bytes::ByteBuf;
+ the_same(ByteBuf::from(vec![1, 2, 3, 4, 5]));
+}
+
+#[test]
+fn endian_difference() {
+ let x = 10u64;
+ let little = serialize(&x).unwrap();
+ let big = DefaultOptions::new()
+ .with_big_endian()
+ .serialize(&x)
+ .unwrap();
+ assert_ne!(little, big);
+}
+
+#[test]
+fn test_zero_copy_parse() {
+ #[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
+ struct Foo<'a> {
+ borrowed_str: &'a str,
+ borrowed_bytes: &'a [u8],
+ }
+
+ let f = Foo {
+ borrowed_str: "hi",
+ borrowed_bytes: &[0, 1, 2, 3],
+ };
+ {
+ let encoded = serialize(&f).unwrap();
+ let out: Foo = deserialize(&encoded[..]).unwrap();
+ assert_eq!(out, f);
+ }
+}
+
+#[test]
+fn test_zero_copy_parse_deserialize_into() {
+ use bincode::BincodeRead;
+ use std::io;
+
+ /// A BincodeRead implementation for byte slices
+ pub struct SliceReader<'storage> {
+ slice: &'storage [u8],
+ }
+
+ impl<'storage> SliceReader<'storage> {
+ #[inline(always)]
+ fn unexpected_eof() -> Box<::ErrorKind> {
+ return Box::new(::ErrorKind::Io(io::Error::new(
+ io::ErrorKind::UnexpectedEof,
+ "",
+ )));
+ }
+ }
+
+ impl<'storage> io::Read for SliceReader<'storage> {
+ #[inline(always)]
+ fn read(&mut self, out: &mut [u8]) -> io::Result<usize> {
+ (&mut self.slice).read(out)
+ }
+ #[inline(always)]
+ fn read_exact(&mut self, out: &mut [u8]) -> io::Result<()> {
+ (&mut self.slice).read_exact(out)
+ }
+ }
+
+ impl<'storage> BincodeRead<'storage> for SliceReader<'storage> {
+ #[inline(always)]
+ fn forward_read_str<V>(&mut self, length: usize, visitor: V) -> Result<V::Value>
+ where
+ V: serde::de::Visitor<'storage>,
+ {
+ use ErrorKind;
+ if length > self.slice.len() {
+ return Err(SliceReader::unexpected_eof());
+ }
+
+ let string = match ::std::str::from_utf8(&self.slice[..length]) {
+ Ok(s) => s,
+ Err(e) => return Err(ErrorKind::InvalidUtf8Encoding(e).into()),
+ };
+ let r = visitor.visit_borrowed_str(string);
+ self.slice = &self.slice[length..];
+ r
+ }
+
+ #[inline(always)]
+ fn get_byte_buffer(&mut self, length: usize) -> Result<Vec<u8>> {
+ if length > self.slice.len() {
+ return Err(SliceReader::unexpected_eof());
+ }
+
+ let r = &self.slice[..length];
+ self.slice = &self.slice[length..];
+ Ok(r.to_vec())
+ }
+
+ #[inline(always)]
+ fn forward_read_bytes<V>(&mut self, length: usize, visitor: V) -> Result<V::Value>
+ where
+ V: serde::de::Visitor<'storage>,
+ {
+ if length > self.slice.len() {
+ return Err(SliceReader::unexpected_eof());
+ }
+
+ let r = visitor.visit_borrowed_bytes(&self.slice[..length]);
+ self.slice = &self.slice[length..];
+ r
+ }
+ }
+
+ #[derive(Serialize, Deserialize, Eq, PartialEq, Debug)]
+ struct Foo<'a> {
+ borrowed_str: &'a str,
+ borrowed_bytes: &'a [u8],
+ }
+
+ let f = Foo {
+ borrowed_str: "hi",
+ borrowed_bytes: &[0, 1, 2, 3],
+ };
+
+ {
+ let encoded = serialize(&f).unwrap();
+ let mut target = Foo {
+ borrowed_str: "hello",
+ borrowed_bytes: &[10, 11, 12, 13],
+ };
+ deserialize_in_place(
+ SliceReader {
+ slice: &encoded[..],
+ },
+ &mut target,
+ )
+ .unwrap();
+ assert_eq!(target, f);
+ }
+}
+
+#[test]
+fn not_human_readable() {
+ use std::net::Ipv4Addr;
+ let ip = Ipv4Addr::new(1, 2, 3, 4);
+ the_same(ip);
+ assert_eq!(&ip.octets()[..], &serialize(&ip).unwrap()[..]);
+ assert_eq!(
+ ::std::mem::size_of::<Ipv4Addr>() as u64,
+ serialized_size(&ip).unwrap()
+ );
+}
+
+// The example is taken from serde::de::DeserializeSeed.
+struct ExtendVec<'a, T: 'a>(&'a mut Vec<T>);
+
+impl<'de, 'a, T> DeserializeSeed<'de> for ExtendVec<'a, T>
+where
+ T: Deserialize<'de>,
+{
+ // The return type of the `deserialize` method. This implementation
+ // appends onto an existing vector but does not create any new data
+ // structure, so the return type is ().
+ type Value = ();
+
+ fn deserialize<D>(self, deserializer: D) -> StdResult<Self::Value, D::Error>
+ where
+ D: Deserializer<'de>,
+ {
+ // Visitor implementation that will walk an inner array of the JSON
+ // input.
+ struct ExtendVecVisitor<'a, T: 'a>(&'a mut Vec<T>);
+
+ impl<'de, 'a, T> Visitor<'de> for ExtendVecVisitor<'a, T>
+ where
+ T: Deserialize<'de>,
+ {
+ type Value = ();
+
+ fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
+ write!(formatter, "an array of integers")
+ }
+
+ fn visit_seq<A>(self, mut seq: A) -> StdResult<(), A::Error>
+ where
+ A: SeqAccess<'de>,
+ {
+ // Visit each element in the inner array and push it onto
+ // the existing vector.
+ while let Some(elem) = seq.next_element()? {
+ self.0.push(elem);
+ }
+ Ok(())
+ }
+ }
+
+ deserializer.deserialize_seq(ExtendVecVisitor(self.0))
+ }
+}
+
+#[test]
+fn test_default_deserialize_seed() {
+ let config = DefaultOptions::new();
+
+ let data: Vec<_> = (10..100).collect();
+ let bytes = config.serialize(&data).expect("Config::serialize failed");
+
+ let mut seed_data: Vec<_> = (0..10).collect();
+ {
+ let seed = ExtendVec(&mut seed_data);
+ config
+ .deserialize_seed(seed, &bytes)
+ .expect("Config::deserialize_seed failed");
+ }
+
+ assert_eq!(seed_data, (0..100).collect::<Vec<_>>());
+}
+
+#[test]
+fn test_big_endian_deserialize_seed() {
+ let config = DefaultOptions::new().with_big_endian();
+
+ let data: Vec<_> = (10..100).collect();
+ let bytes = config.serialize(&data).expect("Config::serialize failed");
+
+ let mut seed_data: Vec<_> = (0..10).collect();
+ {
+ let seed = ExtendVec(&mut seed_data);
+ config
+ .deserialize_seed(seed, &bytes)
+ .expect("Config::deserialize_seed failed");
+ }
+
+ assert_eq!(seed_data, (0..100).collect::<Vec<_>>());
+}
+
+#[test]
+fn test_default_deserialize_from_seed() {
+ let config = DefaultOptions::new();
+
+ let data: Vec<_> = (10..100).collect();
+ let bytes = config.serialize(&data).expect("Config::serialize failed");
+
+ let mut seed_data: Vec<_> = (0..10).collect();
+ {
+ let seed = ExtendVec(&mut seed_data);
+ config
+ .deserialize_from_seed(seed, &mut &*bytes)
+ .expect("Config::deserialize_from_seed failed");
+ }
+
+ assert_eq!(seed_data, (0..100).collect::<Vec<_>>());
+}
+
+#[test]
+fn test_big_endian_deserialize_from_seed() {
+ let config = DefaultOptions::new().with_big_endian();
+
+ let data: Vec<_> = (10..100).collect();
+ let bytes = config.serialize(&data).expect("Config::serialize failed");
+
+ let mut seed_data: Vec<_> = (0..10).collect();
+ {
+ let seed = ExtendVec(&mut seed_data);
+ config
+ .deserialize_from_seed(seed, &mut &*bytes)
+ .expect("Config::deserialize_from_seed failed");
+ }
+
+ assert_eq!(seed_data, (0..100).collect::<Vec<_>>());
+}
+
+#[test]
+fn test_varint_length_prefixes() {
+ let a = vec![(); 127]; // should be a single byte
+ let b = vec![(); 250]; // also should be a single byte
+ let c = vec![(); 251];
+ let d = vec![(); u16::max_value() as usize + 1];
+
+ assert_eq!(
+ DefaultOptions::new()
+ .with_varint_encoding()
+ .serialized_size(&a[..])
+ .unwrap(),
+ 1
+ ); // 2 ** 7 - 1
+ assert_eq!(
+ DefaultOptions::new()
+ .with_varint_encoding()
+ .serialized_size(&b[..])
+ .unwrap(),
+ 1
+ ); // 250
+ assert_eq!(
+ DefaultOptions::new()
+ .with_varint_encoding()
+ .serialized_size(&c[..])
+ .unwrap(),
+ (1 + std::mem::size_of::<u16>()) as u64
+ ); // 251
+ assert_eq!(
+ DefaultOptions::new()
+ .with_varint_encoding()
+ .serialized_size(&d[..])
+ .unwrap(),
+ (1 + std::mem::size_of::<u32>()) as u64
+ ); // 2 ** 16 + 1
+}
+
+#[test]
+fn test_byte_vec_struct() {
+ #[derive(PartialEq, Eq, Clone, Serialize, Deserialize, Debug)]
+ struct ByteVecs {
+ a: Vec<u8>,
+ b: Vec<u8>,
+ c: Vec<u8>,
+ };
+
+ let byte_struct = ByteVecs {
+ a: vec![2; 20],
+ b: vec![3; 30],
+ c: vec![1; 10],
+ };
+
+ the_same(byte_struct);
+}