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::*;
use mrubyedge::yamrb::value::RObject;
use std::rc::Rc;

#[test]
fn class_body_write_and_read_test() {
    let code = r#"
    class A
      @@count = 0
      def read
        @@count
      end
    end
    def test_cvar_class_body
      A.new.read
    end
    "#;
    let binary = mrbc_compile("cvar_class_body", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    vm.run().unwrap();

    let args = vec![];
    let result = mrb_funcall(&mut vm, None, "test_cvar_class_body", &args).unwrap();
    let result: i64 = result.as_ref().try_into().unwrap();
    assert_eq!(result, 0);
}

#[test]
fn cvar_inheritance_shares_definition_site_test() {
    let code = r#"
    class A
      @@count = 0
      def bump
        @@count += 1
      end
      def get
        @@count
      end
    end
    class B < A
    end
    def test_cvar_inheritance
      b = B.new
      b.bump
      b.bump
      b.get
    end
    "#;
    let binary = mrbc_compile("cvar_inheritance_shared", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    vm.run().unwrap();

    let args = vec![];
    let result = mrb_funcall(&mut vm, None, "test_cvar_inheritance", &args).unwrap();
    let result: i64 = result.as_ref().try_into().unwrap();
    assert_eq!(result, 2);
}

#[test]
fn cvar_read_from_parent_through_subclass_test() {
    let code = r#"
    class A
      @@name = "parent"
    end
    class B < A
      def name
        @@name
      end
    end
    def test_cvar_read_parent
      B.new.name
    end
    "#;
    let binary = mrbc_compile("cvar_read_parent", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    vm.run().unwrap();

    let args = vec![];
    let result = mrb_funcall(&mut vm, None, "test_cvar_read_parent", &args).unwrap();
    let result: String = result.as_ref().try_into().unwrap();
    assert_eq!(result, "parent");
}

#[test]
fn cvar_uninitialized_raises_name_error_test() {
    let code = r#"
    class C
      @@missing
    end
    "#;
    let binary = mrbc_compile("cvar_uninitialized", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    assert!(
        vm.run().is_err(),
        "uninitialized class variable should error"
    );
}

#[test]
fn cvar_separate_tables_per_class_test() {
    let code = r#"
    class A
      @@x = 1
      def getx
        @@x
      end
    end
    class B
      @@x = 2
      def getx
        @@x
      end
    end
    def test_cvar_separate
      [A.new.getx, B.new.getx]
    end
    "#;
    let binary = mrbc_compile("cvar_separate_tables", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    vm.run().unwrap();

    let args = vec![];
    let result = mrb_funcall(&mut vm, None, "test_cvar_separate", &args).unwrap();
    let outer: Vec<Rc<RObject>> = result.as_ref().try_into().unwrap();
    assert_eq!(outer.len(), 2);
    let a: i64 = outer[0].as_ref().try_into().unwrap();
    let b: i64 = outer[1].as_ref().try_into().unwrap();
    assert_eq!((a, b), (1, 2));
}