• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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