use lua_rs_runtime::{Lua, LuaVersion, Value};
#[test]
fn v53_reports_its_version() {
let lua = Lua::new_versioned(LuaVersion::V53);
assert_eq!(lua.version(), LuaVersion::V53);
let from_global: String = lua.globals().get("_VERSION").unwrap();
assert_eq!(from_global, "Lua 5.3");
let from_script: String = lua.load("return _VERSION").eval().unwrap();
assert_eq!(from_script, "Lua 5.3");
}
#[test]
fn v53_runs_a_trivial_script() {
let lua = Lua::new_versioned(LuaVersion::V53);
let sum: i64 = lua
.load("local t = 0; for i = 1, 10 do t = t + i end; return t")
.eval()
.unwrap();
assert_eq!(sum, 55);
}
#[test]
fn const_attribute_parses_under_54_but_errors_under_53() {
let lua54 = Lua::new_versioned(LuaVersion::V54);
let v: i64 = lua54
.load("local x <const> = 42; return x")
.eval()
.unwrap();
assert_eq!(v, 42);
let lua53 = Lua::new_versioned(LuaVersion::V53);
let err = lua53.load("local x <const> = 42; return x").exec();
assert!(
err.is_err(),
"5.3 must reject the <const> attribute as a syntax error"
);
}
#[test]
fn close_attribute_errors_under_53() {
let lua53 = Lua::new_versioned(LuaVersion::V53);
let err = lua53.load("local x <close> = nil").exec();
assert!(err.is_err(), "5.3 must reject the <close> attribute");
}
#[test]
fn coroutine_close_present_under_54_absent_under_53() {
let lua54 = Lua::new_versioned(LuaVersion::V54);
let close54: Value = lua54.load("return coroutine.close").eval().unwrap();
assert!(
!matches!(close54, Value::Nil),
"coroutine.close should exist under 5.4"
);
let lua53 = Lua::new_versioned(LuaVersion::V53);
let is_nil: bool = lua53
.load("return coroutine.close == nil")
.eval()
.unwrap();
assert!(is_nil, "coroutine.close must be nil under 5.3");
}
#[test]
fn bit32_present_under_53_absent_under_54() {
let lua54 = Lua::new_versioned(LuaVersion::V54);
let absent: bool = lua54.load("return bit32 == nil").eval().unwrap();
assert!(absent, "bit32 must be absent under 5.4");
let lua53 = Lua::new_versioned(LuaVersion::V53);
let present: bool = lua53.load("return bit32 ~= nil").eval().unwrap();
assert!(present, "bit32 must be present under 5.3");
let banded: i64 = lua53.load("return bit32.band(0xF0, 0x3C)").eval().unwrap();
assert_eq!(banded, 0x30);
let bnot0: i64 = lua53.load("return bit32.bnot(0)").eval().unwrap();
assert_eq!(bnot0, 0xFFFF_FFFF);
}