use js_sys::*;
use wasm_bindgen::prelude::*;
use wasm_bindgen::JsCast;
use wasm_bindgen_test::*;

fn set2vec(s: &Set) -> Vec<JsValue> {
    let mut result = Vec::new();
    s.for_each(&mut |x, _, _| result.push(x));
    return result;
}

#[wasm_bindgen_test]
fn add() {
    let set = Set::new(&JsValue::undefined());
    set.add(&100.into());
    assert_eq!(set.size(), 1);
    assert_eq!(set2vec(&set)[0], 100);
}

#[wasm_bindgen_test]
fn clear() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());
    assert_eq!(set.size(), 3);
    set.clear();
    assert_eq!(set.size(), 0);
}

#[wasm_bindgen_test]
fn delete() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());

    assert!(set.delete(&3.into()));
    assert!(!set.delete(&3.into()));
    assert!(!set.delete(&4.into()));
}

#[wasm_bindgen_test]
fn for_each() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());

    let v = set2vec(&set);
    assert_eq!(v.len(), 3);
    assert!(v.iter().any(|v| *v == 1));
    assert!(v.iter().any(|v| *v == 2));
    assert!(v.iter().any(|v| *v == 3));
}

#[wasm_bindgen_test]
fn has() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());

    assert!(set.has(&1.into()));
    assert!(!set.has(&1.3.into()));
}

#[wasm_bindgen_test]
fn new() {
    assert_eq!(Set::new(&JsValue::undefined()).size(), 0);
}

#[wasm_bindgen_test]
fn size() {
    let set = Set::new(&JsValue::undefined());
    assert_eq!(set.size(), 0);
    set.add(&1.into());
    assert_eq!(set.size(), 1);
    set.add(&2.into());
    assert_eq!(set.size(), 2);
    set.add(&3.into());
    assert_eq!(set.size(), 3);
}

#[wasm_bindgen_test]
fn set_inheritance() {
    let set = Set::new(&JsValue::undefined());
    assert!(set.is_instance_of::<Set>());
    assert!(set.is_instance_of::<Object>());
    let _: &Object = set.as_ref();
}

#[wasm_bindgen_test]
fn keys() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());

    let list = set
        .keys()
        .into_iter()
        .map(|e| e.unwrap())
        .collect::<Vec<_>>();
    assert_eq!(list.len(), 3);
    assert!(list.iter().any(|l| *l == 1));
    assert!(list.iter().any(|l| *l == 2));
    assert!(list.iter().any(|l| *l == 3));
}

#[wasm_bindgen_test]
fn values() {
    let set = Set::new(&JsValue::undefined());
    set.add(&1.into());
    set.add(&2.into());
    set.add(&3.into());

    let list = set
        .values()
        .into_iter()
        .map(|e| e.unwrap())
        .collect::<Vec<_>>();
    assert_eq!(list.len(), 3);
    assert!(list.iter().any(|l| *l == 1));
    assert!(list.iter().any(|l| *l == 2));
    assert!(list.iter().any(|l| *l == 3));
}
