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