@@ -9,64 +9,82 @@ extern "C" {
99    pub  fn  lua_pcall ( state :  * mut  c_void ,  nargs :  c_int ,  nresults :  c_int ,  errfunc :  c_int )  -> c_int ; 
1010} 
1111
12- pub  unsafe  fn  lua_getglobal ( state :  * mut  c_void ,  k :  * const  c_char )  { 
13-     lua_getfield ( state,  -10002  /* LUA_GLOBALSINDEX */ ,  k) ; 
14- } 
15- 
16- #[ test]  
17- fn  test_lua ( )  { 
12+ #[ cfg( test) ]  
13+ mod  tests { 
1814    use  std:: { ptr,  slice} ; 
19-     unsafe  { 
20-         let  state = luaL_newstate ( ) ; 
21-         assert ! ( state != ptr:: null_mut( ) ) ; 
2215
23-          luaL_openlibs ( state ) ; 
16+     use   super :: * ; 
2417
25-         let  version = { 
26-             lua_getglobal ( state,  "_VERSION\0 " . as_ptr ( ) . cast ( ) ) ; 
27-             let  mut  len:  c_long  = 0 ; 
28-             let  version_ptr = lua_tolstring ( state,  -1 ,  & mut  len) ; 
29-             slice:: from_raw_parts ( version_ptr as  * const  u8 ,  len as  usize ) 
30-         } ; 
18+     pub  unsafe  fn  lua_getglobal ( state :  * mut  c_void ,  k :  * const  c_char )  { 
19+         lua_getfield ( state,  -10002  /* LUA_GLOBALSINDEX */ ,  k) ; 
20+     } 
3121
32-         assert_eq ! ( version,  b"Lua 5.1" ) ; 
22+     pub  unsafe  fn  to_string < ' a > ( state :  * mut  c_void ,  index :  c_int )  -> & ' a  str  { 
23+         let  mut  len:  c_long  = 0 ; 
24+         let  str_ptr = lua_tolstring ( state,  index,  & mut  len) ; 
25+         let  bytes = slice:: from_raw_parts ( str_ptr as  * const  u8 ,  len as  usize ) ; 
26+         str:: from_utf8 ( bytes) . unwrap ( ) 
3327    } 
34- } 
3528
36- #[ test]  
37- fn  test_lua52compat ( )  { 
38-     use  std:: { ptr,  slice} ; 
39-     unsafe  { 
40-         let  state = luaL_newstate ( ) ; 
41-         assert ! ( state != ptr:: null_mut( ) ) ; 
29+     #[ test]  
30+     fn  test_lua ( )  { 
31+         unsafe  { 
32+             let  state = luaL_newstate ( ) ; 
33+             assert ! ( state != ptr:: null_mut( ) ) ; 
34+ 
35+             luaL_openlibs ( state) ; 
36+ 
37+             let  version = { 
38+                 lua_getglobal ( state,  "_VERSION\0 " . as_ptr ( ) . cast ( ) ) ; 
39+                 to_string ( state,  -1 ) 
40+             } ; 
41+             assert_eq ! ( version,  "Lua 5.1" ) ; 
42+ 
43+             let  jit_version = { 
44+                 luaL_loadstring ( state,  c"return jit.version" . as_ptr ( ) . cast ( ) ) ; 
45+                 let  ret = lua_pcall ( state,  0 ,  1 ,  0 ) ; 
46+                 assert_eq ! ( 0 ,  ret) ; 
47+                 to_string ( state,  -1 ) 
48+             } ; 
49+             let  mut  version_it = jit_version. split ( '.' ) ; 
50+             assert_eq ! ( version_it. next( ) . unwrap( ) ,  "LuaJIT 2" ) ; 
51+             assert_eq ! ( version_it. next( ) . unwrap( ) ,  "1" ) ; 
52+             assert ! ( version_it. next( ) . unwrap( ) . parse:: <u32 >( ) . is_ok( ) ) ; 
53+         } 
54+     } 
55+ 
56+     #[ test]  
57+     fn  test_lua52compat ( )  { 
58+         unsafe  { 
59+             let  state = luaL_newstate ( ) ; 
60+             assert ! ( state != ptr:: null_mut( ) ) ; 
4261
43-         luaL_openlibs ( state) ; 
62+              luaL_openlibs ( state) ; 
4463
45-         let  code = " 
46-             lua52compat = \" no\"  
47-             t = setmetatable({}, { 
48-                 __pairs = function(t) 
49-                     lua52compat = \" yes\"  
50-                     return next, t, nil 
51-                 end 
52-             }) 
53-             for k,v in pairs(t) do end 
54-         \0 " ; 
55-         let  ret1 = luaL_loadstring ( state,  code. as_ptr ( ) . cast ( ) ) ; 
56-         assert_eq ! ( 0 ,  ret1) ; 
57-         let  ret2 = lua_pcall ( state,  0 ,  0 ,  0 ) ; 
58-         assert_eq ! ( 0 ,  ret2) ; 
64+              let  code = " 
65+                  lua52compat = \" no\"  
66+                  t = setmetatable({}, { 
67+                      __pairs = function(t) 
68+                          lua52compat = \" yes\"  
69+                          return next, t, nil 
70+                      end 
71+                  }) 
72+                  for k,v in pairs(t) do end 
73+              \0 " ; 
74+              let  ret1 = luaL_loadstring ( state,  code. as_ptr ( ) . cast ( ) ) ; 
75+              assert_eq ! ( 0 ,  ret1) ; 
76+              let  ret2 = lua_pcall ( state,  0 ,  0 ,  0 ) ; 
77+              assert_eq ! ( 0 ,  ret2) ; 
5978
60-         let  lua52compat = { 
61-             lua_getglobal ( state,  "lua52compat\0 " . as_ptr ( ) . cast ( ) ) ; 
62-             let  mut  len:  c_long  = 0 ; 
63-             let  lua52compat_ptr = lua_tolstring ( state,  -1 ,  & mut  len) ; 
64-             slice:: from_raw_parts ( lua52compat_ptr as  * const  u8 ,  len as  usize ) 
65-         } ; 
79+             let  lua52compat = { 
80+                 lua_getglobal ( state,  "lua52compat\0 " . as_ptr ( ) . cast ( ) ) ; 
81+                 to_string ( state,  -1 ) 
82+             } ; 
6683
67-         #[ cfg( feature = "lua52compat" ) ]  
68-         assert_eq ! ( lua52compat,  b"yes" ) ; 
69-         #[ cfg( not( feature = "lua52compat" ) ) ]  
70-         assert_eq ! ( lua52compat,  b"no" ) ; 
84+             #[ cfg( feature = "lua52compat" ) ]  
85+             assert_eq ! ( lua52compat,  "yes" ) ; 
86+             #[ cfg( not( feature = "lua52compat" ) ) ]  
87+             assert_eq ! ( lua52compat,  "no" ) ; 
88+         } 
7189    } 
7290} 
0 commit comments