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