@@ -160,7 +160,7 @@ fn dyn_gd_hash() {
160
160
161
161
#[ itest]
162
162
fn dyn_gd_exclusive_guard ( ) {
163
- let mut a = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
163
+ let mut a = foreign:: NodeHealth :: new_alloc ( ) . into_dyn :: < dyn Health > ( ) ;
164
164
let mut b = a. clone ( ) ;
165
165
166
166
let guard = a. dyn_bind_mut ( ) ;
@@ -187,7 +187,7 @@ fn dyn_gd_exclusive_guard() {
187
187
188
188
#[ itest]
189
189
fn dyn_gd_shared_guard ( ) {
190
- let a = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
190
+ let a = foreign:: NodeHealth :: new_alloc ( ) . into_dyn :: < dyn Health > ( ) ;
191
191
let b = a. clone ( ) ;
192
192
let mut c = a. clone ( ) ;
193
193
@@ -227,7 +227,7 @@ fn dyn_gd_downgrade() {
227
227
228
228
#[ itest]
229
229
fn dyn_gd_call_godot_method ( ) {
230
- let mut node = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
230
+ let mut node = foreign:: NodeHealth :: new_alloc ( ) . into_dyn :: < dyn Health > ( ) ;
231
231
232
232
node. set_name ( "dyn-name!" ) ;
233
233
assert_eq ! ( node. get_name( ) , "dyn-name!" . into( ) ) ;
@@ -237,7 +237,7 @@ fn dyn_gd_call_godot_method() {
237
237
238
238
#[ itest]
239
239
fn dyn_gd_pass_to_godot_api ( ) {
240
- let child = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
240
+ let child = foreign:: NodeHealth :: new_alloc ( ) . into_dyn :: < dyn Health > ( ) ;
241
241
242
242
let mut parent = Node :: new_alloc ( ) ;
243
243
parent. add_child ( & child) ;
@@ -331,7 +331,7 @@ fn dyn_gd_error_unimplemented_trait() {
331
331
332
332
#[ itest]
333
333
fn dyn_gd_free_while_dyn_bound ( ) {
334
- let mut obj = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
334
+ let mut obj: DynGd < _ , dyn Health > = foreign:: NodeHealth :: new_alloc ( ) . into_dyn ( ) ;
335
335
336
336
{
337
337
let copy = obj. clone ( ) ;
@@ -354,6 +354,18 @@ fn dyn_gd_free_while_dyn_bound() {
354
354
obj. free ( ) ;
355
355
}
356
356
357
+ #[ itest]
358
+ fn dyn_gd_multiple_traits ( ) {
359
+ let obj = foreign:: NodeHealth :: new_alloc ( ) ;
360
+ let original_id = obj. instance_id ( ) ;
361
+
362
+ let obj = obj. into_dyn :: < dyn InstanceIdProvider > ( ) . upcast :: < Node > ( ) ;
363
+ let id = obj. dyn_bind ( ) . get_id_dynamic ( ) ;
364
+ assert_eq ! ( id, original_id) ;
365
+
366
+ obj. free ( ) ;
367
+ }
368
+
357
369
// ----------------------------------------------------------------------------------------------------------------------------------------------
358
370
// Example symbols
359
371
@@ -418,3 +430,18 @@ impl Health for foreign::NodeHealth {
418
430
self . base_mut ( ) . set_meta ( "hp" , & new_hp. to_variant ( ) ) ;
419
431
}
420
432
}
433
+
434
+ // ----------------------------------------------------------------------------------------------------------------------------------------------
435
+ // Check that one class can implement two or more traits.
436
+
437
+ // Pointless trait, but tests access to object.
438
+ trait InstanceIdProvider {
439
+ fn get_id_dynamic ( & self ) -> InstanceId ;
440
+ }
441
+
442
+ #[ godot_dyn]
443
+ impl InstanceIdProvider for foreign:: NodeHealth {
444
+ fn get_id_dynamic ( & self ) -> InstanceId {
445
+ self . base ( ) . instance_id ( )
446
+ }
447
+ }
0 commit comments