nodejs 0.4.0

Embedding Node.js in Rust
use nodejs::neon::result::NeonResult;
use nodejs::neon::types::{JsArray, JsString};
use nodejs::neon::{context::Context, types::JsNumber};

#[chazi::test(check_reach)]
fn test_simple() {
    let mut answer = 0;
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let script = cx.string("40+2");
            let forty_two = neon::reflect::eval(&mut cx, script)?;
            answer = forty_two
                .downcast_or_throw::<JsNumber, _>(&mut cx)?
                .value(&mut cx) as _;
            Ok(())
        })
    };
    assert_eq!(answer, 42);
    assert_eq!(exit_code, 0);
    chazi::reached::last()
}

#[chazi::test(check_reach)]
fn test_process_exit() {
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let script = cx.string("process.exit(40+2)");
            neon::reflect::eval(&mut cx, script)?;
            Ok(())
        })
    };
    assert_eq!(exit_code, 42);
    chazi::reached::last()
}

#[chazi::test(check_reach)]
fn test_argv() {
    let mut args = Vec::<String>::new();
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let script = cx.string("[process.argv0, ...process.argv.slice(1)]");
            let process_args = neon::reflect::eval(&mut cx, script)?;
            let process_args = process_args
                .downcast_or_throw::<JsArray, _>(&mut cx)?
                .to_vec(&mut cx)?;
            args = process_args
                .iter()
                .map(|arg| {
                    Ok(arg
                        .downcast_or_throw::<JsString, _>(&mut cx)?
                        .value(&mut cx))
                })
                .collect::<NeonResult<Vec<String>>>()?;
            Ok(())
        })
    };
    assert_eq!(args, std::env::args().collect::<Vec<String>>());
    assert_eq!(exit_code, 0);
    chazi::reached::last()
}

#[chazi::test(check_reach)]
fn test_uncaught_error() {
    let exit_code = unsafe {
        nodejs::run(|mut cx| {
            let script = cx.string("setImmediate(() => throw new Error())");
            neon::reflect::eval(&mut cx, script)?;
            Ok(())
        })
    };
    assert_eq!(exit_code, 1);
    chazi::reached::last()
}