rmv_bevy_testing_tools/
lib.rs

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