1mod trigger;
3
4pub use bevy_ecs_macros::{EntityEvent, Event};
5pub use trigger::*;
6
7use crate::{
8 component::{Component, ComponentId},
9 entity::Entity,
10 world::World,
11};
12use core::marker::PhantomData;
13
14#[diagnostic::on_unimplemented(
84 message = "`{Self}` is not an `Event`",
85 label = "invalid `Event`",
86 note = "consider annotating `{Self}` with `#[derive(Event)]`"
87)]
88pub trait Event: Send + Sync + Sized + 'static {
89 type Trigger<'a>: Trigger<Self>;
91}
92
93pub trait EntityEvent: Event {
328 fn event_target(&self) -> Entity;
330}
331
332pub trait SetEntityEventTarget: EntityEvent {
340 fn set_event_target(&mut self, entity: Entity);
345}
346
347impl World {
348 pub fn register_event_key<E: Event>(&mut self) -> EventKey {
356 EventKey(self.register_component::<EventWrapperComponent<E>>())
357 }
358
359 pub fn event_key<E: Event>(&self) -> Option<EventKey> {
365 self.component_id::<EventWrapperComponent<E>>()
366 .map(EventKey)
367 }
368}
369
370#[derive(Component)]
383struct EventWrapperComponent<E: Event>(PhantomData<E>);
384
385#[derive(Debug, Copy, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)]
395pub struct EventKey(pub(crate) ComponentId);
396
397impl EventKey {
398 #[inline]
412 pub const unsafe fn new(component_id: ComponentId) -> Self {
413 Self(component_id)
414 }
415
416 #[inline]
418 pub const fn component_id(self) -> ComponentId {
419 self.0
420 }
421}
422
423#[cfg(test)]
424mod tests {
425 use alloc::{vec, vec::Vec};
426 use bevy_ecs::{message::*, system::assert_is_read_only_system};
427 use bevy_ecs_macros::Message;
428
429 #[derive(Message, Copy, Clone, PartialEq, Eq, Debug)]
430 struct TestEvent {
431 i: usize,
432 }
433
434 #[derive(Message, Clone, PartialEq, Debug, Default)]
435 struct EmptyTestEvent;
436
437 fn get_events<E: Message + Clone>(
438 events: &Messages<E>,
439 cursor: &mut MessageCursor<E>,
440 ) -> Vec<E> {
441 cursor.read(events).cloned().collect::<Vec<E>>()
442 }
443
444 #[test]
445 fn test_events() {
446 let mut events = Messages::<TestEvent>::default();
447 let event_0 = TestEvent { i: 0 };
448 let event_1 = TestEvent { i: 1 };
449 let event_2 = TestEvent { i: 2 };
450
451 let mut reader_missed: MessageCursor<TestEvent> = events.get_cursor();
454
455 let mut reader_a: MessageCursor<TestEvent> = events.get_cursor();
456
457 events.write(event_0);
458
459 assert_eq!(
460 get_events(&events, &mut reader_a),
461 vec![event_0],
462 "reader_a created before event receives event"
463 );
464 assert_eq!(
465 get_events(&events, &mut reader_a),
466 vec![],
467 "second iteration of reader_a created before event results in zero events"
468 );
469
470 let mut reader_b: MessageCursor<TestEvent> = events.get_cursor();
471
472 assert_eq!(
473 get_events(&events, &mut reader_b),
474 vec![event_0],
475 "reader_b created after event receives event"
476 );
477 assert_eq!(
478 get_events(&events, &mut reader_b),
479 vec![],
480 "second iteration of reader_b created after event results in zero events"
481 );
482
483 events.write(event_1);
484
485 let mut reader_c = events.get_cursor();
486
487 assert_eq!(
488 get_events(&events, &mut reader_c),
489 vec![event_0, event_1],
490 "reader_c created after two events receives both events"
491 );
492 assert_eq!(
493 get_events(&events, &mut reader_c),
494 vec![],
495 "second iteration of reader_c created after two event results in zero events"
496 );
497
498 assert_eq!(
499 get_events(&events, &mut reader_a),
500 vec![event_1],
501 "reader_a receives next unread event"
502 );
503
504 events.update();
505
506 let mut reader_d = events.get_cursor();
507
508 events.write(event_2);
509
510 assert_eq!(
511 get_events(&events, &mut reader_a),
512 vec![event_2],
513 "reader_a receives event created after update"
514 );
515 assert_eq!(
516 get_events(&events, &mut reader_b),
517 vec![event_1, event_2],
518 "reader_b receives events created before and after update"
519 );
520 assert_eq!(
521 get_events(&events, &mut reader_d),
522 vec![event_0, event_1, event_2],
523 "reader_d receives all events created before and after update"
524 );
525
526 events.update();
527
528 assert_eq!(
529 get_events(&events, &mut reader_missed),
530 vec![event_2],
531 "reader_missed missed events unread after two update() calls"
532 );
533 }
534
535 fn events_clear_and_read_impl(clear_func: impl FnOnce(&mut Messages<TestEvent>)) {
537 let mut events = Messages::<TestEvent>::default();
538 let mut reader = events.get_cursor();
539
540 assert!(reader.read(&events).next().is_none());
541
542 events.write(TestEvent { i: 0 });
543 assert_eq!(*reader.read(&events).next().unwrap(), TestEvent { i: 0 });
544 assert_eq!(reader.read(&events).next(), None);
545
546 events.write(TestEvent { i: 1 });
547 clear_func(&mut events);
548 assert!(reader.read(&events).next().is_none());
549
550 events.write(TestEvent { i: 2 });
551 events.update();
552 events.write(TestEvent { i: 3 });
553
554 assert!(reader
555 .read(&events)
556 .eq([TestEvent { i: 2 }, TestEvent { i: 3 }].iter()));
557 }
558
559 #[test]
560 fn test_events_clear_and_read() {
561 events_clear_and_read_impl(Messages::clear);
562 }
563
564 #[test]
565 fn test_events_drain_and_read() {
566 events_clear_and_read_impl(|events| {
567 assert!(events
568 .drain()
569 .eq(vec![TestEvent { i: 0 }, TestEvent { i: 1 }].into_iter()));
570 });
571 }
572
573 #[test]
574 fn test_events_write_default() {
575 let mut events = Messages::<EmptyTestEvent>::default();
576 events.write_default();
577
578 let mut reader = events.get_cursor();
579 assert_eq!(get_events(&events, &mut reader), vec![EmptyTestEvent]);
580 }
581
582 #[test]
583 fn test_write_events_ids() {
584 let mut events = Messages::<TestEvent>::default();
585 let event_0 = TestEvent { i: 0 };
586 let event_1 = TestEvent { i: 1 };
587 let event_2 = TestEvent { i: 2 };
588
589 let event_0_id = events.write(event_0);
590
591 assert_eq!(
592 events.get_message(event_0_id.id),
593 Some((&event_0, event_0_id)),
594 "Getting a sent event by ID should return the original event"
595 );
596
597 let mut event_ids = events.write_batch([event_1, event_2]);
598
599 let event_id = event_ids.next().expect("Event 1 must have been sent");
600
601 assert_eq!(
602 events.get_message(event_id.id),
603 Some((&event_1, event_id)),
604 "Getting a sent event by ID should return the original event"
605 );
606
607 let event_id = event_ids.next().expect("Event 2 must have been sent");
608
609 assert_eq!(
610 events.get_message(event_id.id),
611 Some((&event_2, event_id)),
612 "Getting a sent event by ID should return the original event"
613 );
614
615 assert!(
616 event_ids.next().is_none(),
617 "Only sent two events; got more than two IDs"
618 );
619 }
620
621 #[test]
622 fn test_event_registry_can_add_and_remove_events_to_world() {
623 use bevy_ecs::prelude::*;
624
625 let mut world = World::new();
626 MessageRegistry::register_message::<TestEvent>(&mut world);
627
628 let has_events = world.get_resource::<Messages<TestEvent>>().is_some();
629 assert!(has_events, "Should have the events resource");
630
631 MessageRegistry::deregister_messages::<TestEvent>(&mut world);
632
633 let has_events = world.get_resource::<Messages<TestEvent>>().is_some();
634 assert!(!has_events, "Should not have the events resource");
635 }
636
637 #[test]
638 fn test_events_update_drain() {
639 let mut events = Messages::<TestEvent>::default();
640 let mut reader = events.get_cursor();
641
642 events.write(TestEvent { i: 0 });
643 events.write(TestEvent { i: 1 });
644 assert_eq!(reader.read(&events).count(), 2);
645
646 let mut old_events = Vec::from_iter(events.update_drain());
647 assert!(old_events.is_empty());
648
649 events.write(TestEvent { i: 2 });
650 assert_eq!(reader.read(&events).count(), 1);
651
652 old_events.extend(events.update_drain());
653 assert_eq!(old_events.len(), 2);
654
655 old_events.extend(events.update_drain());
656 assert_eq!(
657 old_events,
658 &[TestEvent { i: 0 }, TestEvent { i: 1 }, TestEvent { i: 2 }]
659 );
660 }
661
662 #[test]
663 fn test_events_empty() {
664 let mut events = Messages::<TestEvent>::default();
665 assert!(events.is_empty());
666
667 events.write(TestEvent { i: 0 });
668 assert!(!events.is_empty());
669
670 events.update();
671 assert!(!events.is_empty());
672
673 events.update();
676 assert!(events.is_empty());
677 }
678
679 #[test]
680 fn test_events_extend_impl() {
681 let mut events = Messages::<TestEvent>::default();
682 let mut reader = events.get_cursor();
683
684 events.extend(vec![TestEvent { i: 0 }, TestEvent { i: 1 }]);
685 assert!(reader
686 .read(&events)
687 .eq([TestEvent { i: 0 }, TestEvent { i: 1 }].iter()));
688 }
689
690 #[test]
692 fn test_event_cursor_read() {
693 let mut events = Messages::<TestEvent>::default();
694 let mut cursor = events.get_cursor();
695 assert!(cursor.read(&events).next().is_none());
696
697 events.write(TestEvent { i: 0 });
698 let sent_event = cursor.read(&events).next().unwrap();
699 assert_eq!(sent_event, &TestEvent { i: 0 });
700 assert!(cursor.read(&events).next().is_none());
701
702 events.write(TestEvent { i: 2 });
703 let sent_event = cursor.read(&events).next().unwrap();
704 assert_eq!(sent_event, &TestEvent { i: 2 });
705 assert!(cursor.read(&events).next().is_none());
706
707 events.clear();
708 assert!(cursor.read(&events).next().is_none());
709 }
710
711 #[test]
712 fn test_event_cursor_read_mut() {
713 let mut events = Messages::<TestEvent>::default();
714 let mut write_cursor = events.get_cursor();
715 let mut read_cursor = events.get_cursor();
716 assert!(write_cursor.read_mut(&mut events).next().is_none());
717 assert!(read_cursor.read(&events).next().is_none());
718
719 events.write(TestEvent { i: 0 });
720 let sent_event = write_cursor.read_mut(&mut events).next().unwrap();
721 assert_eq!(sent_event, &mut TestEvent { i: 0 });
722 *sent_event = TestEvent { i: 1 }; assert_eq!(
724 read_cursor.read(&events).next().unwrap(),
725 &TestEvent { i: 1 }
726 );
727 assert!(read_cursor.read(&events).next().is_none());
728
729 events.write(TestEvent { i: 2 });
730 let sent_event = write_cursor.read_mut(&mut events).next().unwrap();
731 assert_eq!(sent_event, &mut TestEvent { i: 2 });
732 sent_event.i = 3; assert_eq!(
734 read_cursor.read(&events).next().unwrap(),
735 &TestEvent { i: 3 }
736 );
737 assert!(read_cursor.read(&events).next().is_none());
738
739 events.clear();
740 assert!(write_cursor.read(&events).next().is_none());
741 assert!(read_cursor.read(&events).next().is_none());
742 }
743
744 #[test]
745 fn test_event_cursor_clear() {
746 let mut events = Messages::<TestEvent>::default();
747 let mut reader = events.get_cursor();
748
749 events.write(TestEvent { i: 0 });
750 assert_eq!(reader.len(&events), 1);
751 reader.clear(&events);
752 assert_eq!(reader.len(&events), 0);
753 }
754
755 #[test]
756 fn test_event_cursor_len_update() {
757 let mut events = Messages::<TestEvent>::default();
758 events.write(TestEvent { i: 0 });
759 events.write(TestEvent { i: 0 });
760 let reader = events.get_cursor();
761 assert_eq!(reader.len(&events), 2);
762 events.update();
763 events.write(TestEvent { i: 0 });
764 assert_eq!(reader.len(&events), 3);
765 events.update();
766 assert_eq!(reader.len(&events), 1);
767 events.update();
768 assert!(reader.is_empty(&events));
769 }
770
771 #[test]
772 fn test_event_cursor_len_current() {
773 let mut events = Messages::<TestEvent>::default();
774 events.write(TestEvent { i: 0 });
775 let reader = events.get_cursor_current();
776 assert!(reader.is_empty(&events));
777 events.write(TestEvent { i: 0 });
778 assert_eq!(reader.len(&events), 1);
779 assert!(!reader.is_empty(&events));
780 }
781
782 #[test]
783 fn test_event_cursor_iter_len_updated() {
784 let mut events = Messages::<TestEvent>::default();
785 events.write(TestEvent { i: 0 });
786 events.write(TestEvent { i: 1 });
787 events.write(TestEvent { i: 2 });
788 let mut reader = events.get_cursor();
789 let mut iter = reader.read(&events);
790 assert_eq!(iter.len(), 3);
791 iter.next();
792 assert_eq!(iter.len(), 2);
793 iter.next();
794 assert_eq!(iter.len(), 1);
795 iter.next();
796 assert_eq!(iter.len(), 0);
797 }
798
799 #[test]
800 fn test_event_cursor_len_empty() {
801 let events = Messages::<TestEvent>::default();
802 assert_eq!(events.get_cursor().len(&events), 0);
803 assert!(events.get_cursor().is_empty(&events));
804 }
805
806 #[test]
807 fn test_event_cursor_len_filled() {
808 let mut events = Messages::<TestEvent>::default();
809 events.write(TestEvent { i: 0 });
810 assert_eq!(events.get_cursor().len(&events), 1);
811 assert!(!events.get_cursor().is_empty(&events));
812 }
813
814 #[cfg(feature = "multi_threaded")]
815 #[test]
816 fn test_event_cursor_par_read() {
817 use crate::prelude::*;
818 use core::sync::atomic::{AtomicUsize, Ordering};
819
820 #[derive(Resource)]
821 struct Counter(AtomicUsize);
822
823 let mut world = World::new();
824 world.init_resource::<Messages<TestEvent>>();
825 for _ in 0..100 {
826 world.write_message(TestEvent { i: 1 });
827 }
828
829 let mut schedule = Schedule::default();
830
831 schedule.add_systems(
832 |mut cursor: Local<MessageCursor<TestEvent>>,
833 events: Res<Messages<TestEvent>>,
834 counter: ResMut<Counter>| {
835 cursor.par_read(&events).for_each(|event| {
836 counter.0.fetch_add(event.i, Ordering::Relaxed);
837 });
838 },
839 );
840
841 world.insert_resource(Counter(AtomicUsize::new(0)));
842 schedule.run(&mut world);
843 let counter = world.remove_resource::<Counter>().unwrap();
844 assert_eq!(counter.0.into_inner(), 100);
845
846 world.insert_resource(Counter(AtomicUsize::new(0)));
847 schedule.run(&mut world);
848 let counter = world.remove_resource::<Counter>().unwrap();
849 assert_eq!(
850 counter.0.into_inner(),
851 0,
852 "par_read should have consumed events but didn't"
853 );
854 }
855
856 #[cfg(feature = "multi_threaded")]
857 #[test]
858 fn test_event_cursor_par_read_mut() {
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 let mut schedule = Schedule::default();
871 schedule.add_systems(
872 |mut cursor: Local<MessageCursor<TestEvent>>,
873 mut events: ResMut<Messages<TestEvent>>,
874 counter: ResMut<Counter>| {
875 cursor.par_read_mut(&mut events).for_each(|event| {
876 event.i += 1;
877 counter.0.fetch_add(event.i, Ordering::Relaxed);
878 });
879 },
880 );
881 world.insert_resource(Counter(AtomicUsize::new(0)));
882 schedule.run(&mut world);
883 let counter = world.remove_resource::<Counter>().unwrap();
884 assert_eq!(counter.0.into_inner(), 200, "Initial run failed");
885
886 world.insert_resource(Counter(AtomicUsize::new(0)));
887 schedule.run(&mut world);
888 let counter = world.remove_resource::<Counter>().unwrap();
889 assert_eq!(
890 counter.0.into_inner(),
891 0,
892 "par_read_mut should have consumed events but didn't"
893 );
894 }
895
896 #[test]
898 fn ensure_reader_readonly() {
899 fn reader_system(_: MessageReader<EmptyTestEvent>) {}
900
901 assert_is_read_only_system(reader_system);
902 }
903
904 #[test]
905 fn test_event_reader_iter_last() {
906 use bevy_ecs::prelude::*;
907
908 let mut world = World::new();
909 world.init_resource::<Messages<TestEvent>>();
910
911 let mut reader = IntoSystem::into_system(
912 |mut events: MessageReader<TestEvent>| -> Option<TestEvent> {
913 events.read().last().copied()
914 },
915 );
916 reader.initialize(&mut world);
917
918 let last = reader.run((), &mut world).unwrap();
919 assert!(last.is_none(), "MessageReader should be empty");
920
921 world.write_message(TestEvent { i: 0 });
922 let last = reader.run((), &mut world).unwrap();
923 assert_eq!(last, Some(TestEvent { i: 0 }));
924
925 world.write_message(TestEvent { i: 1 });
926 world.write_message(TestEvent { i: 2 });
927 world.write_message(TestEvent { i: 3 });
928 let last = reader.run((), &mut world).unwrap();
929 assert_eq!(last, Some(TestEvent { i: 3 }));
930
931 let last = reader.run((), &mut world).unwrap();
932 assert!(last.is_none(), "MessageReader should be empty");
933 }
934
935 #[test]
936 fn test_event_mutator_iter_last() {
937 use bevy_ecs::prelude::*;
938
939 let mut world = World::new();
940 world.init_resource::<Messages<TestEvent>>();
941
942 let mut mutator = IntoSystem::into_system(
943 |mut events: MessageMutator<TestEvent>| -> Option<TestEvent> {
944 events.read().last().copied()
945 },
946 );
947 mutator.initialize(&mut world);
948
949 let last = mutator.run((), &mut world).unwrap();
950 assert!(last.is_none(), "EventMutator should be empty");
951
952 world.write_message(TestEvent { i: 0 });
953 let last = mutator.run((), &mut world).unwrap();
954 assert_eq!(last, Some(TestEvent { i: 0 }));
955
956 world.write_message(TestEvent { i: 1 });
957 world.write_message(TestEvent { i: 2 });
958 world.write_message(TestEvent { i: 3 });
959 let last = mutator.run((), &mut world).unwrap();
960 assert_eq!(last, Some(TestEvent { i: 3 }));
961
962 let last = mutator.run((), &mut world).unwrap();
963 assert!(last.is_none(), "EventMutator should be empty");
964 }
965
966 #[test]
967 fn test_event_reader_iter_nth() {
968 use bevy_ecs::prelude::*;
969
970 let mut world = World::new();
971 world.init_resource::<Messages<TestEvent>>();
972
973 world.write_message(TestEvent { i: 0 });
974 world.write_message(TestEvent { i: 1 });
975 world.write_message(TestEvent { i: 2 });
976 world.write_message(TestEvent { i: 3 });
977 world.write_message(TestEvent { i: 4 });
978
979 let mut schedule = Schedule::default();
980 schedule.add_systems(|mut events: MessageReader<TestEvent>| {
981 let mut iter = events.read();
982
983 assert_eq!(iter.next(), Some(&TestEvent { i: 0 }));
984 assert_eq!(iter.nth(2), Some(&TestEvent { i: 3 }));
985 assert_eq!(iter.nth(1), None);
986
987 assert!(events.is_empty());
988 });
989 schedule.run(&mut world);
990 }
991
992 #[test]
993 fn test_event_mutator_iter_nth() {
994 use bevy_ecs::prelude::*;
995
996 let mut world = World::new();
997 world.init_resource::<Messages<TestEvent>>();
998
999 world.write_message(TestEvent { i: 0 });
1000 world.write_message(TestEvent { i: 1 });
1001 world.write_message(TestEvent { i: 2 });
1002 world.write_message(TestEvent { i: 3 });
1003 world.write_message(TestEvent { i: 4 });
1004
1005 let mut schedule = Schedule::default();
1006 schedule.add_systems(|mut events: MessageReader<TestEvent>| {
1007 let mut iter = events.read();
1008
1009 assert_eq!(iter.next(), Some(&TestEvent { i: 0 }));
1010 assert_eq!(iter.nth(2), Some(&TestEvent { i: 3 }));
1011 assert_eq!(iter.nth(1), None);
1012
1013 assert!(events.is_empty());
1014 });
1015 schedule.run(&mut world);
1016 }
1017
1018 #[test]
1019 fn test_derive_entity_event() {
1020 use bevy_ecs::prelude::*;
1021
1022 struct Entitoid(Entity);
1023
1024 impl ContainsEntity for Entitoid {
1025 fn entity(&self) -> Entity {
1026 self.0
1027 }
1028 }
1029
1030 struct MutableEntitoid(Entity);
1031
1032 impl ContainsEntity for MutableEntitoid {
1033 fn entity(&self) -> Entity {
1034 self.0
1035 }
1036 }
1037
1038 impl From<Entity> for MutableEntitoid {
1039 fn from(value: Entity) -> Self {
1040 Self(value)
1041 }
1042 }
1043
1044 #[derive(EntityEvent)]
1045 struct A(Entity);
1046
1047 #[derive(EntityEvent)]
1048 #[entity_event(propagate)]
1049 struct AP(Entity);
1050
1051 #[derive(EntityEvent)]
1052 struct B {
1053 entity: Entity,
1054 }
1055
1056 #[derive(EntityEvent)]
1057 #[entity_event(propagate)]
1058 struct BP {
1059 entity: Entity,
1060 }
1061
1062 #[derive(EntityEvent)]
1063 struct C {
1064 #[event_target]
1065 target: Entity,
1066 }
1067
1068 #[derive(EntityEvent)]
1069 #[entity_event(propagate)]
1070 struct CP {
1071 #[event_target]
1072 target: Entity,
1073 }
1074
1075 #[derive(EntityEvent)]
1076 struct D(Entitoid);
1077
1078 #[derive(EntityEvent)]
1084 struct E {
1085 entity: Entitoid,
1086 }
1087
1088 #[derive(EntityEvent)]
1096 struct F {
1097 #[event_target]
1098 target: Entitoid,
1099 }
1100
1101 #[derive(EntityEvent)]
1110 #[entity_event(propagate)]
1111 struct G(MutableEntitoid);
1112
1113 impl From<Entity> for G {
1114 fn from(value: Entity) -> Self {
1115 Self(value.into())
1116 }
1117 }
1118
1119 let mut world = World::new();
1120 let entity = world.spawn_empty().id();
1121
1122 world.entity_mut(entity).trigger(A);
1123 world.entity_mut(entity).trigger(AP);
1124 world.trigger(B { entity });
1125 world.trigger(BP { entity });
1126 world.trigger(C { target: entity });
1127 world.trigger(CP { target: entity });
1128 world.trigger(D(Entitoid(entity)));
1129 world.trigger(E {
1130 entity: Entitoid(entity),
1131 });
1132 world.trigger(F {
1133 target: Entitoid(entity),
1134 });
1135 world.trigger(G(MutableEntitoid(entity)));
1136 world.entity_mut(entity).trigger(G::from);
1137
1138 }
1140}