Unit: add tests for deserialization from sequence

(review this commit with "ignore whitespace changes" option on)
This commit is contained in:
Mingun
2024-08-12 00:45:29 +05:00
committed by Mingun
parent a7f0bab078
commit 29dc6c3367
+139 -94
View File
@@ -18,104 +18,149 @@ enum AdjacentlyTagged<T> {
Struct { f: u8 }, Struct { f: u8 },
} }
#[test] mod unit {
fn unit() { use super::*;
// unit with no content
assert_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::Struct {
name: "AdjacentlyTagged",
len: 1,
},
Token::Str("t"),
Token::UnitVariant {
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::StructEnd,
],
);
// unit with no content and incorrect hint for number of elements #[test]
assert_de_tokens( fn map_str_tag_only() {
&AdjacentlyTagged::Unit::<u8>, // Map: tag only
&[ assert_tokens(
Token::Struct { &AdjacentlyTagged::Unit::<u8>,
name: "AdjacentlyTagged", &[
len: 2, Token::Struct {
}, name: "AdjacentlyTagged",
Token::Str("t"), len: 1,
Token::UnitVariant { },
name: "AdjacentlyTagged", Token::Str("t"),
variant: "Unit", Token::UnitVariant {
}, name: "AdjacentlyTagged",
Token::StructEnd, variant: "Unit",
], },
); Token::StructEnd,
],
);
// unit with tag first // Map: tag only and incorrect hint for number of elements
assert_de_tokens( assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>, &AdjacentlyTagged::Unit::<u8>,
&[ &[
Token::Struct { Token::Struct {
name: "AdjacentlyTagged", name: "AdjacentlyTagged",
len: 2, len: 2,
}, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "AdjacentlyTagged", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("c"), Token::StructEnd,
Token::Unit, ],
Token::StructEnd, );
], }
);
// unit with content first #[test]
assert_de_tokens( fn map_str_tag_content() {
&AdjacentlyTagged::Unit::<u8>, // Map: tag + content
&[ assert_de_tokens(
Token::Struct { &AdjacentlyTagged::Unit::<u8>,
name: "AdjacentlyTagged", &[
len: 2, Token::Struct {
}, name: "AdjacentlyTagged",
Token::Str("c"), len: 2,
Token::Unit, },
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "AdjacentlyTagged", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::StructEnd, Token::Str("c"),
], Token::Unit,
); Token::StructEnd,
],
);
// Map: content + tag
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::Struct {
name: "AdjacentlyTagged",
len: 2,
},
Token::Str("c"),
Token::Unit,
Token::Str("t"),
Token::UnitVariant {
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::StructEnd,
],
);
// unit with excess content (f, g, h) // Map: tag + content + excess fields (f, g, h)
assert_de_tokens( assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>, &AdjacentlyTagged::Unit::<u8>,
&[ &[
Token::Struct { Token::Struct {
name: "AdjacentlyTagged", name: "AdjacentlyTagged",
len: 2, len: 2,
}, },
Token::Str("f"), Token::Str("f"),
Token::Unit, Token::Unit,
Token::Str("t"), Token::Str("t"),
Token::UnitVariant { Token::UnitVariant {
name: "AdjacentlyTagged", name: "AdjacentlyTagged",
variant: "Unit", variant: "Unit",
}, },
Token::Str("g"), Token::Str("g"),
Token::Unit, Token::Unit,
Token::Str("c"), Token::Str("c"),
Token::Unit, Token::Unit,
Token::Str("h"), Token::Str("h"),
Token::Unit, Token::Unit,
Token::StructEnd, Token::StructEnd,
], ],
); );
}
#[test]
fn seq_tag_content() {
// Seq: tag and content
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::Seq { len: Some(2) },
Token::UnitVariant {
name: "AdjacentlyTagged",
variant: "Unit",
},
Token::Unit,
Token::SeqEnd,
],
);
// Seq: tag (as string) and content
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::Seq { len: None },
Token::Str("Unit"), // tag
Token::Unit, // content
Token::SeqEnd,
],
);
// Seq: tag (as borrowed string) and content
assert_de_tokens(
&AdjacentlyTagged::Unit::<u8>,
&[
Token::Seq { len: None },
Token::BorrowedStr("Unit"), // tag
Token::Unit, // content
Token::SeqEnd,
],
);
}
} }
#[test] #[test]