66 */
77
88use godot:: builtin:: { Variant , vslice} ;
9- use godot:: classes:: { ClassDb , Node , RefCounted , ResourceFormatLoader , ResourceLoader } ;
9+ use godot:: classes:: { ClassDb , Node , RefCounted , ResourceFormatLoader , ResourceLoader , Script } ;
1010use godot:: global;
1111use godot:: meta:: ToGodot ;
1212use godot:: obj:: { Gd , NewAlloc , NewGd , Singleton } ;
@@ -65,12 +65,13 @@ fn object_arg_option_owned() {
6565
6666#[ itest]
6767fn object_arg_option_borrowed ( ) {
68- with_objects ( |manual, refc| {
69- let db = ClassDb :: singleton ( ) ;
70- let a = db. class_set_property ( Some ( & manual) , "name" , & Variant :: from ( "hello" ) ) ;
71- let b = db. class_set_property ( Some ( & refc) , "value" , & Variant :: from ( -123 ) ) ;
72- ( a, b)
73- } ) ;
68+ let mut node = Node :: new_alloc ( ) ;
69+ let script = create_gdscript ( "extends Node" ) ;
70+
71+ node. set_script ( Some ( & script) ) ;
72+ assert ! ( node. get_script( ) . is_some( ) ) ;
73+
74+ node. free ( ) ;
7475}
7576
7677/*
@@ -88,42 +89,43 @@ fn object_arg_option_borrowed_outer() {
8889#[ itest]
8990fn object_arg_option_borrowed_mut ( ) {
9091 // If you have an Option<&mut Gd<T>>, you can use as_deref() to get Option<&Gd<T>>.
92+ let mut node = Node :: new_alloc ( ) ;
93+ let mut script = create_gdscript ( "extends Node" ) . upcast ( ) ;
94+ let script_opt: Option < & mut Gd < Script > > = Some ( & mut script) ;
9195
92- with_objects ( |mut manual, mut refc| {
93- let db = ClassDb :: singleton ( ) ;
94-
95- let manual_opt: Option < & mut Gd < Node > > = Some ( & mut manual) ;
96- let refc_opt: Option < & mut Gd < RefcPayload > > = Some ( & mut refc) ;
96+ node. set_script ( script_opt. as_deref ( ) ) ;
97+ assert ! ( node. get_script( ) . is_some( ) ) ;
9798
98- let a = db. class_set_property ( manual_opt. as_deref ( ) , "name" , & Variant :: from ( "hello" ) ) ;
99- let b = db. class_set_property ( refc_opt. as_deref ( ) , "value" , & Variant :: from ( -123 ) ) ;
100- ( a, b)
101- } ) ;
99+ node. free ( ) ;
102100}
103101
104102#[ itest]
105103fn object_arg_option_none ( ) {
106- let manual: Option < Gd < Node > > = None ;
107- let refc: Option < Gd < RefcPayload > > = None ;
104+ let script = Some ( create_gdscript ( "extends Node" ) ) ;
105+ let no_script = None :: < Gd < Script > > ;
106+
107+ // Pass Some first, to change internal state.
108+ let mut node = Node :: new_alloc ( ) ;
109+ node. set_script ( script. as_ref ( ) ) ;
110+ assert_eq ! ( node. get_script( ) , script. map( |s| s. upcast( ) ) ) ;
108111
109- // Will emit errors but should not crash.
110- let db = ClassDb :: singleton ( ) ;
111- let error = db. class_set_property ( manual. as_ref ( ) , "name" , & Variant :: from ( "hello" ) ) ;
112- assert_eq ! ( error, global:: Error :: ERR_UNAVAILABLE ) ;
112+ // Verify None option can be passed to an engine API accepting Option<Gd<T>>.
113+ node. set_script ( no_script. as_ref ( ) ) ;
114+ assert_eq ! ( node. get_script( ) , None ) ;
113115
114- let error = db. class_set_property ( refc. as_ref ( ) , "value" , & Variant :: from ( -123 ) ) ;
115- assert_eq ! ( error, global:: Error :: ERR_UNAVAILABLE ) ;
116+ node. free ( ) ;
116117}
117118
118119#[ itest]
119120fn object_arg_null_arg ( ) {
120- // Will emit errors but should not crash.
121- let db = ClassDb :: singleton ( ) ;
122- let error = db. class_set_property ( Gd :: null_arg ( ) , "name" , & Variant :: from ( "hello" ) ) ;
123- assert_eq ! ( error, global:: Error :: ERR_UNAVAILABLE ) ;
124-
125- let error = db. class_set_property ( Gd :: null_arg ( ) , "value" , & Variant :: from ( -123 ) ) ;
126- assert_eq ! ( error, global:: Error :: ERR_UNAVAILABLE ) ;
121+ // Verify null_arg() can be passed to an engine API accepting Option<Gd<T>>.
122+ let mut node = Node :: new_alloc ( ) ;
123+ node. set_script ( & create_gdscript ( "extends Node" ) ) ;
124+ assert ! ( node. get_script( ) . is_some( ) ) ;
125+
126+ node. set_script ( Gd :: < Script > :: null_arg ( ) ) ;
127+ assert_eq ! ( node. get_script( ) , None ) ;
128+ node. free ( ) ;
127129}
128130
129131// Regression test for https://github.com/godot-rust/gdext/issues/835.
0 commit comments