luau 0.732.0

Safe lifetime-bound Rust embedding API for the Luau runtime
use luau::{Class, Lua, Object, ObjectLike, Result, Value};

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

    // reference/tests/conformance/classes.luau: classes use __eq
    let (class, object, equal_object, different_object): (
        Class<'_>,
        Object<'_>,
        Object<'_>,
        Object<'_>,
    ) = lua
        .load(
            r#"
                class Counter
                    public value

                    function get(self)
                        return self.value
                    end

                    function __eq(self, other)
                        return self.value == other.value
                    end
                end

                return Counter, Counter { value = 41 }, Counter { value = 41 }, Counter { value = 42 }
            "#,
        )
        .call(())?;

    assert_eq!(object.get::<i32>("value")?, 41);
    object.set("value", 42)?;
    assert_eq!(object.call_method::<i32>("get", ())?, 42);
    assert_eq!(object.class()?, class);

    object.set("value", 41)?;
    assert!(object.equals(&equal_object)?);
    assert!(!object.equals(&different_object)?);
    assert!(Value::Object(object.try_clone()?).equals(&Value::Object(equal_object.try_clone()?))?);

    Ok(())
}