use wasm_bindgen_test::*;
use wasm_bindgen::prelude::*;

#[wasm_bindgen(module = "tests/wasm/node.js")]
extern {
    fn test_works();
    static FOO: JsValue;
    fn hit();
}

#[wasm_bindgen_test]
fn works() {
    hit();
    assert_eq!(FOO.as_f64(), Some(1.0));
    test_works();
}

#[wasm_bindgen]
pub struct Foo {
    contents: u32,
}

#[wasm_bindgen]
impl Foo {
    pub fn new() -> Foo {
        Foo::with_contents(0)
    }
    pub fn with_contents(a: u32) -> Foo {
        Foo { contents: a }
    }
    pub fn add(&mut self, amt: u32) -> u32 {
        self.contents += amt;
        self.contents
    }
}

#[wasm_bindgen]
pub enum Color {
    Green,
    Yellow,
    Red,
}
#[wasm_bindgen]
pub fn cycle(color: Color) -> Color {
    match color {
        Color::Green => Color::Yellow,
        Color::Yellow => Color::Red,
        Color::Red => Color::Green,
    }
}

#[wasm_bindgen]
pub fn node_math(a: f32, b: f64) -> f64 {
    b.acos() +
        b.asin() +
        b.atan() +
        b.atan2(b) +
        b.cbrt() +
        b.cosh() +
        b.exp_m1() +
        b.ln_1p() +
        b.sinh() +
        b.tan() +
        b.tanh() +
        b.hypot(b) +
        b.cos() +
        b.exp() +
        b.exp2() +
        b.mul_add(b, b) +
        b.ln() +
        b.log(b) +
        b.log10() +
        b.log2() +
        b.powi(8) +
        b.powf(b) +
        b.round() +
        b.sin() +
        b.abs() +
        b.signum() +
        b.floor() +
        b.ceil() +
        b.trunc() +
        b.sqrt() +
        (b % (a as f64)) +
        ((a.cos() +
          a.exp() +
          a.exp2() +
          a.mul_add(a, a) +
          a.ln() +
          a.log(a) +
          a.log10() +
          a.log2() +
          a.powi(8) +
          a.powf(a) +
          a.round() +
          a.sin() +
          a.abs() +
          a.signum() +
          a.floor() +
          a.ceil() +
          a.trunc() +
          a.sqrt() +
          (a % (b as f32))) as f64) +
        (b + 2.0f64.powf(a as f64))
}