@@ -823,6 +823,12 @@ struct SignalEmitter {
823
823
impl SignalEmitter {
824
824
#[ signal]
825
825
fn do_use ( ) ;
826
+ #[ signal]
827
+ fn signal_0_arg ( ) ;
828
+ #[ signal]
829
+ fn signal_1_arg ( arg1 : i64 ) ;
830
+ #[ signal]
831
+ fn signal_2_arg ( arg1 : Gd < Object > , arg2 : GodotString ) ;
826
832
}
827
833
828
834
#[ itest]
@@ -856,3 +862,69 @@ fn double_use_reference() {
856
862
double_use. free ( ) ;
857
863
emitter. free ( ) ;
858
864
}
865
+
866
+ #[ derive( GodotClass ) ]
867
+ #[ class( init, base=Object ) ]
868
+ struct SignalReceiver {
869
+ used : [ Cell < bool > ; 3 ] ,
870
+ #[ base]
871
+ base : Base < Object > ,
872
+ }
873
+
874
+ #[ godot_api]
875
+ impl SignalReceiver {
876
+ #[ func]
877
+ fn receive_0_arg ( & self ) {
878
+ self . used [ 0 ] . set ( true ) ;
879
+ }
880
+ #[ func]
881
+ fn receive_1_arg ( & self , arg1 : i64 ) {
882
+ self . used [ 1 ] . set ( true ) ;
883
+ assert_eq ! ( arg1, 987 ) ;
884
+ }
885
+ #[ func]
886
+ fn receive_2_arg ( & self , arg1 : Gd < Object > , arg2 : GodotString ) {
887
+ self . used [ 2 ] . set ( true ) ;
888
+ assert_eq ! ( self . base. share( ) , arg1) ;
889
+ assert_eq ! ( SIGNAL_ARG_STRING , arg2. to_string( ) ) ;
890
+ }
891
+ }
892
+
893
+ const SIGNAL_ARG_STRING : & str = "Signal string arg" ;
894
+
895
+ #[ itest]
896
+ /// Test that godot can call a method that is connect with a signal
897
+ fn signals ( ) {
898
+ let emitter: Gd < SignalEmitter > = Gd :: new_default ( ) ;
899
+ let receiver: Gd < SignalReceiver > = Gd :: new_default ( ) ;
900
+
901
+ let args = [
902
+ vec ! [ ] ,
903
+ vec ! [ Variant :: from( 987 ) ] ,
904
+ vec ! [
905
+ Variant :: from( receiver. share( ) ) ,
906
+ Variant :: from( SIGNAL_ARG_STRING ) ,
907
+ ] ,
908
+ ] ;
909
+
910
+ for i in 0 ..3 {
911
+ let signal_name = format ! ( "signal_{}_arg" , i) ;
912
+ let receiver_name = format ! ( "receive_{}_arg" , i) ;
913
+
914
+ emitter. share ( ) . upcast :: < Object > ( ) . connect (
915
+ signal_name. clone ( ) . into ( ) ,
916
+ receiver. callable ( receiver_name) ,
917
+ 0 ,
918
+ ) ;
919
+
920
+ emitter
921
+ . share ( )
922
+ . upcast :: < Object > ( )
923
+ . emit_signal ( signal_name. into ( ) , & args[ i] ) ;
924
+
925
+ assert ! ( receiver. bind( ) . used[ i] . get( ) ) ;
926
+ }
927
+
928
+ receiver. free ( ) ;
929
+ emitter. free ( ) ;
930
+ }
0 commit comments