Skip to content

Commit ddcdc6a

Browse files
committed
Add test for signals with multiple parameters
1 parent 7671900 commit ddcdc6a

File tree

1 file changed

+72
-0
lines changed

1 file changed

+72
-0
lines changed

itest/rust/src/object_test.rs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -823,6 +823,12 @@ struct SignalEmitter {
823823
impl SignalEmitter {
824824
#[signal]
825825
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);
826832
}
827833

828834
#[itest]
@@ -856,3 +862,69 @@ fn double_use_reference() {
856862
double_use.free();
857863
emitter.free();
858864
}
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

Comments
 (0)