#![cfg(all(feature = "serialize", feature = "deserialize"))]
#[test]
fn serialize_small_float_scientific_notation() {
let value = 0.000_004_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e-6");
let value = 4.512_345_6e-18_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.5123456e-18");
}
#[test]
fn serialize_large_float_scientific_notation() {
let value = 40_000_000_000_000_000_000.0_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e+19");
}
#[test]
fn serialize_positive_exponent_requires_plus_sign() {
let value = 3.12e18_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "3.12e+18");
}
#[test]
fn roundtrip_floats() {
for original in [4.0e-6, 3.12e18, 17.4] {
let yaml = serde_saphyr::to_string(&original).unwrap();
let parsed: f64 = serde_saphyr::from_str(&yaml).unwrap();
assert_eq!(original, parsed);
}
}
use regex::Regex;
#[track_caller]
fn assert_yaml11_and_yaml12_float_scalar(s: &str) {
let yaml11_base10 =
Regex::new(r"^[-+]?([0-9][0-9_]*)?\.[0-9.]*([eE][-+][0-9]+)?$").expect("valid regex");
let yaml12_json =
Regex::new(r"^-?(?:0|[1-9][0-9]*)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?$").expect("valid regex");
let yaml12_core = Regex::new(r"^[-+]?(?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:[eE][-+]?[0-9]+)?$")
.expect("valid regex");
assert!(
yaml11_base10.is_match(s),
"not YAML 1.1 base-10 float literal: {s:?}"
);
assert!(
yaml12_json.is_match(s),
"not YAML 1.2 JSON-schema float literal: {s:?}"
);
assert!(
yaml12_core.is_match(s),
"not YAML 1.2 Core-schema float literal: {s:?}"
);
}
#[test]
fn serialize_small_float_scientific_notation_2() {
let value = 0.000_004_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e-6");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = -0.000_004_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "-4.0e-6");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = 4.512_345_6e-18_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.5123456e-18");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = -4.512_345_6e-18_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "-4.5123456e-18");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = 0.000_000_004_f32;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e-9");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = -0.000_000_004_f32;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "-4.0e-9");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
}
#[test]
fn serialize_large_float_scientific_notation_2() {
let value = 40_000_000_000_000_000_000.0_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e+19");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = -40_000_000_000_000_000_000.0_f64;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "-4.0e+19");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = 40_000_000_000_000_000_000.0_f32;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "4.0e+19");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
let value = -40_000_000_000_000_000_000.0_f32;
let yaml = serde_saphyr::to_string(&value).unwrap();
assert_eq!(yaml.trim(), "-4.0e+19");
assert_yaml11_and_yaml12_float_scalar(yaml.trim());
}