Skip to content

Commit 4a25b76

Browse files
committed
Simplify signal tests; fix swallowed panic in #[func]
1 parent cf98df3 commit 4a25b76

File tree

1 file changed

+76
-53
lines changed

1 file changed

+76
-53
lines changed

itest/rust/src/builtin_tests/containers/signal_test.rs

+76-53
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::framework::itest;
99
use godot::builtin::{GString, Signal, StringName};
1010
use godot::classes::{Object, RefCounted};
1111
use godot::meta::ToGodot;
12-
use godot::obj::{Base, Gd, NewAlloc, NewGd, WithBaseField, WithSignals};
12+
use godot::obj::{Base, Gd, InstanceId, NewAlloc, NewGd, WithSignals};
1313
use godot::register::{godot_api, GodotClass};
1414
use godot::sys;
1515
use godot::sys::Global;
@@ -21,21 +21,21 @@ fn signal_basic_connect_emit() {
2121
let mut emitter = Emitter::new_alloc();
2222
let receiver = Receiver::new_alloc();
2323

24-
let args = [
25-
vec![],
26-
vec![987.to_variant()],
27-
vec![receiver.to_variant(), SIGNAL_ARG_STRING.to_variant()],
28-
];
24+
emitter.connect("signal_unit", &receiver.callable("receive_unit"));
25+
emitter.emit_signal("signal_unit", &[]);
26+
assert_eq!(receiver.bind().last_received(), LastReceived::Unit);
2927

30-
for (i, arg) in args.iter().enumerate() {
31-
let signal_name = format!("emitter_{i}");
32-
let receiver_name = format!("receiver_{i}");
28+
emitter.connect("signal_int", &receiver.callable("receive_int"));
29+
emitter.emit_signal("signal_int", &[1278.to_variant()]);
30+
assert_eq!(receiver.bind().last_received(), LastReceived::Int(1278));
3331

34-
emitter.connect(&signal_name, &receiver.callable(&receiver_name));
35-
emitter.emit_signal(&signal_name, arg);
36-
37-
assert!(receiver.bind().used[i].get());
38-
}
32+
let emitter_variant = emitter.to_variant();
33+
emitter.connect("signal_obj", &receiver.callable("receive_obj"));
34+
emitter.emit_signal("signal_obj", &[emitter_variant]);
35+
assert_eq!(
36+
receiver.bind().last_received(),
37+
LastReceived::Object(emitter.instance_id())
38+
);
3939

4040
receiver.free();
4141
emitter.free();
@@ -59,7 +59,11 @@ fn signal_symbols_internal() {
5959
assert_eq!(tracker.get(), 1234, "Emit failed (closure)");
6060

6161
// Check that instance method is invoked.
62-
assert_eq!(emitter.bind().last_received, 1234, "Emit failed (method)");
62+
assert_eq!(
63+
emitter.bind().last_received_int,
64+
1234,
65+
"Emit failed (method)"
66+
);
6367

6468
// Check that static function is invoked.
6569
assert_eq!(
@@ -76,7 +80,7 @@ fn signal_symbols_internal() {
7680
#[itest]
7781
fn signal_symbols_external() {
7882
let emitter = Emitter::new_alloc();
79-
let mut sig = emitter.signals().emitter_1();
83+
let mut sig = emitter.signals().signal_int();
8084

8185
// Local function; deliberately use a !Send type.
8286
let tracker = Rc::new(Cell::new(0));
@@ -92,7 +96,7 @@ fn signal_symbols_external() {
9296

9397
// Connect to other object.
9498
let receiver = Receiver::new_alloc();
95-
sig.connect_obj(&receiver, Receiver::receiver_1_mut);
99+
sig.connect_obj(&receiver, Receiver::receive_int_mut);
96100

97101
// Emit signal (now via tuple).
98102
sig.emit_tuple((987,));
@@ -101,11 +105,16 @@ fn signal_symbols_external() {
101105
assert_eq!(tracker.get(), 987, "Emit failed (closure)");
102106

103107
// Check that instance method is invoked.
104-
assert_eq!(emitter.bind().last_received, 987, "Emit failed (method)");
108+
assert_eq!(
109+
emitter.bind().last_received_int,
110+
987,
111+
"Emit failed (method)"
112+
);
105113

106114
// Check that *other* instance method is invoked.
107-
assert!(
108-
receiver.bind().used[1].get(),
115+
assert_eq!(
116+
receiver.bind().last_received(),
117+
LastReceived::IntMut(987),
109118
"Emit failed (other object method)"
110119
);
111120

@@ -118,7 +127,7 @@ fn signal_symbols_external() {
118127
#[itest]
119128
fn signal_symbols_external_builder() {
120129
let emitter = Emitter::new_alloc();
121-
let mut sig = emitter.signals().emitter_1();
130+
let mut sig = emitter.signals().signal_int();
122131

123132
// Self-modifying method.
124133
sig.connect_builder()
@@ -130,14 +139,14 @@ fn signal_symbols_external_builder() {
130139
let receiver_mut = Receiver::new_alloc();
131140
sig.connect_builder()
132141
.object(&receiver_mut)
133-
.method_mut(Receiver::receiver_1_mut)
142+
.method_mut(Receiver::receive_int_mut)
134143
.done();
135144

136145
// Connect to yet another object, immutable receiver.
137146
let receiver_immut = Receiver::new_alloc();
138147
sig.connect_builder()
139148
.object(&receiver_immut)
140-
.method_immut(Receiver::receiver_1)
149+
.method_immut(Receiver::receive_int)
141150
.done();
142151

143152
let tracker = Rc::new(Cell::new(0));
@@ -156,20 +165,22 @@ fn signal_symbols_external_builder() {
156165

157166
// Check that self instance method (mut) is invoked.
158167
assert_eq!(
159-
emitter.bind().last_received,
168+
emitter.bind().last_received_int,
160169
552,
161170
"Emit failed (mut method)"
162171
);
163172

164173
// Check that *other* instance method is invoked.
165-
assert!(
166-
receiver_immut.bind().used[1].get(),
174+
assert_eq!(
175+
receiver_immut.bind().last_received(),
176+
LastReceived::Int(552),
167177
"Emit failed (other object, immut method)"
168178
);
169179

170180
// Check that *other* instance method is invoked.
171-
assert!(
172-
receiver_mut.bind().used[1].get(),
181+
assert_eq!(
182+
receiver_mut.bind().last_received(),
183+
LastReceived::IntMut(552),
173184
"Emit failed (other object, mut method)"
174185
);
175186

@@ -187,7 +198,7 @@ fn signal_symbols_sync() {
187198
use std::sync::{Arc, Mutex};
188199

189200
let emitter = Emitter::new_alloc();
190-
let mut sig = emitter.signals().emitter_1();
201+
let mut sig = emitter.signals().signal_int();
191202

192203
let sync_tracker = Arc::new(Mutex::new(0));
193204
{
@@ -239,25 +250,25 @@ static LAST_STATIC_FUNCTION_ARG: Global<i64> = Global::default();
239250
struct Emitter {
240251
_base: Base<Object>,
241252
#[cfg(since_api = "4.2")]
242-
last_received: i64,
253+
last_received_int: i64,
243254
}
244255

245256
#[godot_api]
246257
impl Emitter {
247258
#[signal]
248-
fn emitter_0();
259+
fn signal_unit();
249260

250261
#[signal]
251-
fn emitter_1(arg1: i64);
262+
fn signal_int(arg1: i64);
252263

253264
#[signal]
254-
fn emitter_2(arg1: Gd<Object>, arg2: GString);
265+
fn signal_obj(arg1: Gd<Object>, arg2: GString);
255266

256267
#[func]
257268
fn self_receive(&mut self, arg1: i64) {
258269
#[cfg(since_api = "4.2")]
259270
{
260-
self.last_received = arg1;
271+
self.last_received_int = arg1;
261272
}
262273
}
263274

@@ -270,54 +281,66 @@ impl Emitter {
270281

271282
#[cfg(since_api = "4.2")]
272283
fn connect_signals_internal(&mut self, tracker: Rc<Cell<i64>>) {
273-
let mut sig = self.signals().emitter_1();
284+
let mut sig = self.signals().signal_int();
274285
sig.connect_self(Self::self_receive);
275286
sig.connect(Self::self_receive_static);
276287
sig.connect(move |i| tracker.set(i));
277288
}
278289

279290
#[cfg(since_api = "4.2")]
280291
fn emit_signals_internal(&mut self) {
281-
self.signals().emitter_1().emit(1234);
292+
self.signals().signal_int().emit(1234);
282293
}
283294
}
284295

296+
// ----------------------------------------------------------------------------------------------------------------------------------------------
297+
298+
#[derive(Default, Copy, Clone, Eq, PartialEq, Debug)]
299+
enum LastReceived {
300+
#[default]
301+
Nothing,
302+
Unit,
303+
Int(i64),
304+
IntMut(i64),
305+
Object(InstanceId),
306+
}
307+
285308
#[derive(GodotClass)]
286309
#[class(init, base=Object)]
287310
struct Receiver {
288-
used: [Cell<bool>; 3],
311+
last_received: Cell<LastReceived>,
289312
base: Base<Object>,
290313
}
291-
292314
#[godot_api]
293315
impl Receiver {
316+
fn last_received(&self) -> LastReceived {
317+
self.last_received.get()
318+
}
319+
320+
// Note: asserting inside #[func] will be caught by FFI layer and not cause a call-site panic, thus not fail the test.
321+
// Therefore, store received values and check them manually in the test.
322+
294323
#[func]
295-
fn receiver_0(&self) {
296-
self.used[0].set(true);
324+
fn receive_unit(&self) {
325+
self.last_received.set(LastReceived::Unit);
297326
}
298327

299328
#[func]
300-
fn receiver_1(&self, arg1: i64) {
301-
self.used[1].set(true);
302-
assert_eq!(arg1, 987);
329+
fn receive_int(&self, arg1: i64) {
330+
self.last_received.set(LastReceived::Int(arg1));
303331
}
304332

305-
fn receiver_1_mut(&mut self, arg1: i64) {
306-
self.used[1].set(true);
307-
assert_eq!(arg1, 987);
333+
fn receive_int_mut(&mut self, arg1: i64) {
334+
self.last_received.set(LastReceived::IntMut(arg1));
308335
}
309336

310337
#[func]
311-
fn receiver_2(&self, arg1: Gd<Object>, arg2: GString) {
312-
assert_eq!(self.base().clone(), arg1);
313-
assert_eq!(SIGNAL_ARG_STRING, arg2.to_string());
314-
315-
self.used[2].set(true);
338+
fn receive_obj(&self, obj: Gd<Object>) {
339+
self.last_received
340+
.set(LastReceived::Object(obj.instance_id()));
316341
}
317342
}
318343

319-
const SIGNAL_ARG_STRING: &str = "Signal string arg";
320-
321344
// ----------------------------------------------------------------------------------------------------------------------------------------------
322345
// 4.2+ custom callables
323346

0 commit comments

Comments
 (0)