rmv_bevy_testing_tools/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#![feature(coverage_attribute)]

pub mod app;
#[cfg(feature = "speculoos")]
pub mod assertions;
pub mod events;
#[cfg(feature = "rstest")]
pub mod fixtures;
pub mod traits;

#[cfg(feature = "insta")]
#[macro_export]
macro_rules! set_snapshot_suffix {
    ($($expr:expr),*) => {
        let mut settings = insta::Settings::clone_current();
        settings.set_snapshot_suffix(format!($($expr,)*));
        let _guard = settings.bind_to_scope();
    }
}

pub mod prelude {
    #[cfg(feature = "speculoos")]
    pub use super::assertions::*;
    #[cfg(feature = "rstest")]
    pub use super::fixtures::*;
    #[cfg(feature = "insta")]
    pub use super::set_snapshot_suffix;
    pub use super::{app::*, events::*, traits::*};
}

#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
    use bevy_ecs::event::Event;
    use bevy_state::state::States;
    use rstest::rstest;

    use super::prelude::*;

    #[derive(Event, Default, Debug, Copy, Clone)]
    struct MyEvent;
    #[derive(States, Debug, Default, Hash, PartialEq, Eq, Clone, Copy)]
    enum MyState {
        #[default]
        A,
        B,
    }

    #[cfg(feature = "rstest")]
    #[rstest]
    fn can_access_everything(#[from(test_app)] mut app: TestApp) {
        if do_not_run() {
            return;
        }
        use bevy_state::app::AppExtStates;

        app.collect_events::<MyEvent>()
            .send_event_default::<MyEvent>();

        app.init_state::<MyState>();
        app.set_next_state(MyState::B);
    }

    #[cfg(feature = "insta")]
    #[rstest]
    fn can_access_insta_macro() {
        if do_not_run() {
            return;
        }
        set_snapshot_suffix!("works");
    }

    #[cfg(feature = "speculoos")]
    #[rstest]
    fn can_access_assertions() {
        if do_not_run() {
            return;
        }
        use speculoos::assert_that;

        let items = vec![1, 2, 3];
        assert_that!(1).is_contained_in(&items);
    }

    #[cfg(feature = "iter_tools")]
    #[rstest]
    fn can_access_query_vec() {
        if do_not_run() {
            return;
        }

        use bevy_app::App;
        use bevy_ecs::entity::Entity;

        TestApp(App::new()).query_vec::<Entity>();
    }

    fn do_not_run() -> bool {
        // basically return true always but don't let the compiler know
        std::env::var("_SKIP_FEATURE_TESTS_")
            .map(|s| matches!(s.as_str(), "true" | "1"))
            .unwrap_or(true)
    }
}