From 9f9afbc77254bc1e34d859c5c650eab571e7b5ce Mon Sep 17 00:00:00 2001 From: Tomasz Durda Date: Mon, 26 May 2025 10:25:59 +0200 Subject: [PATCH 1/2] Added tests for seq= syntax --- tests/regression/issue_x.rs | 81 +++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 tests/regression/issue_x.rs diff --git a/tests/regression/issue_x.rs b/tests/regression/issue_x.rs new file mode 100644 index 000000000..2065aeb12 --- /dev/null +++ b/tests/regression/issue_x.rs @@ -0,0 +1,81 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type", seq=false)] +enum ParentChildNoSeq { + Title, + #[serde(untagged)] + SubStructure(ChildNoSeq), +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type", seq=false)] +enum ParentNoSeq { + Title, + #[serde(untagged)] + SubStructure(Child), +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type")] +enum Parent { + Title, + #[serde(untagged)] + SubStructure(Child), +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type", seq=true)] +enum ParentSeq { + Title, + #[serde(untagged)] + SubStructure(Child), +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "subtype", seq=false)] +enum ChildNoSeq { + Topic, Sidebar +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "subtype")] +enum Child { + Topic, Sidebar +} + +#[test] +fn test() { + // Using seq=false on every level will cause it to fail + let v = serde_json::from_str::("[0]"); + assert!(v.is_err()); + + // Using seq=false will cause it to fail, but if the child is not seq=true, the child will succeed + let v = serde_json::from_str::("[0]"); + assert!(matches!(v, Ok(ParentNoSeq::SubStructure(Child::Topic)))); + + // Using default beahvior will succeed + let v = serde_json::from_str::("[0]"); + assert!(v.is_ok()); + + // Using seq=true beahvior will succeed + let v = serde_json::from_str::("[0]"); + assert!(v.is_ok()); + + // As in the docs: + // There is no explicit tag identifying which variant the data contains. Serde will try to + // match the data against each variant in order and the first one that deserializes + // successfully is the one returned. + let v = serde_json::from_str::("[\"Topic\"]"); + assert!(v.is_ok()); + let v = serde_json::from_str::("[\"Topic\"]"); + assert!(v.is_ok()); + + // With seq=false it should fail + let v = serde_json::from_str::("[\"Topic\"]"); + assert!(v.is_err()); + let v = serde_json::from_str::("[\"Topic\"]"); + assert!(v.is_ok()); + let v = serde_json::from_str::("[\"Topic\"]"); + assert!(v.is_err()); +} From a9f09d484691e7ab5f857b93dc40090b777122f7 Mon Sep 17 00:00:00 2001 From: Tomasz Durda Date: Tue, 27 May 2025 08:27:23 +0200 Subject: [PATCH 2/2] Updated tests to match new naming --- tests/regression/{issue_x.rs => issue_1263.rs} | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) rename tests/regression/{issue_x.rs => issue_1263.rs} (93%) diff --git a/tests/regression/issue_x.rs b/tests/regression/issue_1263.rs similarity index 93% rename from tests/regression/issue_x.rs rename to tests/regression/issue_1263.rs index 2065aeb12..b0704aaad 100644 --- a/tests/regression/issue_x.rs +++ b/tests/regression/issue_1263.rs @@ -1,7 +1,7 @@ use serde::{Deserialize, Serialize}; #[derive(Debug, Serialize, Deserialize)] -#[serde(tag = "type", seq=false)] +#[serde(tag = "type", seq_form=false)] enum ParentChildNoSeq { Title, #[serde(untagged)] @@ -9,7 +9,7 @@ enum ParentChildNoSeq { } #[derive(Debug, Serialize, Deserialize)] -#[serde(tag = "type", seq=false)] +#[serde(tag = "type", seq_form=false)] enum ParentNoSeq { Title, #[serde(untagged)] @@ -25,7 +25,7 @@ enum Parent { } #[derive(Debug, Serialize, Deserialize)] -#[serde(tag = "type", seq=true)] +#[serde(tag = "type", seq_form=true)] enum ParentSeq { Title, #[serde(untagged)] @@ -33,7 +33,7 @@ enum ParentSeq { } #[derive(Debug, Serialize, Deserialize)] -#[serde(tag = "subtype", seq=false)] +#[serde(tag = "subtype", seq_form=false)] enum ChildNoSeq { Topic, Sidebar }