-
Notifications
You must be signed in to change notification settings - Fork 127
/
Copy path522_explicit_struct_names.rs
109 lines (98 loc) · 2.95 KB
/
522_explicit_struct_names.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use ron::{
extensions::Extensions,
from_str,
ser::{to_string_pretty, PrettyConfig},
Error, Options,
};
use serde_derive::{Deserialize, Serialize};
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Id(u32);
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Position(f32, f32);
#[derive(Debug, PartialEq, Serialize, Deserialize)]
enum Query {
None,
Creature(Id),
Location(Position),
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Foo {
#[allow(unused)]
pub id: Id,
#[allow(unused)]
pub position: Position,
#[allow(unused)]
pub query: Query,
}
const EXPECT_ERROR_MESSAGE: &'static str =
"expected `Err(Error::ExpectedStructName)`, deserializer returned `Ok`";
#[test]
fn explicit_struct_names() {
let options = Options::default().with_default_extension(Extensions::EXPLICIT_STRUCT_NAMES);
let foo_ser = Foo {
id: Id(3),
position: Position(0.0, 8.72),
query: Query::Creature(Id(4)),
};
// phase 1 (regular structs)
let content_regular = r#"(
id: Id(3),
position: Position(0.0, 8.72),
query: None,
)"#;
let foo = options.from_str::<Foo>(content_regular);
assert_eq!(
foo.expect_err(EXPECT_ERROR_MESSAGE).code,
Error::ExpectedStructName("Foo".to_string())
);
// phase 2 (newtype structs)
let content_newtype = r#"Foo(
id: (3),
position: Position(0.0, 8.72),
query: None,
)"#;
let foo = options.from_str::<Foo>(content_newtype);
assert_eq!(
foo.expect_err(EXPECT_ERROR_MESSAGE).code,
Error::ExpectedStructName("Id".to_string())
);
// phase 3 (tuple structs)
let content_tuple = r#"Foo(
id: Id(3),
position: (0.0, 8.72),
query: None,
)"#;
let foo = options.from_str::<Foo>(content_tuple);
assert_eq!(
foo.expect_err(EXPECT_ERROR_MESSAGE).code,
Error::ExpectedStructName("Position".to_string())
);
// phase 4 (test without this extension)
let _foo1 = from_str::<Foo>(content_regular).unwrap();
let _foo2 = from_str::<Foo>(content_newtype).unwrap();
let _foo3 = from_str::<Foo>(content_tuple).unwrap();
// phase 5 (test serialization)
let pretty_config = PrettyConfig::new()
.extensions(Extensions::EXPLICIT_STRUCT_NAMES | Extensions::UNWRAP_VARIANT_NEWTYPES);
let content = to_string_pretty(&foo_ser, pretty_config).unwrap();
assert_eq!(
content,
r#"#![enable(unwrap_variant_newtypes)]
#![enable(explicit_struct_names)]
Foo(
id: Id(3),
position: Position(0.0, 8.72),
query: Creature(4),
)"#
);
let foo_de = from_str::<Foo>(&content);
match foo_de {
// GRCOV_EXCL_START
Err(err) => panic!(
"failed to deserialize with `explicit_struct_names` and `unwrap_variant_newtypes`: {}",
err
),
// GRCOV_EXCL_STOP
Ok(foo_de) => assert_eq!(foo_de, foo_ser),
}
}