use js_sys::*; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use wasm_bindgen_test::*; #[wasm_bindgen] extern "C" { #[wasm_bindgen(js_name = max, js_namespace = Math)] static MAX: Function; type ArrayPrototype; #[wasm_bindgen(method, getter, structural)] pub fn push(this: &ArrayPrototype) -> Function; #[wasm_bindgen(js_name = prototype, js_namespace = Array)] static ARRAY_PROTOTYPE2: ArrayPrototype; } #[wasm_bindgen_test] fn apply() { let args = Array::new(); args.push(&1.into()); args.push(&2.into()); args.push(&3.into()); assert_eq!(MAX.apply(&JsValue::undefined(), &args).unwrap(), 3); let arr = JsValue::from(Array::new()); let args = Array::new(); args.push(&1.into()); ARRAY_PROTOTYPE2.push().apply(&arr, &args).unwrap(); assert_eq!(Array::from(&arr).length(), 1); } #[wasm_bindgen(module = "tests/wasm/Function.js")] extern "C" { fn get_function_to_bind() -> Function; fn get_value_to_bind_to() -> JsValue; fn list() -> Function; fn add_arguments() -> Function; fn call_function(f: &Function) -> JsValue; fn call_function_arg(f: &Function, arg0: JsValue) -> JsValue; } #[wasm_bindgen_test] fn bind() { let f = get_function_to_bind(); let new_f = f.bind(&get_value_to_bind_to()); assert_eq!(call_function(&f), 1); assert_eq!(call_function(&new_f), 2); } #[wasm_bindgen_test] fn bind0() { let f = get_function_to_bind(); let new_f = f.bind0(&get_value_to_bind_to()); assert_eq!(call_function(&f), 1); assert_eq!(call_function(&new_f), 2); } #[wasm_bindgen_test] fn bind1() { let a_list = list(); let prepended_list = a_list.bind1(&JsValue::NULL, &JsValue::from(2)); assert_eq!(Array::from(&call_function(&prepended_list)).pop(), 2); let adder = add_arguments(); let add_42 = adder.bind1(&JsValue::NULL, &JsValue::from(42)); assert_eq!(call_function_arg(&add_42, JsValue::from(1)), 43); assert_eq!(call_function_arg(&add_42, JsValue::from(378)), 420); } #[wasm_bindgen_test] fn bind2() { let a_list = list(); let prepended_list = a_list.bind2(&JsValue::NULL, &JsValue::from(2), &JsValue::from(3)); let arr = Array::from(&call_function(&prepended_list)); assert_eq!(arr.pop(), 3); assert_eq!(arr.pop(), 2); let adder = add_arguments(); let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3)); assert_eq!(call_function(&always_69), 69); } #[wasm_bindgen_test] fn bind3() { let a_list = list(); let prepended_list = a_list.bind3( &JsValue::NULL, &JsValue::from(2), &JsValue::from(3), &JsValue::from(4), ); let arr = Array::from(&call_function(&prepended_list)); assert_eq!(arr.pop(), 4); assert_eq!(arr.pop(), 3); assert_eq!(arr.pop(), 2); let adder = add_arguments(); let always_69 = adder.bind2(&JsValue::NULL, &JsValue::from(66), &JsValue::from(3)); assert_eq!(call_function(&always_69), 69); } #[wasm_bindgen_test] fn length() { assert_eq!(MAX.length(), 2); assert_eq!(ARRAY_PROTOTYPE2.push().length(), 1); } #[wasm_bindgen_test] fn name() { assert_eq!(JsValue::from(MAX.name()), "max"); assert_eq!(JsValue::from(ARRAY_PROTOTYPE2.push().name()), "push"); } #[wasm_bindgen_test] fn to_string() { assert!(MAX.to_string().length() > 0); } #[wasm_bindgen_test] fn function_inheritance() { assert!(MAX.is_instance_of::()); assert!(MAX.is_instance_of::()); let _: &Object = MAX.as_ref(); }