scriptit 0.4.0

scriptit is a simple way to run JavaScript code in Rust (native+wasm)
use std::{cell::RefCell, rc::Rc};

use scriptit::{
    core::{
        value::{ScriptNumber, ScriptValue},
        ScriptingEnvironment,
    },
    platform::PlatformScriptingEnvironment,
};
use wasm_bindgen_test::*;

#[test]
#[wasm_bindgen_test]
fn register_count_handler() {
    let count = Rc::new(RefCell::new(0 as u32));
    let closure_count = Rc::clone(&count);
    let mut s_env = PlatformScriptingEnvironment::new();
    s_env.register_func(
        "count",
        Box::new(move |_| {
            *closure_count.borrow_mut() += 1;
            let res = *closure_count.borrow();
            Ok(ScriptValue::Number(ScriptNumber::from(res)))
        }),
    );
    let val = s_env
        .eval_expression(
            "(
                ScriptIt.funcs.count(),
                ScriptIt.funcs.count(),
                ScriptIt.funcs.count()
            )",
        )
        .unwrap();

    assert_eq!(val, ScriptValue::Number(ScriptNumber::from(3)));
}

#[test]
#[wasm_bindgen_test]
fn register_data_and_avg_handlers() {
    let count = Rc::new(RefCell::new(0 as u32));
    let data_count = Rc::clone(&count);
    let total = Rc::new(RefCell::new(0.0 as f64));
    let data_total = Rc::clone(&total);

    let mut s_env = PlatformScriptingEnvironment::new();

    s_env.register_func(
        "data",
        Box::new(move |val| {
            let val = val.get(0).unwrap().as_f64().unwrap();
            *data_count.borrow_mut() += 1;
            *data_total.borrow_mut() += val;
            Ok(ScriptValue::Null)
        }),
    );

    s_env.register_func(
        "avg",
        Box::new(move |_| {
            let val = *total.borrow() / (*count.borrow() as f64);
            Ok(ScriptValue::Number(ScriptNumber::from_f64(val).unwrap()))
        }),
    );

    let val = s_env
        .eval_expression(
            "(
                ScriptIt.funcs.data(12.5),
                ScriptIt.funcs.data(13.0),
                ScriptIt.funcs.data(13.5),
                ScriptIt.funcs.avg()
            )",
        )
        .unwrap();

    assert_eq!(val, ScriptValue::Number(ScriptNumber::from(13)));
}