#[tokio::test] async fn multilua_test() { let mut vm1 = Lua::new(); vm1.sandbox(false).unwrap(); let mut vm2 = Lua::new(); vm2.sandbox(false).unwrap(); // Set a global variable let f: LuaFunction = vm1 .load( r#" -- My first function function(args) for k, v in pairs(args) do print(k, v) end _G.obs = "some text value" return args["a"] end "#, ) .eval_async() .await .unwrap(); let luav = vm1.create_table().unwrap(); luav.set("a", 1).unwrap(); let res: i32 = f.call_async(luav).await.unwrap(); assert_eq!(res, 1); // _G.obj must persist let f: LuaFunction = vm1 .load( r#" -- If G.obs is set, return arg1 function(args) for k, v in pairs(args) do print(k, v) end if _G.obs == "some text value" then return args["arg1"] end return 3 end "#, ) .eval_async() .await .unwrap(); let res: i32 = f .call_async({ let t = vm1.create_table().unwrap(); t.set("arg1", 5).unwrap(); t }) .await .unwrap(); assert_eq!(res, 5); // But _G.obs must not be set in vm2 // _G.obj must persist let f: LuaFunction = vm2 .load( r#" -- If G.obs is set, return arg1 function(args) for k, v in pairs(args) do print(k, v) end if _G.obs == "some text value" then return args["arg1"] end return 3 end "#, ) .eval_async() .await .unwrap(); let res: i32 = f .call_async({ let t = vm2.create_table().unwrap(); t.set("arg1", 5).unwrap(); t }) .await .unwrap(); assert_eq!(res, 3); }