1 use serde::Deserialize;
2 use serde_derive::{Deserialize, Serialize};
3 use serde_xml_rs::{self, from_str, to_string, EventReader, ParserConfig};
4
5 #[derive(Debug, Serialize, Deserialize, PartialEq)]
6 struct Item {
7 name: String,
8 source: String,
9 }
10
11 #[derive(Debug, Serialize, Deserialize, PartialEq)]
12 enum Node {
13 Boolean(bool),
14 Identifier { value: String, index: u32 },
15 EOF,
16 }
17
18 #[derive(Debug, Serialize, Deserialize, PartialEq)]
19 struct Nodes {
20 #[serde(rename = "$value")]
21 items: Vec<Node>,
22 }
23
24 #[test]
basic_struct()25 fn basic_struct() {
26 let src = r#"<Item><name>Banana</name><source>Store</source></Item>"#;
27 let should_be = Item {
28 name: "Banana".to_string(),
29 source: "Store".to_string(),
30 };
31
32 let item: Item = from_str(src).unwrap();
33 assert_eq!(item, should_be);
34
35 let reserialized_item = to_string(&item).unwrap();
36 assert_eq!(src, reserialized_item);
37 }
38
39 #[test]
40 #[ignore]
round_trip_list_of_enums()41 fn round_trip_list_of_enums() {
42 // Construct some inputs
43 let nodes = Nodes {
44 items: vec![
45 Node::Boolean(true),
46 Node::Identifier {
47 value: "foo".to_string(),
48 index: 5,
49 },
50 Node::EOF,
51 ],
52 };
53
54 let should_be = r#"
55 <Nodes>
56 <Boolean>
57 true
58 </Boolean>
59 <Identifier>
60 <value>foo</value>
61 <index>5</index>
62 </Identifier>
63 <EOF />
64 </Nodes>"#;
65
66 let serialized_nodes = to_string(&nodes).unwrap();
67 assert_eq!(serialized_nodes, should_be);
68
69 // Then turn it back into a `Nodes` struct and make sure it's the same
70 // as the original
71 let deserialized_nodes: Nodes = from_str(serialized_nodes.as_str()).unwrap();
72 assert_eq!(deserialized_nodes, nodes);
73 }
74
75 #[test]
whitespace_preserving_config()76 fn whitespace_preserving_config() {
77 // Test a configuration which does not clip whitespace from tags
78
79 let src = r#"
80 <Item>
81 <name> space banana </name>
82 <source> fantasy costco </source>
83 </Item>"#;
84
85 let item_should_be = Item {
86 name: " space banana ".to_string(),
87 source: " fantasy costco ".to_string(),
88 };
89 let config = ParserConfig::new()
90 .trim_whitespace(false)
91 .whitespace_to_characters(false);
92 let mut deserializer =
93 serde_xml_rs::Deserializer::new(EventReader::new_with_config(src.as_bytes(), config));
94
95 let item = Item::deserialize(&mut deserializer).unwrap();
96 assert_eq!(item, item_should_be);
97
98 // Space outside values is not preserved.
99 let serialized_should_be =
100 "<Item><name> space banana </name><source> fantasy costco </source></Item>";
101 let reserialized_item = to_string(&item).unwrap();
102 assert_eq!(reserialized_item, serialized_should_be);
103 }
104