Complete coverage of ContentRefDeserializer::deserialize_newtype_struct

This commit is contained in:
Mingun 2024-08-17 11:31:50 +05:00
parent 2dddc7796d
commit 171c6da57a
2 changed files with 15 additions and 1 deletions

View File

@ -1938,10 +1938,17 @@ mod content {
where where
V: Visitor<'de>, V: Visitor<'de>,
{ {
// Covered by tests/test_enum_untagged.rs
// newtype_struct
match *self.content { match *self.content {
Content::Newtype(ref v) => { Content::Newtype(ref v) => {
visitor.visit_newtype_struct(ContentRefDeserializer::new(v)) visitor.visit_newtype_struct(ContentRefDeserializer::new(v))
} }
// This case is necessary for formats which does not store marker of a newtype,
// for example, JSON. When `deserialize_any` is requested from such formats, they will
// report value without using `Visitor::visit_newtype_struct`, because they do not
// known in which contexts this value will be used.
// RON is example of format which preserve markers.
_ => visitor.visit_newtype_struct(self), _ => visitor.visit_newtype_struct(self),
} }
} }

View File

@ -104,6 +104,7 @@ fn newtype_unit_and_empty_map() {
); );
} }
// Reaches crate::private::de::content::ContentRefDeserializer::deserialize_newtype_struct
#[test] #[test]
fn newtype_struct() { fn newtype_struct() {
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
@ -116,8 +117,11 @@ fn newtype_struct() {
Null, Null,
} }
let value = E::Newtype(NewtypeStruct(5));
// Content::Newtype case
assert_tokens( assert_tokens(
&E::Newtype(NewtypeStruct(5)), &value,
&[ &[
Token::NewtypeStruct { Token::NewtypeStruct {
name: "NewtypeStruct", name: "NewtypeStruct",
@ -125,6 +129,9 @@ fn newtype_struct() {
Token::U32(5), Token::U32(5),
], ],
); );
// _ case
assert_de_tokens(&value, &[Token::U32(5)]);
} }
#[test] #[test]