Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bevyengine
GitHub Repository: bevyengine/bevy
Path: blob/main/crates/bevy_ecs/src/event/mod.rs
6849 views
1
//! [`Event`] functionality.
2
mod trigger;
3
4
pub use bevy_ecs_macros::{EntityEvent, Event};
5
pub use trigger::*;
6
7
use crate::{
8
component::{Component, ComponentId},
9
entity::Entity,
10
world::World,
11
};
12
use core::marker::PhantomData;
13
14
/// An [`Event`] is something that "happens" at a given moment.
15
///
16
/// To make an [`Event`] "happen", you "trigger" it on a [`World`] using [`World::trigger`] or via a [`Command`](crate::system::Command)
17
/// using [`Commands::trigger`](crate::system::Commands::trigger). This causes any [`Observer`](crate::observer::Observer) watching for that
18
/// [`Event`] to run _immediately_, as part of the [`World::trigger`] call.
19
///
20
/// First, we create an [`Event`] type, typically by deriving the trait.
21
///
22
/// ```
23
/// # use bevy_ecs::prelude::*;
24
/// #
25
/// #[derive(Event)]
26
/// struct Speak {
27
/// message: String,
28
/// }
29
/// ```
30
///
31
/// Then, we add an [`Observer`](crate::observer::Observer) to watch for this event type:
32
///
33
/// ```
34
/// # use bevy_ecs::prelude::*;
35
/// #
36
/// # #[derive(Event)]
37
/// # struct Speak {
38
/// # message: String,
39
/// # }
40
/// #
41
/// # let mut world = World::new();
42
/// #
43
/// world.add_observer(|speak: On<Speak>| {
44
/// println!("{}", speak.message);
45
/// });
46
/// ```
47
///
48
/// Finally, we trigger the event by calling [`World::trigger`](World::trigger):
49
///
50
/// ```
51
/// # use bevy_ecs::prelude::*;
52
/// #
53
/// # #[derive(Event)]
54
/// # struct Speak {
55
/// # message: String,
56
/// # }
57
/// #
58
/// # let mut world = World::new();
59
/// #
60
/// # world.add_observer(|speak: On<Speak>| {
61
/// # println!("{}", speak.message);
62
/// # });
63
/// #
64
/// # world.flush();
65
/// #
66
/// world.trigger(Speak {
67
/// message: "Hello!".to_string(),
68
/// });
69
/// ```
70
///
71
/// # Triggers
72
///
73
/// Every [`Event`] has an associated [`Trigger`] implementation (set via [`Event::Trigger`]), which defines which observers will run,
74
/// what data will be passed to them, and the order they will be run in. Unless you are an internals developer or you have very specific
75
/// needs, you don't need to worry too much about [`Trigger`]. When you derive [`Event`] (or a more specific event trait like [`EntityEvent`]),
76
/// a [`Trigger`] will be provided for you.
77
///
78
/// The [`Event`] derive defaults [`Event::Trigger`] to [`GlobalTrigger`], which will run all observers that watch for the [`Event`].
79
///
80
/// # Entity Events
81
///
82
/// For events that "target" a specific [`Entity`], see [`EntityEvent`].
83
#[diagnostic::on_unimplemented(
84
message = "`{Self}` is not an `Event`",
85
label = "invalid `Event`",
86
note = "consider annotating `{Self}` with `#[derive(Event)]`"
87
)]
88
pub trait Event: Send + Sync + Sized + 'static {
89
/// Defines which observers will run, what data will be passed to them, and the order they will be run in. See [`Trigger`] for more info.
90
type Trigger<'a>: Trigger<Self>;
91
}
92
93
/// An [`EntityEvent`] is an [`Event`] that is triggered for a specific [`EntityEvent::event_target`] entity:
94
///
95
/// ```
96
/// # use bevy_ecs::prelude::*;
97
/// # let mut world = World::default();
98
/// # let entity = world.spawn_empty().id();
99
/// #[derive(EntityEvent)]
100
/// struct Explode {
101
/// entity: Entity,
102
/// }
103
///
104
/// world.add_observer(|event: On<Explode>, mut commands: Commands| {
105
/// println!("Entity {} goes BOOM!", event.entity);
106
/// commands.entity(event.entity).despawn();
107
/// });
108
///
109
/// world.trigger(Explode { entity });
110
/// ```
111
///
112
/// [`EntityEvent`] will set [`EntityEvent::event_target`] automatically for named structs with an `entity` field name (as seen above). It also works for tuple structs
113
/// whose only field is [`Entity`]:
114
///
115
/// ```
116
/// # use bevy_ecs::prelude::*;
117
/// #[derive(EntityEvent)]
118
/// struct Explode(Entity);
119
/// ```
120
///
121
/// The [`EntityEvent::event_target`] can also be manually set using the `#[event_target]` field attribute:
122
///
123
/// ```
124
/// # use bevy_ecs::prelude::*;
125
/// #[derive(EntityEvent)]
126
/// struct Explode {
127
/// #[event_target]
128
/// exploded_entity: Entity,
129
/// }
130
/// ```
131
///
132
/// ```
133
/// # use bevy_ecs::prelude::*;
134
/// #[derive(EntityEvent)]
135
/// struct Explode(#[event_target] Entity);
136
/// ```
137
///
138
/// ## Trigger Behavior
139
///
140
/// When derived, [`EntityEvent`] defaults to setting [`Event::Trigger`] to [`EntityTrigger`], which will run all normal "untargeted"
141
/// observers added via [`World::add_observer`], just like a default [`Event`] would (see the example above).
142
///
143
/// However it will _also_ run all observers that watch _specific_ entities, which enables you to assign entity-specific logic:
144
///
145
/// ```
146
/// # use bevy_ecs::prelude::*;
147
/// # #[derive(Component, Debug)]
148
/// # struct Name(String);
149
/// # let mut world = World::default();
150
/// # let e1 = world.spawn_empty().id();
151
/// # let e2 = world.spawn_empty().id();
152
/// # #[derive(EntityEvent)]
153
/// # struct Explode {
154
/// # entity: Entity,
155
/// # }
156
/// world.entity_mut(e1).observe(|event: On<Explode>, mut commands: Commands| {
157
/// println!("Boom!");
158
/// commands.entity(event.entity).despawn();
159
/// });
160
///
161
/// world.entity_mut(e2).observe(|event: On<Explode>, mut commands: Commands| {
162
/// println!("The explosion fizzles! This entity is immune!");
163
/// });
164
/// ```
165
///
166
/// ## [`EntityEvent`] Propagation
167
///
168
/// When deriving [`EntityEvent`], you can enable "event propagation" (also known as "event bubbling") by
169
/// specifying the `#[entity_event(propagate)]` attribute:
170
///
171
/// ```
172
/// # use bevy_ecs::prelude::*;
173
/// #[derive(EntityEvent)]
174
/// #[entity_event(propagate)]
175
/// struct Click {
176
/// entity: Entity,
177
/// }
178
/// ```
179
///
180
/// This will default to using the [`ChildOf`](crate::hierarchy::ChildOf) component to propagate the [`Event`] "up"
181
/// the hierarchy (from child to parent).
182
///
183
/// You can also specify your own [`Traversal`](crate::traversal::Traversal) implementation. A common pattern is to use
184
/// [`Relationship`](crate::relationship::Relationship) components, which will follow the relationships to their root
185
/// (just be sure to avoid cycles ... these aren't detected for performance reasons):
186
///
187
/// ```
188
/// # use bevy_ecs::prelude::*;
189
/// #[derive(Component)]
190
/// #[relationship(relationship_target = ClickableBy)]
191
/// struct Clickable(Entity);
192
///
193
/// #[derive(Component)]
194
/// #[relationship_target(relationship = Clickable)]
195
/// struct ClickableBy(Vec<Entity>);
196
///
197
/// #[derive(EntityEvent)]
198
/// #[entity_event(propagate = &'static Clickable)]
199
/// struct Click {
200
/// entity: Entity,
201
/// }
202
/// ```
203
///
204
/// By default, propagation requires observers to opt-in:
205
///
206
/// ```
207
/// # use bevy_ecs::prelude::*;
208
/// #[derive(EntityEvent)]
209
/// #[entity_event(propagate)]
210
/// struct Click {
211
/// entity: Entity,
212
/// }
213
///
214
/// # let mut world = World::default();
215
/// world.add_observer(|mut click: On<Click>| {
216
/// // this will propagate the event up to the parent, using `ChildOf`
217
/// click.propagate(true);
218
/// });
219
/// ```
220
///
221
/// But you can enable auto propagation using the `#[entity_event(auto_propagate)]` attribute:
222
/// ```
223
/// # use bevy_ecs::prelude::*;
224
/// #[derive(EntityEvent)]
225
/// #[entity_event(propagate, auto_propagate)]
226
/// struct Click {
227
/// entity: Entity,
228
/// }
229
/// ```
230
///
231
/// You can also _stop_ propagation like this:
232
/// ```
233
/// # use bevy_ecs::prelude::*;
234
/// # #[derive(EntityEvent)]
235
/// # #[entity_event(propagate)]
236
/// # struct Click {
237
/// # entity: Entity,
238
/// # }
239
/// # fn is_finished_propagating() -> bool { true }
240
/// # let mut world = World::default();
241
/// world.add_observer(|mut click: On<Click>| {
242
/// if is_finished_propagating() {
243
/// click.propagate(false);
244
/// }
245
/// });
246
/// ```
247
///
248
/// ## Naming and Usage Conventions
249
///
250
/// In most cases, it is recommended to use a named struct field for the "event target" entity, and to use
251
/// a name that is descriptive as possible, as this makes events easier to understand and read.
252
///
253
/// For events with only one [`Entity`] field, `entity` is often a reasonable name. But if there are multiple
254
/// [`Entity`] fields, it is often a good idea to use a more descriptive name.
255
///
256
/// It is also generally recommended to _consume_ "event target" entities directly via their named field, as this
257
/// can make the context clearer, allows for more specific documentation hints in IDEs, and it generally reads better.
258
///
259
/// ## Manually spawning [`EntityEvent`] observers
260
///
261
/// The examples above that call [`EntityWorldMut::observe`] to add entity-specific observer logic are
262
/// just shorthand for spawning an [`Observer`] directly and manually watching the entity:
263
///
264
/// ```
265
/// # use bevy_ecs::prelude::*;
266
/// # let mut world = World::default();
267
/// # let entity = world.spawn_empty().id();
268
/// # #[derive(EntityEvent)]
269
/// # struct Explode(Entity);
270
/// let mut observer = Observer::new(|event: On<Explode>| {});
271
/// observer.watch_entity(entity);
272
/// world.spawn(observer);
273
/// ```
274
///
275
/// Note that the [`Observer`] component is not added to the entity it is observing. Observers should always be their own entities, as there
276
/// can be multiple observers of the same entity!
277
///
278
/// You can call [`Observer::watch_entity`] more than once or [`Observer::watch_entities`] to watch multiple entities with the same [`Observer`].
279
///
280
/// [`EntityWorldMut::observe`]: crate::world::EntityWorldMut::observe
281
/// [`Observer`]: crate::observer::Observer
282
/// [`Observer::watch_entity`]: crate::observer::Observer::watch_entity
283
/// [`Observer::watch_entities`]: crate::observer::Observer::watch_entities
284
pub trait EntityEvent: Event {
285
/// The [`Entity`] "target" of this [`EntityEvent`]. When triggered, this will run observers that watch for this specific entity.
286
fn event_target(&self) -> Entity;
287
/// Returns a mutable reference to the [`Entity`] "target" of this [`EntityEvent`]. When triggered, this will run observers that watch for this specific entity.
288
///
289
/// Note: In general, this should not be mutated from within an [`Observer`](crate::observer::Observer), as this will not "retarget"
290
/// the event in any of Bevy's built-in [`Trigger`] implementations.
291
fn event_target_mut(&mut self) -> &mut Entity;
292
}
293
294
impl World {
295
/// Generates the [`EventKey`] for this event type.
296
///
297
/// If this type has already been registered,
298
/// this will return the existing [`EventKey`].
299
///
300
/// This is used by various dynamically typed observer APIs,
301
/// such as [`DeferredWorld::trigger_raw`](crate::world::DeferredWorld::trigger_raw).
302
pub fn register_event_key<E: Event>(&mut self) -> EventKey {
303
EventKey(self.register_component::<EventWrapperComponent<E>>())
304
}
305
306
/// Fetches the [`EventKey`] for this event type,
307
/// if it has already been generated.
308
///
309
/// This is used by various dynamically typed observer APIs,
310
/// such as [`DeferredWorld::trigger_raw`](crate::world::DeferredWorld::trigger_raw).
311
pub fn event_key<E: Event>(&self) -> Option<EventKey> {
312
self.component_id::<EventWrapperComponent<E>>()
313
.map(EventKey)
314
}
315
}
316
317
/// An internal type that implements [`Component`] for a given [`Event`] type.
318
///
319
/// This exists so we can easily get access to a unique [`ComponentId`] for each [`Event`] type,
320
/// without requiring that [`Event`] types implement [`Component`] directly.
321
/// [`ComponentId`] is used internally as a unique identifier for events because they are:
322
///
323
/// - Unique to each event type.
324
/// - Can be quickly generated and looked up.
325
/// - Are compatible with dynamic event types, which aren't backed by a Rust type.
326
///
327
/// This type is an implementation detail and should never be made public.
328
// TODO: refactor events to store their metadata on distinct entities, rather than using `ComponentId`
329
#[derive(Component)]
330
struct EventWrapperComponent<E: Event>(PhantomData<E>);
331
332
/// A unique identifier for an [`Event`], used by [observers].
333
///
334
/// You can look up the key for your event by calling the [`World::event_key`] method.
335
///
336
/// [observers]: crate::observer
337
#[derive(Debug, Copy, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)]
338
pub struct EventKey(pub(crate) ComponentId);
339
340
/// This is deprecated. See [`MessageCursor`](crate::message::MessageCursor)
341
#[deprecated(since = "0.17.0", note = "Renamed to `MessageCursor`.")]
342
pub type EventCursor<E> = crate::message::MessageCursor<E>;
343
344
/// This is deprecated. See [`MessageMutator`](crate::message::MessageMutator)
345
#[deprecated(since = "0.17.0", note = "Renamed to `MessageMutator`.")]
346
pub type EventMutator<'w, 's, E> = crate::message::MessageMutator<'w, 's, E>;
347
348
/// This is deprecated. See [`MessageReader`](crate::message::MessageReader)
349
#[deprecated(since = "0.17.0", note = "Renamed to `MessageReader`.")]
350
pub type EventReader<'w, 's, E> = crate::message::MessageReader<'w, 's, E>;
351
352
/// This is deprecated. See [`MessageWriter`](crate::message::MessageWriter)
353
#[deprecated(since = "0.17.0", note = "Renamed to `MessageWriter`.")]
354
pub type EventWriter<'w, E> = crate::message::MessageWriter<'w, E>;
355
356
/// This is deprecated. See [`Messages`](crate::message::Messages)
357
#[deprecated(since = "0.17.0", note = "Renamed to `Messages`.")]
358
pub type Events<E> = crate::message::Messages<E>;
359
360
/// This is deprecated. See [`MessageIterator`](crate::message::MessageIterator)
361
#[deprecated(since = "0.17.0", note = "Renamed to `MessageIterator`.")]
362
pub type EventIterator<'a, E> = crate::message::MessageIterator<'a, E>;
363
364
/// This is deprecated. See [`MessageMutIterator`](crate::message::MessageMutIterator)
365
#[deprecated(since = "0.17.0", note = "Renamed to `MessageIterator`.")]
366
pub type EventMutIterator<'a, E> = crate::message::MessageMutIterator<'a, E>;
367
368
#[cfg(test)]
369
mod tests {
370
use alloc::{vec, vec::Vec};
371
use bevy_ecs::{message::*, system::assert_is_read_only_system};
372
use bevy_ecs_macros::Message;
373
374
#[derive(Message, Copy, Clone, PartialEq, Eq, Debug)]
375
struct TestEvent {
376
i: usize,
377
}
378
379
#[derive(Message, Clone, PartialEq, Debug, Default)]
380
struct EmptyTestEvent;
381
382
fn get_events<E: Message + Clone>(
383
events: &Messages<E>,
384
cursor: &mut MessageCursor<E>,
385
) -> Vec<E> {
386
cursor.read(events).cloned().collect::<Vec<E>>()
387
}
388
389
#[test]
390
fn test_events() {
391
let mut events = Messages::<TestEvent>::default();
392
let event_0 = TestEvent { i: 0 };
393
let event_1 = TestEvent { i: 1 };
394
let event_2 = TestEvent { i: 2 };
395
396
// this reader will miss event_0 and event_1 because it wont read them over the course of
397
// two updates
398
let mut reader_missed: MessageCursor<TestEvent> = events.get_cursor();
399
400
let mut reader_a: MessageCursor<TestEvent> = events.get_cursor();
401
402
events.write(event_0);
403
404
assert_eq!(
405
get_events(&events, &mut reader_a),
406
vec![event_0],
407
"reader_a created before event receives event"
408
);
409
assert_eq!(
410
get_events(&events, &mut reader_a),
411
vec![],
412
"second iteration of reader_a created before event results in zero events"
413
);
414
415
let mut reader_b: MessageCursor<TestEvent> = events.get_cursor();
416
417
assert_eq!(
418
get_events(&events, &mut reader_b),
419
vec![event_0],
420
"reader_b created after event receives event"
421
);
422
assert_eq!(
423
get_events(&events, &mut reader_b),
424
vec![],
425
"second iteration of reader_b created after event results in zero events"
426
);
427
428
events.write(event_1);
429
430
let mut reader_c = events.get_cursor();
431
432
assert_eq!(
433
get_events(&events, &mut reader_c),
434
vec![event_0, event_1],
435
"reader_c created after two events receives both events"
436
);
437
assert_eq!(
438
get_events(&events, &mut reader_c),
439
vec![],
440
"second iteration of reader_c created after two event results in zero events"
441
);
442
443
assert_eq!(
444
get_events(&events, &mut reader_a),
445
vec![event_1],
446
"reader_a receives next unread event"
447
);
448
449
events.update();
450
451
let mut reader_d = events.get_cursor();
452
453
events.write(event_2);
454
455
assert_eq!(
456
get_events(&events, &mut reader_a),
457
vec![event_2],
458
"reader_a receives event created after update"
459
);
460
assert_eq!(
461
get_events(&events, &mut reader_b),
462
vec![event_1, event_2],
463
"reader_b receives events created before and after update"
464
);
465
assert_eq!(
466
get_events(&events, &mut reader_d),
467
vec![event_0, event_1, event_2],
468
"reader_d receives all events created before and after update"
469
);
470
471
events.update();
472
473
assert_eq!(
474
get_events(&events, &mut reader_missed),
475
vec![event_2],
476
"reader_missed missed events unread after two update() calls"
477
);
478
}
479
480
// Events Collection
481
fn events_clear_and_read_impl(clear_func: impl FnOnce(&mut Messages<TestEvent>)) {
482
let mut events = Messages::<TestEvent>::default();
483
let mut reader = events.get_cursor();
484
485
assert!(reader.read(&events).next().is_none());
486
487
events.write(TestEvent { i: 0 });
488
assert_eq!(*reader.read(&events).next().unwrap(), TestEvent { i: 0 });
489
assert_eq!(reader.read(&events).next(), None);
490
491
events.write(TestEvent { i: 1 });
492
clear_func(&mut events);
493
assert!(reader.read(&events).next().is_none());
494
495
events.write(TestEvent { i: 2 });
496
events.update();
497
events.write(TestEvent { i: 3 });
498
499
assert!(reader
500
.read(&events)
501
.eq([TestEvent { i: 2 }, TestEvent { i: 3 }].iter()));
502
}
503
504
#[test]
505
fn test_events_clear_and_read() {
506
events_clear_and_read_impl(Messages::clear);
507
}
508
509
#[test]
510
fn test_events_drain_and_read() {
511
events_clear_and_read_impl(|events| {
512
assert!(events
513
.drain()
514
.eq(vec![TestEvent { i: 0 }, TestEvent { i: 1 }].into_iter()));
515
});
516
}
517
518
#[test]
519
fn test_events_write_default() {
520
let mut events = Messages::<EmptyTestEvent>::default();
521
events.write_default();
522
523
let mut reader = events.get_cursor();
524
assert_eq!(get_events(&events, &mut reader), vec![EmptyTestEvent]);
525
}
526
527
#[test]
528
fn test_write_events_ids() {
529
let mut events = Messages::<TestEvent>::default();
530
let event_0 = TestEvent { i: 0 };
531
let event_1 = TestEvent { i: 1 };
532
let event_2 = TestEvent { i: 2 };
533
534
let event_0_id = events.write(event_0);
535
536
assert_eq!(
537
events.get_message(event_0_id.id),
538
Some((&event_0, event_0_id)),
539
"Getting a sent event by ID should return the original event"
540
);
541
542
let mut event_ids = events.write_batch([event_1, event_2]);
543
544
let event_id = event_ids.next().expect("Event 1 must have been sent");
545
546
assert_eq!(
547
events.get_message(event_id.id),
548
Some((&event_1, event_id)),
549
"Getting a sent event by ID should return the original event"
550
);
551
552
let event_id = event_ids.next().expect("Event 2 must have been sent");
553
554
assert_eq!(
555
events.get_message(event_id.id),
556
Some((&event_2, event_id)),
557
"Getting a sent event by ID should return the original event"
558
);
559
560
assert!(
561
event_ids.next().is_none(),
562
"Only sent two events; got more than two IDs"
563
);
564
}
565
566
#[test]
567
fn test_event_registry_can_add_and_remove_events_to_world() {
568
use bevy_ecs::prelude::*;
569
570
let mut world = World::new();
571
MessageRegistry::register_message::<TestEvent>(&mut world);
572
573
let has_events = world.get_resource::<Messages<TestEvent>>().is_some();
574
assert!(has_events, "Should have the events resource");
575
576
MessageRegistry::deregister_messages::<TestEvent>(&mut world);
577
578
let has_events = world.get_resource::<Messages<TestEvent>>().is_some();
579
assert!(!has_events, "Should not have the events resource");
580
}
581
582
#[test]
583
fn test_events_update_drain() {
584
let mut events = Messages::<TestEvent>::default();
585
let mut reader = events.get_cursor();
586
587
events.write(TestEvent { i: 0 });
588
events.write(TestEvent { i: 1 });
589
assert_eq!(reader.read(&events).count(), 2);
590
591
let mut old_events = Vec::from_iter(events.update_drain());
592
assert!(old_events.is_empty());
593
594
events.write(TestEvent { i: 2 });
595
assert_eq!(reader.read(&events).count(), 1);
596
597
old_events.extend(events.update_drain());
598
assert_eq!(old_events.len(), 2);
599
600
old_events.extend(events.update_drain());
601
assert_eq!(
602
old_events,
603
&[TestEvent { i: 0 }, TestEvent { i: 1 }, TestEvent { i: 2 }]
604
);
605
}
606
607
#[test]
608
fn test_events_empty() {
609
let mut events = Messages::<TestEvent>::default();
610
assert!(events.is_empty());
611
612
events.write(TestEvent { i: 0 });
613
assert!(!events.is_empty());
614
615
events.update();
616
assert!(!events.is_empty());
617
618
// events are only empty after the second call to update
619
// due to double buffering.
620
events.update();
621
assert!(events.is_empty());
622
}
623
624
#[test]
625
fn test_events_extend_impl() {
626
let mut events = Messages::<TestEvent>::default();
627
let mut reader = events.get_cursor();
628
629
events.extend(vec![TestEvent { i: 0 }, TestEvent { i: 1 }]);
630
assert!(reader
631
.read(&events)
632
.eq([TestEvent { i: 0 }, TestEvent { i: 1 }].iter()));
633
}
634
635
// Cursor
636
#[test]
637
fn test_event_cursor_read() {
638
let mut events = Messages::<TestEvent>::default();
639
let mut cursor = events.get_cursor();
640
assert!(cursor.read(&events).next().is_none());
641
642
events.write(TestEvent { i: 0 });
643
let sent_event = cursor.read(&events).next().unwrap();
644
assert_eq!(sent_event, &TestEvent { i: 0 });
645
assert!(cursor.read(&events).next().is_none());
646
647
events.write(TestEvent { i: 2 });
648
let sent_event = cursor.read(&events).next().unwrap();
649
assert_eq!(sent_event, &TestEvent { i: 2 });
650
assert!(cursor.read(&events).next().is_none());
651
652
events.clear();
653
assert!(cursor.read(&events).next().is_none());
654
}
655
656
#[test]
657
fn test_event_cursor_read_mut() {
658
let mut events = Messages::<TestEvent>::default();
659
let mut write_cursor = events.get_cursor();
660
let mut read_cursor = events.get_cursor();
661
assert!(write_cursor.read_mut(&mut events).next().is_none());
662
assert!(read_cursor.read(&events).next().is_none());
663
664
events.write(TestEvent { i: 0 });
665
let sent_event = write_cursor.read_mut(&mut events).next().unwrap();
666
assert_eq!(sent_event, &mut TestEvent { i: 0 });
667
*sent_event = TestEvent { i: 1 }; // Mutate whole event
668
assert_eq!(
669
read_cursor.read(&events).next().unwrap(),
670
&TestEvent { i: 1 }
671
);
672
assert!(read_cursor.read(&events).next().is_none());
673
674
events.write(TestEvent { i: 2 });
675
let sent_event = write_cursor.read_mut(&mut events).next().unwrap();
676
assert_eq!(sent_event, &mut TestEvent { i: 2 });
677
sent_event.i = 3; // Mutate sub value
678
assert_eq!(
679
read_cursor.read(&events).next().unwrap(),
680
&TestEvent { i: 3 }
681
);
682
assert!(read_cursor.read(&events).next().is_none());
683
684
events.clear();
685
assert!(write_cursor.read(&events).next().is_none());
686
assert!(read_cursor.read(&events).next().is_none());
687
}
688
689
#[test]
690
fn test_event_cursor_clear() {
691
let mut events = Messages::<TestEvent>::default();
692
let mut reader = events.get_cursor();
693
694
events.write(TestEvent { i: 0 });
695
assert_eq!(reader.len(&events), 1);
696
reader.clear(&events);
697
assert_eq!(reader.len(&events), 0);
698
}
699
700
#[test]
701
fn test_event_cursor_len_update() {
702
let mut events = Messages::<TestEvent>::default();
703
events.write(TestEvent { i: 0 });
704
events.write(TestEvent { i: 0 });
705
let reader = events.get_cursor();
706
assert_eq!(reader.len(&events), 2);
707
events.update();
708
events.write(TestEvent { i: 0 });
709
assert_eq!(reader.len(&events), 3);
710
events.update();
711
assert_eq!(reader.len(&events), 1);
712
events.update();
713
assert!(reader.is_empty(&events));
714
}
715
716
#[test]
717
fn test_event_cursor_len_current() {
718
let mut events = Messages::<TestEvent>::default();
719
events.write(TestEvent { i: 0 });
720
let reader = events.get_cursor_current();
721
assert!(reader.is_empty(&events));
722
events.write(TestEvent { i: 0 });
723
assert_eq!(reader.len(&events), 1);
724
assert!(!reader.is_empty(&events));
725
}
726
727
#[test]
728
fn test_event_cursor_iter_len_updated() {
729
let mut events = Messages::<TestEvent>::default();
730
events.write(TestEvent { i: 0 });
731
events.write(TestEvent { i: 1 });
732
events.write(TestEvent { i: 2 });
733
let mut reader = events.get_cursor();
734
let mut iter = reader.read(&events);
735
assert_eq!(iter.len(), 3);
736
iter.next();
737
assert_eq!(iter.len(), 2);
738
iter.next();
739
assert_eq!(iter.len(), 1);
740
iter.next();
741
assert_eq!(iter.len(), 0);
742
}
743
744
#[test]
745
fn test_event_cursor_len_empty() {
746
let events = Messages::<TestEvent>::default();
747
assert_eq!(events.get_cursor().len(&events), 0);
748
assert!(events.get_cursor().is_empty(&events));
749
}
750
751
#[test]
752
fn test_event_cursor_len_filled() {
753
let mut events = Messages::<TestEvent>::default();
754
events.write(TestEvent { i: 0 });
755
assert_eq!(events.get_cursor().len(&events), 1);
756
assert!(!events.get_cursor().is_empty(&events));
757
}
758
759
#[cfg(feature = "multi_threaded")]
760
#[test]
761
fn test_event_cursor_par_read() {
762
use crate::prelude::*;
763
use core::sync::atomic::{AtomicUsize, Ordering};
764
765
#[derive(Resource)]
766
struct Counter(AtomicUsize);
767
768
let mut world = World::new();
769
world.init_resource::<Messages<TestEvent>>();
770
for _ in 0..100 {
771
world.write_message(TestEvent { i: 1 });
772
}
773
774
let mut schedule = Schedule::default();
775
776
schedule.add_systems(
777
|mut cursor: Local<MessageCursor<TestEvent>>,
778
events: Res<Messages<TestEvent>>,
779
counter: ResMut<Counter>| {
780
cursor.par_read(&events).for_each(|event| {
781
counter.0.fetch_add(event.i, Ordering::Relaxed);
782
});
783
},
784
);
785
786
world.insert_resource(Counter(AtomicUsize::new(0)));
787
schedule.run(&mut world);
788
let counter = world.remove_resource::<Counter>().unwrap();
789
assert_eq!(counter.0.into_inner(), 100);
790
791
world.insert_resource(Counter(AtomicUsize::new(0)));
792
schedule.run(&mut world);
793
let counter = world.remove_resource::<Counter>().unwrap();
794
assert_eq!(
795
counter.0.into_inner(),
796
0,
797
"par_read should have consumed events but didn't"
798
);
799
}
800
801
#[cfg(feature = "multi_threaded")]
802
#[test]
803
fn test_event_cursor_par_read_mut() {
804
use crate::prelude::*;
805
use core::sync::atomic::{AtomicUsize, Ordering};
806
807
#[derive(Resource)]
808
struct Counter(AtomicUsize);
809
810
let mut world = World::new();
811
world.init_resource::<Messages<TestEvent>>();
812
for _ in 0..100 {
813
world.write_message(TestEvent { i: 1 });
814
}
815
let mut schedule = Schedule::default();
816
schedule.add_systems(
817
|mut cursor: Local<MessageCursor<TestEvent>>,
818
mut events: ResMut<Messages<TestEvent>>,
819
counter: ResMut<Counter>| {
820
cursor.par_read_mut(&mut events).for_each(|event| {
821
event.i += 1;
822
counter.0.fetch_add(event.i, Ordering::Relaxed);
823
});
824
},
825
);
826
world.insert_resource(Counter(AtomicUsize::new(0)));
827
schedule.run(&mut world);
828
let counter = world.remove_resource::<Counter>().unwrap();
829
assert_eq!(counter.0.into_inner(), 200, "Initial run failed");
830
831
world.insert_resource(Counter(AtomicUsize::new(0)));
832
schedule.run(&mut world);
833
let counter = world.remove_resource::<Counter>().unwrap();
834
assert_eq!(
835
counter.0.into_inner(),
836
0,
837
"par_read_mut should have consumed events but didn't"
838
);
839
}
840
841
// Reader & Mutator
842
#[test]
843
fn ensure_reader_readonly() {
844
fn reader_system(_: MessageReader<EmptyTestEvent>) {}
845
846
assert_is_read_only_system(reader_system);
847
}
848
849
#[test]
850
fn test_event_reader_iter_last() {
851
use bevy_ecs::prelude::*;
852
853
let mut world = World::new();
854
world.init_resource::<Messages<TestEvent>>();
855
856
let mut reader = IntoSystem::into_system(
857
|mut events: MessageReader<TestEvent>| -> Option<TestEvent> {
858
events.read().last().copied()
859
},
860
);
861
reader.initialize(&mut world);
862
863
let last = reader.run((), &mut world).unwrap();
864
assert!(last.is_none(), "MessageReader should be empty");
865
866
world.write_message(TestEvent { i: 0 });
867
let last = reader.run((), &mut world).unwrap();
868
assert_eq!(last, Some(TestEvent { i: 0 }));
869
870
world.write_message(TestEvent { i: 1 });
871
world.write_message(TestEvent { i: 2 });
872
world.write_message(TestEvent { i: 3 });
873
let last = reader.run((), &mut world).unwrap();
874
assert_eq!(last, Some(TestEvent { i: 3 }));
875
876
let last = reader.run((), &mut world).unwrap();
877
assert!(last.is_none(), "MessageReader should be empty");
878
}
879
880
#[test]
881
fn test_event_mutator_iter_last() {
882
use bevy_ecs::prelude::*;
883
884
let mut world = World::new();
885
world.init_resource::<Messages<TestEvent>>();
886
887
let mut mutator = IntoSystem::into_system(
888
|mut events: MessageMutator<TestEvent>| -> Option<TestEvent> {
889
events.read().last().copied()
890
},
891
);
892
mutator.initialize(&mut world);
893
894
let last = mutator.run((), &mut world).unwrap();
895
assert!(last.is_none(), "EventMutator should be empty");
896
897
world.write_message(TestEvent { i: 0 });
898
let last = mutator.run((), &mut world).unwrap();
899
assert_eq!(last, Some(TestEvent { i: 0 }));
900
901
world.write_message(TestEvent { i: 1 });
902
world.write_message(TestEvent { i: 2 });
903
world.write_message(TestEvent { i: 3 });
904
let last = mutator.run((), &mut world).unwrap();
905
assert_eq!(last, Some(TestEvent { i: 3 }));
906
907
let last = mutator.run((), &mut world).unwrap();
908
assert!(last.is_none(), "EventMutator should be empty");
909
}
910
911
#[test]
912
fn test_event_reader_iter_nth() {
913
use bevy_ecs::prelude::*;
914
915
let mut world = World::new();
916
world.init_resource::<Messages<TestEvent>>();
917
918
world.write_message(TestEvent { i: 0 });
919
world.write_message(TestEvent { i: 1 });
920
world.write_message(TestEvent { i: 2 });
921
world.write_message(TestEvent { i: 3 });
922
world.write_message(TestEvent { i: 4 });
923
924
let mut schedule = Schedule::default();
925
schedule.add_systems(|mut events: MessageReader<TestEvent>| {
926
let mut iter = events.read();
927
928
assert_eq!(iter.next(), Some(&TestEvent { i: 0 }));
929
assert_eq!(iter.nth(2), Some(&TestEvent { i: 3 }));
930
assert_eq!(iter.nth(1), None);
931
932
assert!(events.is_empty());
933
});
934
schedule.run(&mut world);
935
}
936
937
#[test]
938
fn test_event_mutator_iter_nth() {
939
use bevy_ecs::prelude::*;
940
941
let mut world = World::new();
942
world.init_resource::<Messages<TestEvent>>();
943
944
world.write_message(TestEvent { i: 0 });
945
world.write_message(TestEvent { i: 1 });
946
world.write_message(TestEvent { i: 2 });
947
world.write_message(TestEvent { i: 3 });
948
world.write_message(TestEvent { i: 4 });
949
950
let mut schedule = Schedule::default();
951
schedule.add_systems(|mut events: MessageReader<TestEvent>| {
952
let mut iter = events.read();
953
954
assert_eq!(iter.next(), Some(&TestEvent { i: 0 }));
955
assert_eq!(iter.nth(2), Some(&TestEvent { i: 3 }));
956
assert_eq!(iter.nth(1), None);
957
958
assert!(events.is_empty());
959
});
960
schedule.run(&mut world);
961
}
962
}
963
964