use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; use wasm_bindgen_test::*; #[wasm_bindgen(module = "tests/wasm/jscast.js")] extern "C" { type JsCast1; #[wasm_bindgen(constructor)] fn new() -> JsCast1; #[wasm_bindgen(method)] fn myval(this: &JsCast1) -> u32; type JsCast2; #[wasm_bindgen(constructor)] fn new() -> JsCast2; #[wasm_bindgen(extends = JsCast1)] type JsCast3; #[wasm_bindgen(constructor)] fn new() -> JsCast3; #[wasm_bindgen(extends = crate::jscast::JsCast1, extends = JsCast3)] type JsCast4; #[wasm_bindgen(constructor)] fn new() -> JsCast4; } #[wasm_bindgen_test] fn instanceof_works() { let a = JsCast1::new(); let b = JsCast2::new(); let c = JsCast3::new(); assert!(a.is_instance_of::<JsCast1>()); assert!(!a.is_instance_of::<JsCast2>()); assert!(!a.is_instance_of::<JsCast3>()); assert!(!b.is_instance_of::<JsCast1>()); assert!(b.is_instance_of::<JsCast2>()); assert!(!b.is_instance_of::<JsCast3>()); assert!(c.is_instance_of::<JsCast1>()); assert!(!c.is_instance_of::<JsCast2>()); assert!(c.is_instance_of::<JsCast3>()); } #[wasm_bindgen_test] fn casting() { let a = JsCast1::new(); let b = JsCast2::new(); let c = JsCast3::new(); assert!(a.dyn_ref::<JsCast1>().is_some()); assert!(a.dyn_ref::<JsCast2>().is_none()); assert!(a.dyn_ref::<JsCast3>().is_none()); assert!(b.dyn_ref::<JsCast1>().is_none()); assert!(b.dyn_ref::<JsCast2>().is_some()); assert!(b.dyn_ref::<JsCast3>().is_none()); assert!(c.dyn_ref::<JsCast1>().is_some()); assert!(c.dyn_ref::<JsCast2>().is_none()); assert!(c.dyn_ref::<JsCast3>().is_some()); } #[wasm_bindgen_test] fn method_calling() { let a = JsCast1::new(); let b = JsCast3::new(); assert_eq!(a.myval(), 1); assert_eq!(b.dyn_ref::<JsCast1>().unwrap().myval(), 3); assert_eq!(b.unchecked_ref::<JsCast1>().myval(), 3); let c: &JsCast1 = b.as_ref(); assert_eq!(c.myval(), 3); } #[wasm_bindgen_test] fn multiple_layers_of_inheritance() { let a = JsCast4::new(); assert!(a.is_instance_of::<JsCast4>()); assert!(a.is_instance_of::<JsCast3>()); assert!(a.is_instance_of::<JsCast1>()); let _: &JsCast3 = a.as_ref(); let b: &JsCast1 = a.as_ref(); assert_eq!(b.myval(), 4); }