1pub(crate) fn u64_to_js_number(value: u64) -> f64 {
4 wowlab_types::numeric::u64_to_f64(value)
5}
6
7pub(crate) fn js_number_to_u64(value: f64) -> u64 {
8 wowlab_types::numeric::f64_to_u64_saturating_trunc(value)
9}
10
11#[cfg(test)]
12mod tests {
13 use googletest::prelude::*;
14
15 use super::{js_number_to_u64, u64_to_js_number};
16
17 #[gtest]
18 fn javascript_timestamps_truncate_and_saturate_by_contract() -> Result<()> {
19 verify_that!(js_number_to_u64(42.75), eq(42))?;
20 verify_that!(js_number_to_u64(-1.0), eq(0))?;
21 verify_that!(js_number_to_u64(f64::NAN), eq(0))?;
22
23 verify_that!(js_number_to_u64(f64::INFINITY), eq(u64::MAX))
24 }
25
26 #[gtest]
27 fn millisecond_timestamps_round_trip_while_exactly_representable() -> Result<()> {
28 const TIMESTAMP_MS: u64 = 1_782_345_678_901;
29
30 verify_that!(
31 js_number_to_u64(u64_to_js_number(TIMESTAMP_MS)),
32 eq(TIMESTAMP_MS)
33 )
34 }
35}