From 2440b59aaec2b83c8d19d0422443ec998753c218 Mon Sep 17 00:00:00 2001 From: Ted Driggs Date: Thu, 27 Apr 2017 12:21:32 -0700 Subject: [PATCH] Address feedback on PR #905 * Added error test when deny_unknown_fields enabled * Fixed next_relevant_key to use absolute paths --- serde_derive/src/de.rs | 6 ++-- test_suite/tests/test_macros.rs | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 3 deletions(-) diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index 2ce553aa..6f294f01 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -866,7 +866,7 @@ fn deserialize_adjacently_tagged_enum( } else { quote! { { - let mut __rk : Option<_serde::private::de::TagOrContentField> = None; + let mut __rk : _serde::export::Option<_serde::private::de::TagOrContentField> = _serde::export::None; while let _serde::export::Some(__k) = #next_key { match __k { _serde::private::de::TagContentOtherField::Other => { @@ -874,11 +874,11 @@ fn deserialize_adjacently_tagged_enum( continue; }, _serde::private::de::TagContentOtherField::Tag => { - __rk = Some(_serde::private::de::TagOrContentField::Tag); + __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Tag); break; } _serde::private::de::TagContentOtherField::Content => { - __rk = Some(_serde::private::de::TagOrContentField::Content); + __rk = _serde::export::Some(_serde::private::de::TagOrContentField::Content); break; } } diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index a9af4f52..6c7e4b2a 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -885,6 +885,66 @@ fn test_adjacently_tagged_enum() { ); } +#[test] +fn test_adjacently_tagged_enum_deny_unknown_fields() { + #[derive(Debug, PartialEq, Deserialize)] + #[serde(tag = "t", content = "c", deny_unknown_fields)] + enum AdjacentlyTagged { + Unit, + } + + assert_de_tokens( + &AdjacentlyTagged::Unit, + &[ + Token::Struct { name: "AdjacentlyTagged", len: 2}, + + Token::Str("t"), + Token::Str("Unit"), + + Token::Str("c"), + Token::Unit, + + Token::StructEnd, + ], + ); + + assert_de_tokens_error::( + &[ + Token::Struct { name: "AdjacentlyTagged", len: 3}, + + Token::Str("t"), + Token::Str("Unit"), + + Token::Str("c"), + Token::Unit, + + Token::Str("h"), + ], + r#"invalid value: string "h", expected "t" or "c""# + ); + + assert_de_tokens_error::( + &[ + Token::Struct { name: "AdjacentlyTagged", len: 3}, + + Token::Str("h"), + ], + r#"invalid value: string "h", expected "t" or "c""# + ); + + assert_de_tokens_error::( + &[ + Token::Struct { name: "AdjacentlyTagged", len: 3}, + + Token::Str("c"), + Token::Unit, + + Token::Str("h"), + ], + r#"invalid value: string "h", expected "t" or "c""# + ); +} + #[test] fn test_enum_in_internally_tagged_enum() { #[derive(Debug, PartialEq, Serialize, Deserialize)]