luars 0.26.2

A library for lua 5.5 runtime implementation in Rust
Documentation
use crate::*;

#[test]
fn test_miri_gc_fixed_objects_smoke() {
    let mut vm = GlobalState::new(SafeOption::default());
    vm.open_stdlib(crate::stdlib::Stdlib::All).unwrap();

    let result = vm.main_state().execute(
        r#"
        local MAX_NESTING <const> = 32

        local function render()
            local result = {}

            local function dump()
                if MAX_NESTING > 0 then
                    result[#result + 1] = "x,\n"
                end
            end

            dump()

            local last = result[#result]
            result[#result] = string.sub(last, 1, #last - 2) .. "\n"

            return table.concat(result)
        end

        assert(render() == "x\n")
        "#,
    );

    assert!(result.is_ok(), "Error: {:?}", result.err());
}

#[test]
fn test_miri_debug_traceback_smoke() {
    let mut vm = GlobalState::new(SafeOption::default());
    vm.open_stdlib(crate::stdlib::Stdlib::All).unwrap();

    let result = vm.main_state().execute(
        r#"
        local function outer()
            local trace = debug.traceback("", 2)
            assert(type(trace) == "string")
            assert(string.find(trace, "stack traceback:", 1, true) ~= nil)
        end

        outer()
        "#,
    );

    assert!(result.is_ok(), "Error: {:?}", result.err());
}

#[test]
fn test_miri_pow_basic_regression() {
    let mut vm = GlobalState::new(SafeOption::default());
    vm.open_stdlib(crate::stdlib::Stdlib::All).unwrap();

    let results = vm.main_state().execute("return 2 ^ 3").unwrap();

    assert_eq!(results[0].as_integer(), Some(8), "value: {:?}", results[0]);
}

#[test]
fn test_miri_pow_precedence_regression() {
    let mut vm = GlobalState::new(SafeOption::default());
    vm.open_stdlib(crate::stdlib::Stdlib::All).unwrap();

    let results = vm
        .main_state()
        .execute("return 2 ^ 3 ^ 2, (2 ^ 3) ^ 2")
        .unwrap();

    assert_eq!(
        results[0].as_integer(),
        Some(512),
        "value: {:?}",
        results[0]
    );
    assert_eq!(results[1].as_integer(), Some(64), "value: {:?}", results[1]);
}

#[test]
fn test_miri_pow_metamethod_regression() {
    let mut vm = GlobalState::new(SafeOption::default());
    vm.open_stdlib(crate::stdlib::Stdlib::All).unwrap();

    let result = vm.main_state().execute(
        r#"
        local a = {val = 2}
        setmetatable(a, {__pow = function(x, y) return {val = x.val ^ y} end})
        local c = a ^ 4
        assert(c.val == 16)
        "#,
    );

    assert!(result.is_ok(), "Error: {:?}", result.err());
}