1 #![allow(
2     clippy::derive_partial_eq_without_eq,
3     clippy::eq_op,
4     clippy::uninlined_format_args
5 )]
6 
7 use indoc::indoc;
8 use serde::de::IntoDeserializer;
9 use serde::Deserialize;
10 use serde_derive::{Deserialize, Serialize};
11 use serde_yaml::{Number, Value};
12 
13 #[test]
test_nan()14 fn test_nan() {
15     let pos_nan = serde_yaml::from_str::<Value>(".nan").unwrap();
16     assert!(pos_nan.is_f64());
17     assert_eq!(pos_nan, pos_nan);
18 
19     let neg_fake_nan = serde_yaml::from_str::<Value>("-.nan").unwrap();
20     assert!(neg_fake_nan.is_string());
21 
22     let significand_mask = 0xF_FFFF_FFFF_FFFF;
23     let bits = (f64::NAN.copysign(1.0).to_bits() ^ significand_mask) | 1;
24     let different_pos_nan = Value::Number(Number::from(f64::from_bits(bits)));
25     assert_eq!(pos_nan, different_pos_nan);
26 }
27 
28 #[test]
test_digits()29 fn test_digits() {
30     let num_string = serde_yaml::from_str::<Value>("01").unwrap();
31     assert!(num_string.is_string());
32 }
33 
34 #[test]
test_into_deserializer()35 fn test_into_deserializer() {
36     #[derive(Debug, Deserialize, PartialEq)]
37     struct Test {
38         first: String,
39         second: u32,
40     }
41 
42     let value = serde_yaml::from_str::<Value>("xyz").unwrap();
43     let s = String::deserialize(value.into_deserializer()).unwrap();
44     assert_eq!(s, "xyz");
45 
46     let value = serde_yaml::from_str::<Value>("- first\n- second\n- third").unwrap();
47     let arr = Vec::<String>::deserialize(value.into_deserializer()).unwrap();
48     assert_eq!(arr, &["first", "second", "third"]);
49 
50     let value = serde_yaml::from_str::<Value>("first: abc\nsecond: 99").unwrap();
51     let test = Test::deserialize(value.into_deserializer()).unwrap();
52     assert_eq!(
53         test,
54         Test {
55             first: "abc".to_string(),
56             second: 99
57         }
58     );
59 }
60 
61 #[test]
test_merge()62 fn test_merge() {
63     // From https://yaml.org/type/merge.html.
64     let yaml = indoc! {"
65         ---
66         - &CENTER { x: 1, y: 2 }
67         - &LEFT { x: 0, y: 2 }
68         - &BIG { r: 10 }
69         - &SMALL { r: 1 }
70 
71         # All the following maps are equal:
72 
73         - # Explicit keys
74           x: 1
75           y: 2
76           r: 10
77           label: center/big
78 
79         - # Merge one map
80           << : *CENTER
81           r: 10
82           label: center/big
83 
84         - # Merge multiple maps
85           << : [ *CENTER, *BIG ]
86           label: center/big
87 
88         - # Override
89           << : [ *BIG, *LEFT, *SMALL ]
90           x: 1
91           label: center/big
92     "};
93 
94     let mut value: Value = serde_yaml::from_str(yaml).unwrap();
95     value.apply_merge().unwrap();
96     for i in 5..=7 {
97         assert_eq!(value[4], value[i]);
98     }
99 }
100 
101 #[test]
test_debug()102 fn test_debug() {
103     let yaml = indoc! {"
104         'Null': ~
105         Bool: true
106         Number: 1
107         String: ...
108         Sequence:
109           - true
110         EmptySequence: []
111         EmptyMapping: {}
112         Tagged: !tag true
113     "};
114 
115     let value: Value = serde_yaml::from_str(yaml).unwrap();
116     let debug = format!("{:#?}", value);
117 
118     let expected = indoc! {r#"
119         Mapping {
120             "Null": Null,
121             "Bool": Bool(true),
122             "Number": Number(1),
123             "String": String("..."),
124             "Sequence": Sequence [
125                 Bool(true),
126             ],
127             "EmptySequence": Sequence [],
128             "EmptyMapping": Mapping {},
129             "Tagged": TaggedValue {
130                 tag: !tag,
131                 value: Bool(true),
132             },
133         }"#
134     };
135 
136     assert_eq!(debug, expected);
137 }
138 
139 #[test]
test_tagged()140 fn test_tagged() {
141     #[derive(Serialize)]
142     enum Enum {
143         Variant(usize),
144     }
145 
146     let value = serde_yaml::to_value(&Enum::Variant(0)).unwrap();
147 
148     let deserialized: serde_yaml::Value = serde_yaml::from_value(value.clone()).unwrap();
149     assert_eq!(value, deserialized);
150 
151     let serialized = serde_yaml::to_value(&value).unwrap();
152     assert_eq!(value, serialized);
153 }
154