mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-04-29 23:27:56 +00:00
Add tests for flatten unit variant in adjacently tagged (tag + content) enums
This commit is contained in:
@@ -2898,6 +2898,7 @@ mod flatten {
|
|||||||
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
#[serde(tag = "tag", content = "content")]
|
#[serde(tag = "tag", content = "content")]
|
||||||
enum Enum {
|
enum Enum {
|
||||||
|
Unit,
|
||||||
Newtype(NewtypeVariant),
|
Newtype(NewtypeVariant),
|
||||||
Struct { index: u32, value: u32 },
|
Struct { index: u32, value: u32 },
|
||||||
}
|
}
|
||||||
@@ -2907,6 +2908,170 @@ mod flatten {
|
|||||||
value: u32,
|
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]
|
#[test]
|
||||||
fn newtype() {
|
fn newtype() {
|
||||||
let value = Flatten {
|
let value = Flatten {
|
||||||
|
|||||||
Reference in New Issue
Block a user