mrubyedge 2.1.1

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

mod helpers;
use helpers::*;

#[test]
fn numeric_comparisons_still_native_test() {
    let code = r#"
    [(1 < 2), (2 <= 2), (3 > 2.5), (2 >= 3), (1.5 < 2)]
    "#;
    let binary = mrbc_compile("numeric_comparisons", 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 arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        result.as_ref().try_into().unwrap();
    let vals: Vec<bool> = arr.iter().map(|r| r.as_ref().try_into().unwrap()).collect();
    assert_eq!(vals, vec![true, true, true, false, true]);
}

#[test]
fn string_comparison_via_spaceship_test() {
    let code = r#"
    [("a" < "b"), ("b" <= "a"), ("b" > "a"), ("a" >= "b")]
    "#;
    let binary = mrbc_compile("string_comparison", 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 arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        result.as_ref().try_into().unwrap();
    let vals: Vec<bool> = arr.iter().map(|r| r.as_ref().try_into().unwrap()).collect();
    assert_eq!(vals, vec![true, false, true, false]);
}

#[test]
fn user_defined_spaceship_drives_comparisons_test() {
    let code = r#"
    class Version
      def initialize(n)
        @n = n
      end

      def <=>(other)
        @n <=> other.n
      end

      def n
        @n
      end
    end

    [(Version.new(1) < Version.new(2)), (Version.new(2) >= Version.new(2)), (Version.new(3) > Version.new(2))]
    "#;
    let binary = mrbc_compile("version_comparison", 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 arr: Vec<std::rc::Rc<mrubyedge::yamrb::value::RObject>> =
        result.as_ref().try_into().unwrap();
    let vals: Vec<bool> = arr.iter().map(|r| r.as_ref().try_into().unwrap()).collect();
    assert_eq!(vals, vec![true, true, true]);
}

#[test]
fn incomparable_operands_raise_instead_of_panicking_test() {
    let code = r#"
    class Empty
    end
    Empty.new < Empty.new
    "#;
    let binary = mrbc_compile("incomparable", code);
    let mut rite = mrubyedge::rite::load(&binary).unwrap();
    let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
    assert!(
        vm.run().is_err(),
        "comparison without <=> must raise, not panic"
    );
}