#![allow(clippy::unwrap_used, clippy::expect_used)]
use timeglyph::interpret;
#[test]
fn fractional_cocoa_is_identified_with_subsecond_precision() {
let cands = interpret::interpret_float(606_940_977.715_77);
let c = cands
.iter()
.find(|c| c.format_id == "cocoa_float")
.expect("cocoa_float candidate");
let r = c.rendered.as_deref().expect("rendered");
assert!(
r.starts_with("2020-03-26T18:42:57.7"),
"sub-second precision lost: {r}"
);
assert!(
(c.score - 1.0).abs() < 1e-9,
"in-window cocoa_float score {}",
c.score
);
}
#[test]
fn float_path_yields_only_float_strategy_formats() {
let cands = interpret::interpret_float(608_322_295.311_65);
assert!(!cands.is_empty(), "expected at least cocoa_float");
assert!(
cands.iter().all(|c| matches!(
c.format_id,
"cocoa_float" | "unix_float" | "ole" | "sqlite_julian" | "excel1904" | "mjd"
)),
"a non-float-strategy format leaked onto the float path: {:?}",
cands.iter().map(|c| c.format_id).collect::<Vec<_>>()
);
assert!(cands.iter().any(|c| c.format_id == "cocoa_float"));
}
#[test]
fn out_of_civil_range_float_yields_no_reading() {
let cands = interpret::interpret_float(1.0e30);
assert!(
cands.is_empty(),
"expected no readings, got {:?}",
cands.iter().map(|c| c.format_id).collect::<Vec<_>>()
);
}
#[test]
fn non_finite_float_yields_no_reading() {
assert!(interpret::interpret_float(f64::NAN).is_empty());
assert!(interpret::interpret_float(f64::INFINITY).is_empty());
}
#[test]
fn tied_float_readings_sort_deterministically_by_id() {
let tied = || -> Vec<&'static str> {
interpret::interpret_float(43900.5)
.into_iter()
.filter(|c| (c.score - 1.0).abs() < 1e-9)
.map(|c| c.format_id)
.collect()
};
let t = tied();
assert!(t.len() >= 2, "need >=2 tied readings: {t:?}");
if let (Some(ole), Some(ex)) = (
t.iter().position(|&x| x == "ole"),
t.iter().position(|&x| x == "excel1904"),
) {
assert!(
ole < ex,
"common `ole` must precede niche `excel1904` in the tie: {t:?}"
);
}
assert_eq!(t, tied(), "tie order must be deterministic");
}