Skip to content

Commit 4c5fec1

Browse files
committed
Test special cases that reaches SeqRefDeserializer::deserialize_any len==0 condition
failures (2): newtype_enum::empty_struct_from_seq newtype_enum::tuple0
1 parent 6588b0a commit 4c5fec1

File tree

2 files changed

+58
-0
lines changed

2 files changed

+58
-0
lines changed

serde/src/private/de.rs

+2
Original file line numberDiff line numberDiff line change
@@ -2188,6 +2188,7 @@ mod content {
21882188
// test_partially_untagged_enum
21892189
// test_partially_untagged_enum_desugared
21902190
// Covered by tests/test_enum_untagged.rs
2191+
// newtype_enum::tuple0
21912192
// newtype_enum::tuple2
21922193
Some(Content::Seq(v)) => {
21932194
de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
@@ -2219,6 +2220,7 @@ mod content {
22192220
}
22202221
// Covered by tests/test_enum_untagged.rs
22212222
// newtype_enum::struct_from_seq
2223+
// newtype_enum::empty_struct_from_seq
22222224
Some(Content::Seq(v)) => {
22232225
de::Deserializer::deserialize_any(SeqRefDeserializer::new(v), visitor)
22242226
}

test_suite/tests/test_enum_untagged.rs

+56
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,10 @@ mod newtype_enum {
147147
enum Inner {
148148
Unit,
149149
Newtype(u8),
150+
Tuple0(),
150151
Tuple2(u8, u8),
151152
Struct { f: u8 },
153+
EmptyStruct {},
152154
}
153155

154156
// Reaches crate::private::de::content::VariantRefDeserializer::unit_variant
@@ -178,6 +180,22 @@ mod newtype_enum {
178180
);
179181
}
180182

183+
// Reaches crate::private::de::content::VariantRefDeserializer::tuple_variant
184+
#[test]
185+
fn tuple0() {
186+
assert_tokens(
187+
&Outer::Inner(Inner::Tuple0()),
188+
&[
189+
Token::TupleVariant {
190+
name: "Inner",
191+
variant: "Tuple0",
192+
len: 0,
193+
},
194+
Token::TupleVariantEnd,
195+
],
196+
);
197+
}
198+
181199
// Reaches crate::private::de::content::VariantRefDeserializer::tuple_variant
182200
#[test]
183201
fn tuple2() {
@@ -233,6 +251,44 @@ mod newtype_enum {
233251
],
234252
);
235253
}
254+
255+
// Reaches crate::private::de::content::VariantRefDeserializer::struct_variant
256+
// Content::Map case
257+
// Special case - empty map
258+
#[test]
259+
fn empty_struct_from_map() {
260+
assert_de_tokens(
261+
&Outer::Inner(Inner::EmptyStruct {}),
262+
&[
263+
Token::Map { len: Some(1) },
264+
// tag
265+
Token::Str("EmptyStruct"),
266+
// content
267+
Token::Map { len: Some(0) },
268+
Token::MapEnd,
269+
Token::MapEnd,
270+
],
271+
);
272+
}
273+
274+
// Reaches crate::private::de::content::VariantRefDeserializer::struct_variant
275+
// Content::Seq case
276+
// Special case - empty seq
277+
#[test]
278+
fn empty_struct_from_seq() {
279+
assert_de_tokens(
280+
&Outer::Inner(Inner::EmptyStruct {}),
281+
&[
282+
Token::Map { len: Some(1) },
283+
// tag
284+
Token::Str("EmptyStruct"),
285+
// content
286+
Token::Seq { len: Some(0) },
287+
Token::SeqEnd,
288+
Token::MapEnd,
289+
],
290+
);
291+
}
236292
}
237293

238294
// Reaches crate::private::de::content::ContentRefDeserializer::deserialize_option

0 commit comments

Comments
 (0)