use wasm_bindgen::prelude::*;
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);
}
