153 lines
3.7 KiB
Rust
153 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);
|
|
}
|