use ts_function::ts;
use wasm_bindgen::prelude::*;
use wasm_bindgen_test::*;
#[ts]
pub type XorFunction = fn(a: js_sys::Uint8Array, b: js_sys::Uint8Array);
#[wasm_bindgen(module = "/tests/basic.js")]
extern "C" {
fn get_xor_function() -> js_sys::Function;
fn get_xor_result() -> js_sys::Uint8Array;
}
#[wasm_bindgen_test]
fn test_example_1_primary_api() {
let js_func = get_xor_function();
let func = XorFunction::from(js_func);
let a_bytes: &[u8] = &[0b10101010, 0b11110000, 0b00001111];
let b_bytes: &[u8] = &[0b01010101, 0b11001100, 0b00110011];
let a = js_sys::Uint8Array::from(a_bytes);
let b = js_sys::Uint8Array::from(b_bytes);
func.call(a, b).unwrap();
let res = get_xor_result();
let res_vec = res.to_vec();
assert_eq!(res_vec, vec![0b11111111, 0b00111100, 0b00111100]);
}
pub struct SafeFunction(pub ::js_sys::Function);
#[ts]
impl SafeFunction {
pub fn call(&self, val: f64) {
let result = self.0.call1(
&::wasm_bindgen::JsValue::NULL,
&::wasm_bindgen::JsValue::from_f64(val),
);
if let Err(e) = result {
if let Ok(err_obj) = e.dyn_into::<js_sys::Error>() {
set_handled_error(err_obj.message().into());
}
}
}
}
#[wasm_bindgen(module = "/tests/basic.js")]
extern "C" {
fn get_throwing_function() -> js_sys::Function;
fn get_handled_error() -> String;
fn set_handled_error(err: String);
}
#[wasm_bindgen_test]
fn test_example_2_escape_hatch() {
set_handled_error("".to_string());
let js_func = get_throwing_function();
let func = SafeFunction::from(js_func);
func.call(42.0);
assert_eq!(get_handled_error(), "JS error with value 42");
}
#[ts]
pub type SimpleFn = fn(msg: String);
#[ts]
struct MyFunctions {
on_event: SimpleFn,
}
#[wasm_bindgen(module = "/tests/basic.js")]
extern "C" {
fn get_simple_func() -> js_sys::Function;
fn get_state_msg() -> String;
}
#[wasm_bindgen_test]
fn test_example_3_ts_struct() {
let raw_js_obj = js_sys::Object::new();
js_sys::Reflect::set(&raw_js_obj, &"onEvent".into(), &get_simple_func()).unwrap();
let ifunctions = IMyFunctions::from(JsValue::from(raw_js_obj));
let functions: MyFunctions = ifunctions.parse();
functions
.on_event
.call("Hello from ts!".to_string())
.unwrap();
assert_eq!(get_state_msg(), "Hello from ts!");
}