From c09e2bd690b2e12cd355e93ca4c9beb8b3ff98e9 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 3 Aug 2024 16:02:38 +0500 Subject: [PATCH] Add tests for flatten unit variant in adjacently tagged (tag + content) enums --- test_suite/tests/test_annotations.rs | 165 +++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 35de0f2c..510ce5d0 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2898,6 +2898,7 @@ mod flatten { #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(tag = "tag", content = "content")] enum Enum { + Unit, Newtype(NewtypeVariant), Struct { index: u32, value: u32 }, } @@ -2907,6 +2908,170 @@ mod flatten { value: u32, } + #[test] + fn unit() { + let value = Flatten { + outer: 42, + data: NewtypeWrapper(Enum::Unit), + }; + // Field order: outer, [tag] + assert_tokens( + &value, + &[ + Token::Map { len: None }, + // outer + Token::Str("outer"), + Token::U32(42), + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // content missing + Token::MapEnd, + ], + ); + // Field order: [tag], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // content missing + // outer + Token::Str("outer"), + Token::U32(42), + Token::MapEnd, + ], + ); + // Field order: outer, [tag, content] + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // outer + Token::Str("outer"), + Token::U32(42), + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // content + Token::Str("content"), + Token::Unit, + Token::MapEnd, + ], + ); + // Field order: outer, [content, tag] + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // outer + Token::Str("outer"), + Token::U32(42), + // content + Token::Str("content"), + Token::Unit, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + Token::MapEnd, + ], + ); + // Field order: [tag, content], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // content + Token::Str("content"), + Token::Unit, + // outer + Token::Str("outer"), + Token::U32(42), + Token::MapEnd, + ], + ); + // Field order: [content, tag], outer - did not work + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Unit, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // outer + Token::Str("outer"), + Token::U32(42), + Token::MapEnd, + ], + ); + // Field order: [tag], outer, [content] + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + // outer + Token::Str("outer"), + Token::U32(42), + // content + Token::Str("content"), + Token::Unit, + Token::MapEnd, + ], + ); + // Field order: [content], outer, [tag] - did not work + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Unit, + // outer + Token::Str("outer"), + Token::U32(42), + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Unit", + }, + Token::MapEnd, + ], + ); + } + #[test] fn newtype() { let value = Flatten {