mrubyedge 2.1.2

mruby/edge is yet another mruby that is specialized for running on WASM
Documentation
extern crate mrubyedge;

mod helpers;
use helpers::*;

#[test]
fn native_method_receives_args_and_block_test() {
    let code = r#"
    a = Array.new(3) { |i| i * 2 }
    b = [].push(1, 2, 3)
    [a, b]
    "#;
    let binary = mrbc_compile("native_send_args", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    let result = vm.run().unwrap();
    let outer: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        result.as_ref().try_into().unwrap();
    let a_arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        outer[0].as_ref().try_into().unwrap();
    let b_arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        outer[1].as_ref().try_into().unwrap();
    let a: Vec<i64> = a_arr
        .iter()
        .map(|r| r.as_ref().try_into().unwrap())
        .collect();
    let b: Vec<i64> = b_arr
        .iter()
        .map(|r| r.as_ref().try_into().unwrap())
        .collect();
    assert_eq!(a, vec![0, 2, 4]);
    assert_eq!(b, vec![1, 2, 3]);
}

#[test]
fn method_missing_forwards_name_and_args_to_native_test() {
    let code = r#"
    class Proxy
      def method_missing(name, *args)
        [name, args]
      end
    end

    Proxy.new.undefined_method(7, 8)
    "#;
    let binary = mrbc_compile("mm_forward", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    let result = vm.run().unwrap();
    let outer: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        result.as_ref().try_into().unwrap();
    let name: String = outer[0].as_ref().try_into().unwrap();
    let args_arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        outer[1].as_ref().try_into().unwrap();
    let args: Vec<i64> = args_arr
        .iter()
        .map(|r| r.as_ref().try_into().unwrap())
        .collect();
    assert_eq!(name, "undefined_method");
    assert_eq!(args, vec![7, 8]);
}

#[test]
fn ruby_method_receives_args_and_block_test() {
    let code = r#"
    def m(a, b)
      yield(a + b)
    end
    m(3, 4) { |s| s * 10 }
    "#;
    let binary = mrbc_compile("ruby_send_args", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    let result = vm.run().unwrap();
    let v: i64 = result.as_ref().try_into().unwrap();
    assert_eq!(v, 70);
}