Last active 1722236292

rootspring's Avatar rootspring revised this gist 1722236292. Go to revision

1 file changed, 99 insertions

lua_test.rs(file created)

@@ -0,0 +1,99 @@
1 + #[tokio::test]
2 + async fn multilua_test() {
3 + let mut vm1 = Lua::new();
4 + vm1.sandbox(false).unwrap();
5 + let mut vm2 = Lua::new();
6 + vm2.sandbox(false).unwrap();
7 +
8 + // Set a global variable
9 + let f: LuaFunction = vm1
10 + .load(
11 + r#"
12 + -- My first function
13 + function(args)
14 + for k, v in pairs(args) do
15 + print(k, v)
16 + end
17 + _G.obs = "some text value"
18 + return args["a"]
19 + end
20 + "#,
21 + )
22 + .eval_async()
23 + .await
24 + .unwrap();
25 +
26 + let luav = vm1.create_table().unwrap();
27 + luav.set("a", 1).unwrap();
28 +
29 + let res: i32 = f.call_async(luav).await.unwrap();
30 +
31 + assert_eq!(res, 1);
32 +
33 + // _G.obj must persist
34 + let f: LuaFunction = vm1
35 + .load(
36 + r#"
37 + -- If G.obs is set, return arg1
38 + function(args)
39 + for k, v in pairs(args) do
40 + print(k, v)
41 + end
42 +
43 + if _G.obs == "some text value" then
44 + return args["arg1"]
45 + end
46 +
47 + return 3
48 + end
49 + "#,
50 + )
51 + .eval_async()
52 + .await
53 + .unwrap();
54 +
55 + let res: i32 = f
56 + .call_async({
57 + let t = vm1.create_table().unwrap();
58 + t.set("arg1", 5).unwrap();
59 + t
60 + })
61 + .await
62 + .unwrap();
63 +
64 + assert_eq!(res, 5);
65 +
66 + // But _G.obs must not be set in vm2
67 + // _G.obj must persist
68 + let f: LuaFunction = vm2
69 + .load(
70 + r#"
71 + -- If G.obs is set, return arg1
72 + function(args)
73 + for k, v in pairs(args) do
74 + print(k, v)
75 + end
76 +
77 + if _G.obs == "some text value" then
78 + return args["arg1"]
79 + end
80 +
81 + return 3
82 + end
83 + "#,
84 + )
85 + .eval_async()
86 + .await
87 + .unwrap();
88 +
89 + let res: i32 = f
90 + .call_async({
91 + let t = vm2.create_table().unwrap();
92 + t.set("arg1", 5).unwrap();
93 + t
94 + })
95 + .await
96 + .unwrap();
97 +
98 + assert_eq!(res, 3);
99 + }
Newer Older