Skip to content

Commit c3ac7b6

Browse files
committed
Add regression test for issue #1904
Currently panics in derive: error: proc-macro derive panicked --> test_suite\tests\test_annotations.rs:2386:25 | 2386 | #[derive(Serialize, Deserialize, PartialEq, Debug)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:57:10 | 57 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:47:10 | 47 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:37:10 | 37 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:27:10 | 27 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:16:10 | 16 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten() error: proc-macro derive panicked --> test_suite\tests\regression\issue1904.rs:7:10 | 7 | #[derive(Deserialize)] | ^^^^^^^^^^^ | = help: message: assertion failed: !cattrs.has_flatten()
1 parent 24614e4 commit c3ac7b6

File tree

2 files changed

+115
-0
lines changed

2 files changed

+115
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#![allow(dead_code)] // we do not read enum fields
2+
use serde_derive::Deserialize;
3+
4+
#[derive(Deserialize)]
5+
pub struct Nested;
6+
7+
#[derive(Deserialize)]
8+
pub enum ExternallyTagged1 {
9+
Tuple(f64, String),
10+
Flatten {
11+
#[serde(flatten)]
12+
nested: Nested,
13+
},
14+
}
15+
16+
#[derive(Deserialize)]
17+
pub enum ExternallyTagged2 {
18+
Flatten {
19+
#[serde(flatten)]
20+
nested: Nested,
21+
},
22+
Tuple(f64, String),
23+
}
24+
25+
// Internally tagged enums cannot contain tuple variants so not tested here
26+
27+
#[derive(Deserialize)]
28+
#[serde(tag = "tag", content = "content")]
29+
pub enum AdjacentlyTagged1 {
30+
Tuple(f64, String),
31+
Flatten {
32+
#[serde(flatten)]
33+
nested: Nested,
34+
},
35+
}
36+
37+
#[derive(Deserialize)]
38+
#[serde(tag = "tag", content = "content")]
39+
pub enum AdjacentlyTagged2 {
40+
Flatten {
41+
#[serde(flatten)]
42+
nested: Nested,
43+
},
44+
Tuple(f64, String),
45+
}
46+
47+
#[derive(Deserialize)]
48+
#[serde(untagged)]
49+
pub enum Untagged1 {
50+
Tuple(f64, String),
51+
Flatten {
52+
#[serde(flatten)]
53+
nested: Nested,
54+
},
55+
}
56+
57+
#[derive(Deserialize)]
58+
#[serde(untagged)]
59+
pub enum Untagged2 {
60+
Flatten {
61+
#[serde(flatten)]
62+
nested: Nested,
63+
},
64+
Tuple(f64, String),
65+
}

test_suite/tests/test_annotations.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2380,6 +2380,56 @@ fn test_partially_untagged_enum_desugared() {
23802380
);
23812381
}
23822382

2383+
/// Regression test for https://github.com/serde-rs/serde/issues/1904
2384+
#[test]
2385+
fn test_enum_tuple_and_struct_with_flatten() {
2386+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
2387+
enum Outer {
2388+
Tuple(f64, i32),
2389+
Flatten {
2390+
#[serde(flatten)]
2391+
nested: Nested,
2392+
},
2393+
}
2394+
2395+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
2396+
struct Nested {
2397+
a: i32,
2398+
b: i32,
2399+
}
2400+
2401+
assert_tokens(
2402+
&Outer::Tuple(1.2, 3),
2403+
&[
2404+
Token::TupleVariant {
2405+
name: "Outer",
2406+
variant: "Tuple",
2407+
len: 2,
2408+
},
2409+
Token::F64(1.2),
2410+
Token::I32(3),
2411+
Token::TupleVariantEnd,
2412+
],
2413+
);
2414+
assert_tokens(
2415+
&Outer::Flatten {
2416+
nested: Nested { a: 1, b: 2 },
2417+
},
2418+
&[
2419+
Token::NewtypeVariant {
2420+
name: "Outer",
2421+
variant: "Flatten",
2422+
},
2423+
Token::Map { len: None },
2424+
Token::Str("a"),
2425+
Token::I32(1),
2426+
Token::Str("b"),
2427+
Token::I32(2),
2428+
Token::MapEnd,
2429+
],
2430+
);
2431+
}
2432+
23832433
#[test]
23842434
fn test_partially_untagged_internally_tagged_enum() {
23852435
#[derive(Serialize, Deserialize, PartialEq, Debug)]

0 commit comments

Comments
 (0)