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