Skip to main content

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}