runmat-vm 0.4.5

RunMat virtual machine and bytecode interpreter
Documentation
#[path = "support/mod.rs"]
mod test_helpers;

use runmat_builtins::Value;
use runmat_parser::parse;
use test_helpers::execute;
use test_helpers::lower;

#[test]
fn simple_range() {
    let ast = parse("x = 1:4").unwrap();
    let hir = lower(&ast).unwrap();
    let vars = execute(&hir).unwrap();
    if let Value::Tensor(t) = &vars[0] {
        assert_eq!(t.rows(), 1);
        assert_eq!(t.cols(), 4);
        assert_eq!(t.data, vec![1.0, 2.0, 3.0, 4.0]);
    } else {
        panic!("expected tensor");
    }
}

#[test]
fn range_with_step() {
    let ast = parse("x = 1:2:5").unwrap();
    let hir = lower(&ast).unwrap();
    let vars = execute(&hir).unwrap();
    if let Value::Tensor(t) = &vars[0] {
        assert_eq!(t.data, vec![1.0, 3.0, 5.0]);
    } else {
        panic!("expected tensor");
    }
}

#[test]
fn descending_range() {
    // MATLAB: 5:-2:0 -> [5, 3, 1]
    let ast = parse("x = 5:-2:0").unwrap();
    let hir = lower(&ast).unwrap();
    let vars = execute(&hir).unwrap();
    if let Value::Tensor(t) = &vars[0] {
        assert_eq!(t.data, vec![5.0, 3.0, 1.0]);
    } else {
        panic!("expected tensor");
    }
}

#[test]
fn leading_dot_step_range_executes() {
    let ast = parse("x = 0:.1:0.3").unwrap();
    let hir = lower(&ast).unwrap();
    let vars = execute(&hir).unwrap();
    if let Value::Tensor(t) = &vars[0] {
        assert_eq!(t.rows(), 1);
        assert_eq!(t.cols(), 4);
        assert_eq!(t.data, vec![0.0, 0.1, 0.2, 0.3]);
    } else {
        panic!("expected tensor");
    }
}