rmv_bevy_testing_tools/
lib.rs

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