Skip to main content

rmv_bevy_testing_tools/traits/
collect_messages.rs

1use bevy_ecs::message::Message;
2
3use crate::{
4    messages::{CollectedMessages, MessageCollectorPlugin, MessageFilterPlugin},
5    prelude::TestApp,
6};
7
8#[doc = include_str!("./collect_messages.md")]
9pub trait CollectMessages {
10    fn collect_messages<E: Message + Clone>(&mut self) -> &mut Self;
11    fn collect_messages_only<E: Message + Clone + PartialEq>(&mut self, message: E) -> &mut Self;
12    fn collect_messages_any_of<E: Message + Clone + PartialEq>(&mut self, messages: &[E]) -> &mut Self;
13    fn get_collected_messages<E: Message + Clone>(&self) -> Option<Vec<E>>;
14}
15
16impl CollectMessages for TestApp {
17    fn collect_messages<E: Message + Clone>(&mut self) -> &mut TestApp {
18        self.add_plugins(MessageCollectorPlugin::<E>::default());
19        self
20    }
21
22    fn collect_messages_only<E: Message + Clone + PartialEq>(&mut self, message: E) -> &mut TestApp {
23        self.add_plugins(MessageFilterPlugin::<E>::Only(message.clone()));
24        self
25    }
26
27    fn collect_messages_any_of<E: Message + Clone + PartialEq>(&mut self, messages: &[E]) -> &mut Self {
28        self.add_plugins(MessageFilterPlugin::<E>::AnyOf(messages.into()));
29        self
30    }
31
32    fn get_collected_messages<E: Message + Clone>(&self) -> Option<Vec<E>> {
33        self.world()
34            .get_resource::<CollectedMessages<E>>()
35            .map(|e| e.get().clone())
36    }
37}
38
39#[cfg(test)]
40mod tests {
41
42    use bevy_ecs::message::Message;
43    use rstest::rstest;
44    use speculoos::{assert_that, option::OptionAssertions};
45
46    use super::*;
47    use crate::{messages::CollectedMessages, fixtures::minimal_test_app, test_app::TestApp};
48
49    #[derive(Message, Clone, Debug, PartialEq)]
50    struct MyMessage;
51
52    #[rstest]
53    fn message_collector_trait_get_collected_messages(#[from(minimal_test_app)] mut app: TestApp) {
54        assert_that!(app.get_collected_messages::<MyMessage>())
55            .named("no resource")
56            .is_none();
57
58        app.insert_resource(CollectedMessages::<MyMessage>::default());
59
60        assert_that!(app.get_collected_messages::<MyMessage>())
61            .named("after resource inserted")
62            .is_some();
63    }
64
65    #[rstest]
66    fn message_collector_trait_collect_messages(#[from(minimal_test_app)] mut app: TestApp) {
67        assert_that!(app.get_collected_messages::<MyMessage>())
68            .named("no plugin before collect_messages")
69            .is_none();
70
71        app.collect_messages::<MyMessage>();
72
73        assert_that!(app.get_collected_messages::<MyMessage>())
74            .named("plugin inserted after collect_messages")
75            .is_some();
76    }
77
78    #[rstest]
79    fn message_collector_trait_collect_messages_only(#[from(minimal_test_app)] mut app: TestApp) {
80        assert_that!(app.get_collected_messages::<MyMessage>())
81            .named("no plugin before collect_messages_only")
82            .is_none();
83
84        app.collect_messages_only(MyMessage);
85
86        assert_that!(app.get_collected_messages::<MyMessage>())
87            .named("plugin inserted after collect_messages_only")
88            .is_some();
89    }
90
91    #[rstest]
92    fn message_collector_trait_collect_messages_any_of(#[from(minimal_test_app)] mut app: TestApp) {
93        assert_that!(app.get_collected_messages::<MyMessage>())
94            .named("no plugin before collect_messages_any_of")
95            .is_none();
96
97        app.collect_messages_any_of(&[MyMessage]);
98
99        assert_that!(app.get_collected_messages::<MyMessage>())
100            .named("plugin inserted after collect_messages_any_of")
101            .is_some();
102    }
103}