rmv_bevy_testing_tools/traits/
collect_messages.rs1use 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}