From fe7dcc4cd8b74682c97f8d8fec18ca91c23c6177 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 3 Aug 2024 15:18:28 +0500 Subject: [PATCH] Test all possible orders of map entries for enum-flatten-in-struct representations --- test_suite/tests/test_annotations.rs | 481 ++++++++++++++++++++++++--- 1 file changed, 440 insertions(+), 41 deletions(-) diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index bcabf20c..35de0f2c 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -2697,23 +2697,42 @@ mod flatten { #[test] fn newtype() { + let value = Flatten { + data: Enum::Newtype(HashMap::from_iter([("key".into(), "value".into())])), + extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + }; assert_tokens( - &Flatten { - data: Enum::Newtype(HashMap::from_iter([("key".into(), "value".into())])), - extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), - }, + &value, &[ Token::Map { len: None }, + // data Token::Str("Newtype"), // variant Token::Map { len: Some(1) }, Token::Str("key"), Token::Str("value"), Token::MapEnd, + // extra Token::Str("extra_key"), Token::Str("extra value"), Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // extra + Token::Str("extra_key"), + Token::Str("extra value"), + // data + Token::Str("Newtype"), // variant + Token::Map { len: Some(1) }, + Token::Str("key"), + Token::Str("value"), + Token::MapEnd, + Token::MapEnd, + ], + ); } // Reaches crate::private::de::content::VariantDeserializer::tuple_variant @@ -2721,23 +2740,42 @@ mod flatten { // via FlatMapDeserializer::deserialize_enum #[test] fn tuple() { + let value = Flatten { + data: Enum::Tuple(0, 42), + extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + }; assert_tokens( - &Flatten { - data: Enum::Tuple(0, 42), - extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), - }, + &value, &[ Token::Map { len: None }, + // data Token::Str("Tuple"), // variant Token::Seq { len: Some(2) }, Token::U32(0), Token::U32(42), Token::SeqEnd, + // extra Token::Str("extra_key"), Token::Str("extra value"), Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // extra + Token::Str("extra_key"), + Token::Str("extra value"), + // data + Token::Str("Tuple"), // variant + Token::Seq { len: Some(2) }, + Token::U32(0), + Token::U32(42), + Token::SeqEnd, + Token::MapEnd, + ], + ); } // Reaches crate::private::de::content::VariantDeserializer::struct_variant @@ -2745,26 +2783,45 @@ mod flatten { // via FlatMapDeserializer::deserialize_enum #[test] fn struct_from_seq() { - assert_de_tokens( - &Flatten { - data: Enum::Struct { - index: 0, - value: 42, - }, - extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + let value = Flatten { + data: Enum::Struct { + index: 0, + value: 42, }, + extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + }; + assert_de_tokens( + &value, &[ Token::Map { len: None }, + // data Token::Str("Struct"), // variant Token::Seq { len: Some(2) }, Token::U32(0), // index Token::U32(42), // value Token::SeqEnd, + // extra Token::Str("extra_key"), Token::Str("extra value"), Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // extra + Token::Str("extra_key"), + Token::Str("extra value"), + // data + Token::Str("Struct"), // variant + Token::Seq { len: Some(2) }, + Token::U32(0), // index + Token::U32(42), // value + Token::SeqEnd, + Token::MapEnd, + ], + ); } // Reaches crate::private::de::content::VariantDeserializer::struct_variant @@ -2772,16 +2829,18 @@ mod flatten { // via FlatMapDeserializer::deserialize_enum #[test] fn struct_from_map() { - assert_tokens( - &Flatten { - data: Enum::Struct { - index: 0, - value: 42, - }, - extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + let value = Flatten { + data: Enum::Struct { + index: 0, + value: 42, }, + extra: HashMap::from_iter([("extra_key".into(), "extra value".into())]), + }; + assert_tokens( + &value, &[ Token::Map { len: None }, + // data Token::Str("Struct"), // variant Token::Struct { len: 2, @@ -2792,11 +2851,33 @@ mod flatten { Token::Str("value"), Token::U32(42), Token::StructEnd, + // extra Token::Str("extra_key"), Token::Str("extra value"), Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // extra + Token::Str("extra_key"), + Token::Str("extra value"), + // data + Token::Str("Struct"), // variant + Token::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + Token::MapEnd, + ], + ); } } @@ -2828,20 +2909,25 @@ mod flatten { #[test] fn newtype() { + let value = Flatten { + outer: 42, + data: NewtypeWrapper(Enum::Newtype(NewtypeVariant { value: 23 })), + }; + // Field order: outer, [tag, content] assert_tokens( - &Flatten { - outer: 42, - data: NewtypeWrapper(Enum::Newtype(NewtypeVariant { value: 23 })), - }, + &value, &[ Token::Map { len: None }, + // outer Token::Str("outer"), Token::U32(42), + // tag Token::Str("tag"), Token::UnitVariant { name: "Enum", variant: "Newtype", }, + // content Token::Str("content"), Token::Struct { len: 1, @@ -2853,27 +2939,162 @@ mod flatten { 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::Struct { + len: 1, + name: "NewtypeVariant", + }, + Token::Str("value"), + Token::U32(23), + Token::StructEnd, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Newtype", + }, + Token::MapEnd, + ], + ); + // Field order: [tag, content], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Newtype", + }, + // content + Token::Str("content"), + Token::Struct { + len: 1, + name: "NewtypeVariant", + }, + Token::Str("value"), + Token::U32(23), + Token::StructEnd, + // outer + Token::Str("outer"), + Token::U32(42), + Token::MapEnd, + ], + ); + // Field order: [content, tag], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Struct { + len: 1, + name: "NewtypeVariant", + }, + Token::Str("value"), + Token::U32(23), + Token::StructEnd, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Newtype", + }, + // 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: "Newtype", + }, + // outer + Token::Str("outer"), + Token::U32(42), + // content + Token::Str("content"), + Token::Struct { + len: 1, + name: "NewtypeVariant", + }, + Token::Str("value"), + Token::U32(23), + Token::StructEnd, + Token::MapEnd, + ], + ); + // Field order: [content], outer, [tag] + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Struct { + len: 1, + name: "NewtypeVariant", + }, + Token::Str("value"), + Token::U32(23), + Token::StructEnd, + // outer + Token::Str("outer"), + Token::U32(42), + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Newtype", + }, + Token::MapEnd, + ], + ); } #[test] fn struct_() { + let value = Flatten { + outer: 42, + data: NewtypeWrapper(Enum::Struct { + index: 0, + value: 42, + }), + }; + // Field order: outer, [tag, content] assert_tokens( - &Flatten { - outer: 42, - data: NewtypeWrapper(Enum::Struct { - index: 0, - value: 42, - }), - }, + &value, &[ Token::Map { len: None }, + // outer Token::Str("outer"), Token::U32(42), + // tag Token::Str("tag"), Token::UnitVariant { name: "Enum", variant: "Struct", }, + // content Token::Str("content"), Token::Struct { len: 2, @@ -2887,6 +3108,146 @@ mod flatten { 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::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Struct", + }, + Token::MapEnd, + ], + ); + // Field order: [tag, content], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Struct", + }, + // content + Token::Str("content"), + Token::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + // outer + Token::Str("outer"), + Token::U32(42), + Token::MapEnd, + ], + ); + // Field order: [content, tag], outer + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Struct", + }, + // 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: "Struct", + }, + // outer + Token::Str("outer"), + Token::U32(42), + // content + Token::Str("content"), + Token::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + Token::MapEnd, + ], + ); + // Field order: [content], outer, [tag] + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // content + Token::Str("content"), + Token::Struct { + len: 2, + name: "Struct", + }, + Token::Str("index"), + Token::U32(0), + Token::Str("value"), + Token::U32(42), + Token::StructEnd, + // outer + Token::Str("outer"), + Token::U32(42), + // tag + Token::Str("tag"), + Token::UnitVariant { + name: "Enum", + variant: "Struct", + }, + Token::MapEnd, + ], + ); } } @@ -2917,17 +3278,20 @@ mod flatten { D { d: i32 }, } + let value = Flatten { + x: X::B { b: 1 }, + y: Y::D { d: 2 }, + }; assert_tokens( - &Flatten { - x: X::B { b: 1 }, - y: Y::D { d: 2 }, - }, + &value, &[ Token::Map { len: None }, + // x Token::Str("typeX"), Token::Str("B"), Token::Str("b"), Token::I32(1), + // y Token::Str("typeY"), Token::Str("D"), Token::Str("d"), @@ -2935,6 +3299,23 @@ mod flatten { Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // y + Token::Str("typeY"), + Token::Str("D"), + Token::Str("d"), + Token::I32(2), + // x + Token::Str("typeX"), + Token::Str("B"), + Token::Str("b"), + Token::I32(1), + Token::MapEnd, + ], + ); } #[test] @@ -2959,15 +3340,18 @@ mod flatten { B { c: u32 }, } + let value = Flatten { + x: X::A, + y: Y::B { c: 0 }, + }; assert_tokens( - &Flatten { - x: X::A, - y: Y::B { c: 0 }, - }, + &value, &[ Token::Map { len: None }, + // x Token::Str("typeX"), Token::Str("A"), + // y Token::Str("typeY"), Token::Str("B"), Token::Str("c"), @@ -2975,6 +3359,21 @@ mod flatten { Token::MapEnd, ], ); + assert_de_tokens( + &value, + &[ + Token::Map { len: None }, + // y + Token::Str("typeY"), + Token::Str("B"), + Token::Str("c"), + Token::U32(0), + // x + Token::Str("typeX"), + Token::Str("A"), + Token::MapEnd, + ], + ); } }