serde/test_suite/tests/test_borrow.rs

185 lines
4.2 KiB
Rust
Raw Normal View History

2017-04-04 12:47:21 -05:00
use serde::{Deserialize, Deserializer};
2017-12-23 22:13:08 -06:00
use serde_test::{assert_de_tokens, assert_de_tokens_error, Token};
2017-04-04 12:47:21 -05:00
use std::borrow::Cow;
#[test]
fn test_borrowed_str() {
2017-04-13 14:28:23 -05:00
assert_de_tokens(&"borrowed", &[Token::BorrowedStr("borrowed")]);
2017-04-04 12:47:21 -05:00
}
#[test]
fn test_borrowed_str_from_string() {
assert_de_tokens_error::<&str>(
2017-04-13 14:28:23 -05:00
&[Token::String("borrowed")],
"invalid type: string \"borrowed\", expected a borrowed string",
2017-04-04 12:47:21 -05:00
);
}
#[test]
fn test_borrowed_str_from_str() {
assert_de_tokens_error::<&str>(
2017-04-13 14:28:23 -05:00
&[Token::Str("borrowed")],
"invalid type: string \"borrowed\", expected a borrowed string",
2017-04-04 12:47:21 -05:00
);
}
#[test]
fn test_string_from_borrowed_str() {
2017-04-13 14:28:23 -05:00
assert_de_tokens(&"owned".to_owned(), &[Token::BorrowedStr("owned")]);
2017-04-04 12:47:21 -05:00
}
#[test]
fn test_borrowed_bytes() {
2017-04-13 14:28:23 -05:00
assert_de_tokens(&&b"borrowed"[..], &[Token::BorrowedBytes(b"borrowed")]);
2017-04-04 12:47:21 -05:00
}
#[test]
fn test_borrowed_bytes_from_bytebuf() {
assert_de_tokens_error::<&[u8]>(
2017-04-13 14:28:23 -05:00
&[Token::ByteBuf(b"borrowed")],
"invalid type: byte array, expected a borrowed byte array",
2017-04-04 12:47:21 -05:00
);
}
#[test]
fn test_borrowed_bytes_from_bytes() {
assert_de_tokens_error::<&[u8]>(
2017-04-13 14:28:23 -05:00
&[Token::Bytes(b"borrowed")],
"invalid type: byte array, expected a borrowed byte array",
2017-04-04 12:47:21 -05:00
);
}
#[test]
fn test_tuple() {
assert_de_tokens(
&("str", &b"bytes"[..]),
&[
2017-04-19 15:06:31 -05:00
Token::Tuple { len: 2 },
2017-04-04 12:47:21 -05:00
Token::BorrowedStr("str"),
Token::BorrowedBytes(b"bytes"),
Token::TupleEnd,
2017-04-13 14:28:23 -05:00
],
2017-04-04 12:47:21 -05:00
);
}
#[test]
fn test_struct() {
#[derive(Deserialize, Debug, PartialEq)]
struct Borrowing<'a, 'b> {
bs: &'a str,
bb: &'b [u8],
}
assert_de_tokens(
2017-04-13 14:28:23 -05:00
&Borrowing {
2017-12-23 22:13:08 -06:00
bs: "str",
bb: b"bytes",
},
2017-04-04 12:47:21 -05:00
&[
2017-12-23 22:13:08 -06:00
Token::Struct {
name: "Borrowing",
len: 2,
},
2017-04-04 12:47:21 -05:00
Token::BorrowedStr("bs"),
Token::BorrowedStr("str"),
Token::BorrowedStr("bb"),
Token::BorrowedBytes(b"bytes"),
Token::StructEnd,
2017-04-13 14:28:23 -05:00
],
2017-04-04 12:47:21 -05:00
);
}
2020-10-23 06:12:06 -05:00
#[test]
fn test_field_identifier() {
#[derive(Deserialize, Debug, PartialEq)]
#[serde(field_identifier)]
enum FieldStr<'a> {
#[serde(borrow)]
Str(&'a str),
}
2021-01-23 14:29:20 -06:00
assert_de_tokens(&FieldStr::Str("value"), &[Token::BorrowedStr("value")]);
2020-10-23 06:12:06 -05:00
#[derive(Deserialize, Debug, PartialEq)]
#[serde(field_identifier)]
enum FieldBytes<'a> {
#[serde(borrow)]
Bytes(&'a [u8]),
}
assert_de_tokens(
&FieldBytes::Bytes(b"value"),
2021-01-23 14:29:20 -06:00
&[Token::BorrowedBytes(b"value")],
2020-10-23 06:12:06 -05:00
);
}
2017-04-04 12:47:21 -05:00
#[test]
fn test_cow() {
#[derive(Deserialize)]
struct Cows<'a, 'b> {
copied: Cow<'a, str>,
#[serde(borrow)]
borrowed: Cow<'b, str>,
2017-04-04 12:47:21 -05:00
}
let tokens = &[
2017-12-23 22:13:08 -06:00
Token::Struct {
name: "Cows",
len: 2,
},
2017-04-04 12:47:21 -05:00
Token::Str("copied"),
Token::BorrowedStr("copied"),
Token::Str("borrowed"),
Token::BorrowedStr("borrowed"),
Token::StructEnd,
];
let mut de = serde_test::Deserializer::new(tokens);
2017-04-04 12:47:21 -05:00
let cows = Cows::deserialize(&mut de).unwrap();
match cows.copied {
Cow::Owned(ref s) if s == "copied" => {}
_ => panic!("expected a copied string"),
}
match cows.borrowed {
Cow::Borrowed("borrowed") => {}
_ => panic!("expected a borrowed string"),
}
}
#[test]
fn test_lifetimes() {
#[derive(Deserialize)]
struct Cows<'a, 'b> {
_copied: Cow<'a, str>,
#[serde(borrow)]
_borrowed: Cow<'b, str>,
2017-04-04 12:47:21 -05:00
}
// Tests that `'de: 'a` is not required by the Deserialize impl.
fn _cows_lifetimes<'de: 'b, 'a, 'b, D>(deserializer: D) -> Cows<'a, 'b>
2017-04-13 14:28:23 -05:00
where
D: Deserializer<'de>,
2017-04-04 12:47:21 -05:00
{
Deserialize::deserialize(deserializer).unwrap()
}
#[derive(Deserialize)]
struct Wrap<'a, 'b> {
#[serde(borrow = "'b")]
_cows: Cows<'a, 'b>,
2017-04-04 12:47:21 -05:00
}
// Tests that `'de: 'a` is not required by the Deserialize impl.
fn _wrap_lifetimes<'de: 'b, 'a, 'b, D>(deserializer: D) -> Wrap<'a, 'b>
2017-04-13 14:28:23 -05:00
where
D: Deserializer<'de>,
2017-04-04 12:47:21 -05:00
{
Deserialize::deserialize(deserializer).unwrap()
}
}