rmv_bevy_testing_tools/
lib.rs

1#![feature(coverage_attribute)]
2
3// TODO: setup tags for different versions of bevy
4
5#[cfg(feature = "speculoos")]
6pub mod assertions;
7pub mod events;
8#[cfg(any(test, feature = "rstest"))]
9pub mod fixtures;
10#[allow(unused_imports)]
11pub mod test_app;
12pub mod traits;
13
14#[cfg(feature = "insta")]
15#[macro_export]
16macro_rules! set_snapshot_suffix {
17    ($($expr:expr),*) => {
18        let mut settings = insta::Settings::clone_current();
19        settings.set_snapshot_suffix(format!($($expr,)*));
20        let _guard = settings.bind_to_scope();
21    }
22}
23
24pub mod prelude {
25    #[cfg(feature = "speculoos")]
26    pub use super::assertions::*;
27    #[cfg(feature = "rstest")]
28    pub use super::fixtures::*;
29    #[cfg(feature = "insta")]
30    pub use super::set_snapshot_suffix;
31    pub use super::{events::*, test_app, test_app::*, traits::*};
32}
33
34#[doc = include_str!("../Readme.md")]
35#[cfg(doctest)]
36pub struct ReadmeDoctests;
37
38#[cfg(test)]
39#[cfg_attr(coverage_nightly, coverage(off))]
40mod tests {
41    use bevy_ecs::event::Event;
42    use bevy_state::state::States;
43    #[cfg(feature = "rstest")]
44    use rstest::rstest;
45
46    #[derive(Event, Default, Debug, Copy, Clone)]
47    struct MyEvent;
48    #[derive(States, Debug, Default, Hash, PartialEq, Eq, Clone, Copy)]
49    enum MyState {
50        #[default]
51        A,
52        B,
53    }
54
55    #[cfg(feature = "rstest")]
56    #[rstest]
57    fn can_access_everything(#[from(test_app)] mut app: TestApp) {
58        if do_not_run() {
59            return;
60        }
61        use bevy_state::app::AppExtStates;
62        use rstest::rstest;
63
64        use crate::test_app;
65
66        app.collect_events::<MyEvent>()
67            .send_event_default::<MyEvent>();
68
69        app.init_state::<MyState>();
70        app.set_next_state(MyState::B);
71    }
72
73    #[cfg(feature = "insta")]
74    #[rstest]
75    fn can_access_insta_macro() {
76        if do_not_run() {
77            return;
78        }
79        set_snapshot_suffix!("works");
80    }
81
82    #[cfg(feature = "speculoos")]
83    #[rstest]
84    fn can_access_assertions() {
85        if do_not_run() {
86            return;
87        }
88        use speculoos::assert_that;
89
90        use crate::prelude::IsContainedIn;
91
92        let items = vec![1, 2, 3];
93        assert_that!(1).is_contained_in(&items);
94    }
95
96    #[cfg(feature = "iter_tools")]
97    #[rstest]
98    fn can_access_query_vec() {
99        if do_not_run() {
100            return;
101        }
102
103        use bevy_app::App;
104        use bevy_ecs::entity::Entity;
105
106        TestApp(App::new()).query_vec::<Entity>();
107    }
108
109    fn do_not_run() -> bool {
110        // basically return true always but don't let the compiler know
111        std::env::var("_SKIP_FEATURE_TESTS_")
112            .map(|s| matches!(s.as_str(), "true" | "1"))
113            .unwrap_or(true)
114    }
115}