1
use std::collections::HashMap;
2

            
3
use ron::error::Span;
4
use serde::{Deserialize, Serialize};
5

            
6
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
7
struct Main {
8
    #[serde(flatten)]
9
    required: Required,
10
    #[serde(flatten)]
11
    optional: Optional,
12

            
13
    some_other_field: u32,
14
}
15

            
16
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
17
struct Required {
18
    first: u32,
19
    second: u32,
20
}
21

            
22
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
23
struct Optional {
24
    third: Option<u32>,
25
}
26

            
27
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
28
struct MyType {
29
    first: u32,
30
    second: u32,
31
    #[serde(flatten)]
32
    everything_else: HashMap<String, ron::Value>,
33
}
34

            
35
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
36
struct AllOptional {
37
    #[serde(flatten)]
38
    everything_else: HashMap<String, ron::Value>,
39
}
40

            
41
#[derive(Deserialize, Serialize, PartialEq, Eq, Debug)]
42
enum Newtype {
43
    Main(Main),
44
    MyType(MyType),
45
    AllOptional(AllOptional),
46
}
47

            
48
#[test]
49
4
fn test_flatten_struct_into_struct() {
50
4
    let val = Main {
51
4
        required: Required {
52
4
            first: 1,
53
4
            second: 2,
54
4
        },
55
4
        optional: Optional { third: Some(3) },
56
4
        some_other_field: 1337,
57
4
    };
58

            
59
4
    let ron = ron::ser::to_string_pretty(&val, ron::ser::PrettyConfig::default()).unwrap();
60

            
61
4
    assert_eq!(
62
        ron,
63
        "{
64
    \"first\": 1,
65
    \"second\": 2,
66
    \"third\": Some(3),
67
    \"some_other_field\": 1337,
68
}"
69
    );
70

            
71
4
    let de: Main = ron::from_str(&ron).unwrap();
72

            
73
4
    assert_eq!(de, val);
74

            
75
4
    let val = Newtype::Main(Main {
76
4
        required: Required {
77
4
            first: 1,
78
4
            second: 2,
79
4
        },
80
4
        optional: Optional { third: Some(3) },
81
4
        some_other_field: 1337,
82
4
    });
83

            
84
4
    let ron = ron::ser::to_string_pretty(
85
4
        &val,
86
4
        ron::ser::PrettyConfig::default()
87
4
            .extensions(ron::extensions::Extensions::UNWRAP_VARIANT_NEWTYPES),
88
    )
89
4
    .unwrap();
90

            
91
4
    assert_eq!(
92
        ron,
93
        "#![enable(unwrap_variant_newtypes)]
94
Main({
95
    \"first\": 1,
96
    \"second\": 2,
97
    \"third\": Some(3),
98
    \"some_other_field\": 1337,
99
})"
100
    );
101

            
102
4
    let ron = ron::ser::to_string_pretty(&val, ron::ser::PrettyConfig::default()).unwrap();
103

            
104
4
    let de: Newtype = ron::from_str(&ron).unwrap();
105

            
106
4
    assert_eq!(de, val);
107

            
108
4
    assert_eq!(
109
4
        ron::from_str::<Main>(
110
4
            "{
111
4
        first\": 1,
112
4
        \"second\": 2,
113
4
        \"third\": Some(3),
114
4
        \"some_other_field\": 1337,
115
4
    }"
116
        ),
117
        Err(ron::error::SpannedError {
118
            code: ron::error::Error::ExpectedString,
119
            span: Span {
120
                start: ron::error::Position { line: 1, col: 2 },
121
                end: ron::error::Position { line: 2, col: 9 },
122
            }
123
        })
124
    );
125

            
126
4
    assert_eq!(
127
4
        ron::from_str::<Main>(
128
4
            "{
129
4
        \"first\": 1,
130
4
        \"second: 2,
131
4
        \"third\": Some(3),
132
4
        \"some_other_field\": 1337,
133
4
    }"
134
        ),
135
        Err(ron::error::SpannedError {
136
            code: ron::error::Error::ExpectedMapColon,
137
            span: Span {
138
                start: ron::error::Position { line: 4, col: 10 },
139
                end: ron::error::Position { line: 4, col: 10 },
140
            }
141
        })
142
    );
143

            
144
4
    assert_eq!(
145
4
        ron::from_str::<Main>(
146
4
            "{
147
4
        \"first\": 1,
148
4
        \"second\": 2,
149
4
        third\": Some(3),
150
4
        \"some_other_field\": 1337,
151
4
    }"
152
        ),
153
        Err(ron::error::SpannedError {
154
            code: ron::error::Error::ExpectedString,
155
            span: Span {
156
                start: ron::error::Position { line: 4, col: 9 },
157
                end: ron::error::Position { line: 4, col: 9 },
158
            }
159
        })
160
    );
161

            
162
4
    assert_eq!(
163
4
        ron::from_str::<Main>(
164
4
            "{
165
4
        \"first\": 1,
166
4
        \"second\": 2,
167
4
        \"third\": Some(3),
168
4
        \"some_other_field: 1337,
169
4
    }"
170
        ),
171
        Err(ron::error::SpannedError {
172
            code: ron::error::Error::ExpectedStringEnd,
173
            span: Span {
174
                start: ron::error::Position { line: 5, col: 9 },
175
                end: ron::error::Position { line: 5, col: 10 },
176
            }
177
        })
178
    );
179
4
}
180

            
181
#[test]
182
4
fn test_flatten_rest() {
183
4
    let val = MyType {
184
4
        first: 1,
185
4
        second: 2,
186
4
        everything_else: {
187
4
            let mut map = HashMap::new();
188
4
            map.insert(
189
4
                String::from("third"),
190
4
                ron::Value::Number(ron::value::Number::U8(3)),
191
4
            );
192
4
            map
193
4
        },
194
4
    };
195

            
196
4
    let ron = ron::ser::to_string_pretty(&val, ron::ser::PrettyConfig::default()).unwrap();
197

            
198
4
    assert_eq!(
199
        ron,
200
        "{
201
    \"first\": 1,
202
    \"second\": 2,
203
    \"third\": 3,
204
}"
205
    );
206

            
207
4
    let de: MyType = ron::from_str(&ron).unwrap();
208

            
209
4
    assert_eq!(de, val);
210

            
211
4
    let val = Newtype::MyType(MyType {
212
4
        first: 1,
213
4
        second: 2,
214
4
        everything_else: {
215
4
            let mut map = HashMap::new();
216
4
            map.insert(
217
4
                String::from("third"),
218
4
                ron::Value::Number(ron::value::Number::U8(3)),
219
4
            );
220
4
            map
221
4
        },
222
4
    });
223

            
224
4
    let ron = ron::ser::to_string_pretty(
225
4
        &val,
226
4
        ron::ser::PrettyConfig::default()
227
4
            .extensions(ron::extensions::Extensions::UNWRAP_VARIANT_NEWTYPES),
228
    )
229
4
    .unwrap();
230

            
231
4
    assert_eq!(
232
        ron,
233
        "#![enable(unwrap_variant_newtypes)]
234
MyType({
235
    \"first\": 1,
236
    \"second\": 2,
237
    \"third\": 3,
238
})"
239
    );
240

            
241
4
    let de: Newtype = ron::from_str(&ron).unwrap();
242

            
243
4
    assert_eq!(de, val);
244

            
245
4
    assert_eq!(
246
4
        ron::from_str::<MyType>(
247
4
            "{
248
4
        first\": 1,
249
4
        \"second\": 2,
250
4
        \"third\": 3,
251
4
    }"
252
        ),
253
        Err(ron::error::SpannedError {
254
            code: ron::error::Error::ExpectedString,
255
            span: Span {
256
                start: ron::error::Position { line: 1, col: 2 },
257
                end: ron::error::Position { line: 2, col: 9 },
258
            }
259
        })
260
    );
261

            
262
4
    assert_eq!(
263
4
        ron::from_str::<MyType>(
264
4
            "{
265
4
        \"first\": 1,
266
4
        \"second: 2,
267
4
        \"third\": 3,
268
4
    }"
269
        ),
270
        Err(ron::error::SpannedError {
271
            code: ron::error::Error::ExpectedMapColon,
272
            span: Span {
273
                start: ron::error::Position { line: 4, col: 10 },
274
                end: ron::error::Position { line: 4, col: 10 },
275
            }
276
        })
277
    );
278

            
279
4
    assert_eq!(
280
4
        ron::from_str::<MyType>(
281
4
            "{
282
4
        \"first\": 1,
283
4
        \"second\": 2,
284
4
        third\": 3,
285
4
    }"
286
        ),
287
        Err(ron::error::SpannedError {
288
            code: ron::error::Error::ExpectedString,
289
            span: Span {
290
                start: ron::error::Position { line: 4, col: 9 },
291
                end: ron::error::Position { line: 4, col: 9 },
292
            }
293
        })
294
    );
295

            
296
4
    assert_eq!(
297
4
        ron::from_str::<MyType>(
298
4
            "{
299
4
        \"first\": 1,
300
4
        \"second\": 2,
301
4
        \"third: 3,
302
4
    }"
303
        ),
304
        Err(ron::error::SpannedError {
305
            code: ron::error::Error::ExpectedStringEnd,
306
            span: Span {
307
                start: ron::error::Position { line: 4, col: 9 },
308
                end: ron::error::Position { line: 4, col: 10 },
309
            }
310
        })
311
    );
312
4
}
313

            
314
#[test]
315
4
fn test_flatten_only_rest() {
316
4
    let val = AllOptional {
317
4
        everything_else: HashMap::new(),
318
4
    };
319

            
320
4
    let ron = ron::ser::to_string(&val).unwrap();
321

            
322
4
    assert_eq!(ron, "{}");
323

            
324
4
    let de: AllOptional = ron::from_str(&ron).unwrap();
325

            
326
4
    assert_eq!(de, val);
327

            
328
4
    let val = Newtype::AllOptional(AllOptional {
329
4
        everything_else: HashMap::new(),
330
4
    });
331

            
332
4
    let ron = ron::ser::to_string_pretty(
333
4
        &val,
334
4
        ron::ser::PrettyConfig::default()
335
4
            .extensions(ron::extensions::Extensions::UNWRAP_VARIANT_NEWTYPES),
336
    )
337
4
    .unwrap();
338

            
339
4
    assert_eq!(
340
        ron,
341
        "#![enable(unwrap_variant_newtypes)]
342
AllOptional({
343
})"
344
    );
345

            
346
4
    let de: Newtype = ron::from_str(&ron).unwrap();
347

            
348
4
    assert_eq!(de, val);
349
4
}
350

            
351
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Eq, Serialize)]
352
#[serde(deny_unknown_fields)]
353
pub struct AvailableCards {
354
    pub left: u8,
355
    pub right: u8,
356
}
357

            
358
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq, Eq)]
359
struct MapProperties {
360
    #[serde(flatten)]
361
    cards: AvailableCards,
362
}
363

            
364
#[test]
365
4
fn test_issue_456() {
366
4
    let map_properties = MapProperties {
367
4
        cards: AvailableCards {
368
4
            ..Default::default()
369
4
        },
370
4
    };
371
4
    let ron = ron::to_string(&map_properties).unwrap();
372

            
373
4
    let de: MapProperties = ron::from_str(&ron).unwrap();
374

            
375
4
    assert_eq!(map_properties, de);
376
4
}