serde-yaml/tests/test_value.rs

154 lines
3.7 KiB
Rust

#![allow(
clippy::derive_partial_eq_without_eq,
clippy::eq_op,
clippy::uninlined_format_args
)]
use indoc::indoc;
use serde::de::IntoDeserializer;
use serde::Deserialize;
use serde_derive::{Deserialize, Serialize};
use serde_yaml::{Number, Value};
#[test]
fn test_nan() {
let pos_nan = serde_yaml::from_str::<Value>(".nan").unwrap();
assert!(pos_nan.is_f64());
assert_eq!(pos_nan, pos_nan);
let neg_fake_nan = serde_yaml::from_str::<Value>("-.nan").unwrap();
assert!(neg_fake_nan.is_string());
let significand_mask = 0xF_FFFF_FFFF_FFFF;
let bits = (f64::NAN.copysign(1.0).to_bits() ^ significand_mask) | 1;
let different_pos_nan = Value::Number(Number::from(f64::from_bits(bits)));
assert_eq!(pos_nan, different_pos_nan);
}
#[test]
fn test_digits() {
let num_string = serde_yaml::from_str::<Value>("01").unwrap();
assert!(num_string.is_string());
}
#[test]
fn test_into_deserializer() {
#[derive(Debug, Deserialize, PartialEq)]
struct Test {
first: String,
second: u32,
}
let value = serde_yaml::from_str::<Value>("xyz").unwrap();
let s = String::deserialize(value.into_deserializer()).unwrap();
assert_eq!(s, "xyz");
let value = serde_yaml::from_str::<Value>("- first\n- second\n- third").unwrap();
let arr = Vec::<String>::deserialize(value.into_deserializer()).unwrap();
assert_eq!(arr, &["first", "second", "third"]);
let value = serde_yaml::from_str::<Value>("first: abc\nsecond: 99").unwrap();
let test = Test::deserialize(value.into_deserializer()).unwrap();
assert_eq!(
test,
Test {
first: "abc".to_string(),
second: 99
}
);
}
#[test]
fn test_merge() {
// From https://yaml.org/type/merge.html.
let yaml = indoc! {"
---
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
# All the following maps are equal:
- # Explicit keys
x: 1
y: 2
r: 10
label: center/big
- # Merge one map
<< : *CENTER
r: 10
label: center/big
- # Merge multiple maps
<< : [ *CENTER, *BIG ]
label: center/big
- # Override
<< : [ *BIG, *LEFT, *SMALL ]
x: 1
label: center/big
"};
let mut value: Value = serde_yaml::from_str(yaml).unwrap();
value.apply_merge().unwrap();
for i in 5..=7 {
assert_eq!(value[4], value[i]);
}
}
#[test]
fn test_debug() {
let yaml = indoc! {"
'Null': ~
Bool: true
Number: 1
String: ...
Sequence:
- true
EmptySequence: []
EmptyMapping: {}
Tagged: !tag true
"};
let value: Value = serde_yaml::from_str(yaml).unwrap();
let debug = format!("{:#?}", value);
let expected = indoc! {r#"
Mapping {
"Null": Null,
"Bool": Bool(true),
"Number": Number(1),
"String": String("..."),
"Sequence": Sequence [
Bool(true),
],
"EmptySequence": Sequence [],
"EmptyMapping": Mapping {},
"Tagged": TaggedValue {
tag: !tag,
value: Bool(true),
},
}"#
};
assert_eq!(debug, expected);
}
#[test]
fn test_tagged() {
#[derive(Serialize)]
enum Enum {
Variant(usize),
}
let value = serde_yaml::to_value(&Enum::Variant(0)).unwrap();
let deserialized: serde_yaml::Value = serde_yaml::from_value(value.clone()).unwrap();
assert_eq!(value, deserialized);
let serialized = serde_yaml::to_value(&value).unwrap();
assert_eq!(value, serialized);
}