pipa-js 0.1.1

A fast, minimal ES2023 JavaScript runtime built in Rust.
Documentation
use pipa::{JSRuntime, eval};

#[test]
fn debug_nested_var_resolution() {
    let mut runtime = JSRuntime::new();
    let mut ctx = runtime.new_context();

    let r1 = eval(&mut ctx, "var x = 42; function f() { return x; } f();");
    if r1.is_ok() && r1.as_ref().unwrap().is_int() {
        println!("Test 1 (var before func): {}", r1.unwrap().get_int());
    } else {
        println!("Test 1 (var before func): {:?}", r1);
    }

    let r2 = eval(&mut ctx, "function f() { return x; } var x = 42; f();");
    if r2.is_ok() && r2.as_ref().unwrap().is_int() {
        println!("Test 2 (var after func): {}", r2.unwrap().get_int());
    } else {
        println!("Test 2 (var after func): {:?}", r2);
    }

    let r3 = eval(
        &mut ctx,
        "function outer() { var x = 42; function inner() { return x; } return inner(); } outer();",
    );
    if r3.is_ok() && r3.as_ref().unwrap().is_int() {
        println!("Test 3 (func in func): {}", r3.unwrap().get_int());
    } else {
        println!("Test 3 (func in func): {:?}", r3);
    }

    let r4 = eval(
        &mut ctx,
        "var STATE = 1; function Task() { this.state = STATE; } new Task().state;",
    );
    if r4.is_ok() && r4.as_ref().unwrap().is_int() {
        println!("Test 4 (top var in constructor): {}", r4.unwrap().get_int());
    } else {
        println!("Test 4 (top var in constructor): {:?}", r4);
    }

    let r5 = eval(
        &mut ctx,
        "function TaskControlBlock() { this.state = STATE_SUSPENDED; } var STATE_SUSPENDED = 2; new TaskControlBlock().state;",
    );
    if r5.is_ok() && r5.as_ref().unwrap().is_int() {
        println!("Test 5 (Richards pattern): {}", r5.unwrap().get_int());
    } else {
        println!("Test 5 (Richards pattern): {:?}", r5);
    }
}