@@ -237,6 +237,51 @@ fn test_value_to_string() -> Result<()> {
237237 Ok ( ( ) )
238238}
239239
240+ #[ test]
241+ fn test_value_weak_lua ( ) -> Result < ( ) > {
242+ let lua = Lua :: new ( ) ;
243+ let values = [
244+ Value :: String ( lua. create_string ( "hello" ) ?) ,
245+ Value :: Table ( lua. create_table ( ) ?) ,
246+ Value :: Function ( lua. create_function ( |_, ( ) | Ok ( ( ) ) ) ?) ,
247+ Value :: Thread ( lua. create_thread ( lua. create_function ( |_, ( ) | Ok ( ( ) ) ) ?) ?) ,
248+ Value :: UserData ( lua. create_any_userdata ( ( ) ) ?) ,
249+ #[ cfg( feature = "luau" ) ]
250+ Value :: Buffer ( lua. create_buffer ( b"hello" ) ?) ,
251+ ] ;
252+
253+ for value in & values {
254+ let weak = value. weak_lua ( ) . expect ( "reference value has a Lua instance" ) ;
255+ assert ! ( weak == & lua. weak( ) ) ;
256+ let upgraded = weak. try_upgrade ( ) . expect ( "Lua instance is alive" ) ;
257+ upgraded. globals ( ) . set ( "weak_lua_test" , true ) ?;
258+ assert ! ( lua. globals( ) . get:: <bool >( "weak_lua_test" ) ?) ;
259+ }
260+
261+ drop ( lua) ;
262+ for value in & values {
263+ let weak = value
264+ . weak_lua ( )
265+ . expect ( "destroyed instance still has a weak handle" ) ;
266+ assert ! ( weak. try_upgrade( ) . is_none( ) ) ;
267+ }
268+
269+ for value in [
270+ Value :: Nil ,
271+ Value :: Boolean ( true ) ,
272+ Value :: NULL ,
273+ Value :: Integer ( 1 ) ,
274+ Value :: Number ( 1.0 ) ,
275+ Value :: Error ( Box :: new ( Error :: runtime ( "test" ) ) ) ,
276+ #[ cfg( feature = "luau" ) ]
277+ Value :: Vector ( mlua:: Vector :: default ( ) ) ,
278+ ] {
279+ assert ! ( value. weak_lua( ) . is_none( ) ) ;
280+ }
281+
282+ Ok ( ( ) )
283+ }
284+
240285#[ test]
241286fn test_debug_format ( ) -> Result < ( ) > {
242287 let lua = Lua :: new ( ) ;
0 commit comments