luau 0.732.0

Safe lifetime-bound Rust embedding API for the Luau runtime
use luau::{Error, Lua, Table};

#[test]
fn sequence_iterator_advances_after_conversion_errors() -> Result<(), Error> {
    let lua = Lua::new()?;
    let table = lua.create_table()?;
    table.raw_set(1, 10)?;
    table.raw_set(2, "not an integer")?;
    table.raw_set(3, 30)?;

    let mut values = table.sequence_values::<i32>();
    assert_eq!(values.next().transpose()?, Some(10));
    assert!(matches!(
        values.next(),
        Some(Err(Error::FromLuaConversionError { .. }))
    ));
    assert_eq!(values.next().transpose()?, Some(30));
    assert!(values.next().is_none());

    Ok(())
}

#[test]
fn table_capacity_rejects_values_outside_the_vm_domain() -> Result<(), Error> {
    let lua = Lua::new()?;

    assert!(matches!(
        lua.create_table_with_capacity(usize::MAX, 0),
        Err(Error::RuntimeError(message)) if message == "table overflow"
    ));

    Ok(())
}

#[test]
fn table_len_preserves_wide_luau_integer_results() -> Result<(), Error> {
    let lua = Lua::new()?;
    let table: Table<'_> = lua
        .load(
            r#"
            return setmetatable({}, {
                __len = function()
                    return 2147483648
                end,
            })
            "#,
        )
        .eval()?;

    assert_eq!(table.len()?, 2_147_483_648);
    Ok(())
}