use std::env; use std::path::PathBuf; use mlua::{Lua, Result}; #[test] fn test_module() -> Result<()> { let lua = make_lua()?; lua.load( r#" local mod = require("rust_module") assert(mod.sum(2,2) == 4) "#, ) .exec() } #[cfg(any( feature = "lua54", feature = "lua53", feature = "lua52", feature = "lua51" ))] #[test] fn test_module_from_thread() -> Result<()> { let lua = make_lua()?; lua.load( r#" local mod local co = coroutine.create(function(a, b) mod = require("rust_module") assert(mod.sum(a, b) == a + b) end) coroutine.resume(co, 3, 5) collectgarbage() assert(mod.used_memory() > 0) "#, ) .exec() } fn make_lua() -> Result { let (dylib_path, dylib_ext, separator); if cfg!(target_os = "macos") { dylib_path = env::var("DYLD_FALLBACK_LIBRARY_PATH").unwrap(); dylib_ext = "dylib"; separator = ":"; } else if cfg!(target_os = "linux") { dylib_path = env::var("LD_LIBRARY_PATH").unwrap(); dylib_ext = "so"; separator = ":"; } else if cfg!(target_os = "windows") { dylib_path = env::var("PATH").unwrap(); dylib_ext = "dll"; separator = ";"; } else { panic!("unknown target os"); }; let mut cpath = dylib_path .split(separator) .take(3) .map(|p| { let mut path = PathBuf::from(p); path.push(format!("lib?.{}", dylib_ext)); path.to_str().unwrap().to_owned() }) .collect::>() .join(";"); if cfg!(target_os = "windows") { cpath = cpath.replace("\\", "\\\\"); cpath = cpath.replace("lib?.", "?."); } let lua = unsafe { Lua::unsafe_new() }; // To be able to load C modules lua.load(&format!("package.cpath = \"{}\"", cpath)).exec()?; Ok(lua) }