Skip to main content

wowlab_wasm/
numeric.rs

1//! Explicit conversions at the JavaScript `Number` DTO boundary.
2
3pub(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}