| use wasm_bindgen::prelude::*; |
| use wasm_bindgen_test::*; |
| |
| #[wasm_bindgen(module = "tests/wasm/math.js")] |
| extern "C" { |
| fn js_auto_bind_math(); |
| |
| // There's an identity function called `roundtrip` in the module and we bind |
| // that one function with multiple different signatures here. Note that the |
| // return value is always `f64` to faithfully capture what was sent to JS |
| // (what we're interested in) because all JS numbers fit in `f64` anyway. |
| // This is testing what happens when we pass numbers to JS and what it sees. |
| #[wasm_bindgen(assert_no_shim, js_name = roundtrip)] |
| fn roundtrip_i8(a: i8) -> f64; |
| #[wasm_bindgen(assert_no_shim, js_name = roundtrip)] |
| fn roundtrip_i16(a: i16) -> f64; |
| #[wasm_bindgen(assert_no_shim, js_name = roundtrip)] |
| fn roundtrip_i32(a: i32) -> f64; |
| #[wasm_bindgen(assert_no_shim, js_name = roundtrip)] |
| fn roundtrip_u8(a: u8) -> f64; |
| #[wasm_bindgen(assert_no_shim, js_name = roundtrip)] |
| fn roundtrip_u16(a: u16) -> f64; |
| #[wasm_bindgen(js_name = roundtrip)] |
| fn roundtrip_u32(a: u32) -> f64; |
| |
| fn test_js_roundtrip(); |
| } |
| |
| #[wasm_bindgen] |
| pub fn math(a: f32, b: f64) -> f64 { |
| b.acos() |
| + b.asin() |
| + b.atan() |
| + b.atan2(b) |
| + b.cbrt() |
| + b.cosh() |
| + b.exp_m1() |
| + b.ln_1p() |
| + b.sinh() |
| + b.tan() |
| + b.tanh() |
| + b.hypot(b) |
| + b.cos() |
| + b.exp() |
| + b.exp2() |
| + b.mul_add(b, b) |
| + b.ln() |
| + b.log(b) |
| + b.log10() |
| + b.log2() |
| + b.powi(8) |
| + b.powf(b) |
| + b.round() |
| + b.sin() |
| + b.abs() |
| + b.signum() |
| + b.floor() |
| + b.ceil() |
| + b.trunc() |
| + b.sqrt() |
| + (b % (a as f64)) |
| + ((a.cos() |
| + a.exp() |
| + a.exp2() |
| + a.mul_add(a, a) |
| + a.ln() |
| + a.log(a) |
| + a.log10() |
| + a.log2() |
| + a.powi(8) |
| + a.powf(a) |
| + a.round() |
| + a.sin() |
| + a.abs() |
| + a.signum() |
| + a.floor() |
| + a.ceil() |
| + a.trunc() |
| + a.sqrt() |
| + (a % (b as f32))) as f64) |
| + (b + 2.0f64.powf(a as f64)) |
| } |
| |
| #[wasm_bindgen_test] |
| fn auto_bind_math() { |
| js_auto_bind_math(); |
| } |
| |
| macro_rules! t_roundtrip { |
| ($f:ident($e:expr)) => { |
| assert_eq!($f($e), $e as f64) |
| }; |
| } |
| |
| #[wasm_bindgen_test] |
| fn limits_correct() { |
| t_roundtrip!(roundtrip_i8(i8::min_value())); |
| t_roundtrip!(roundtrip_i8(0)); |
| t_roundtrip!(roundtrip_i8(i8::max_value())); |
| t_roundtrip!(roundtrip_i16(i16::min_value())); |
| t_roundtrip!(roundtrip_i16(0)); |
| t_roundtrip!(roundtrip_i16(i16::max_value())); |
| t_roundtrip!(roundtrip_i32(i32::min_value())); |
| t_roundtrip!(roundtrip_i32(0)); |
| t_roundtrip!(roundtrip_i32(i32::max_value())); |
| t_roundtrip!(roundtrip_u8(u8::min_value())); |
| t_roundtrip!(roundtrip_u8(0)); |
| t_roundtrip!(roundtrip_u8(u8::max_value())); |
| t_roundtrip!(roundtrip_u16(u16::min_value())); |
| t_roundtrip!(roundtrip_u16(0)); |
| t_roundtrip!(roundtrip_u16(u16::max_value())); |
| t_roundtrip!(roundtrip_u32(u32::min_value())); |
| t_roundtrip!(roundtrip_u32(0)); |
| t_roundtrip!(roundtrip_u32(u32::max_value())); |
| |
| test_js_roundtrip(); |
| |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_i8(a: i8) -> i8 { |
| a |
| } |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_i16(a: i16) -> i16 { |
| a |
| } |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_i32(a: i32) -> i32 { |
| a |
| } |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_u8(a: u8) -> u8 { |
| a |
| } |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_u16(a: u16) -> u16 { |
| a |
| } |
| #[wasm_bindgen] |
| pub fn rust_roundtrip_u32(a: u32) -> u32 { |
| a |
| } |
| } |