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