rmv-bevy-testing-tools 0.6.1-2

Write simple tests for bevy systems, using rstest, insta, and speculoos.
Documentation
use std::time::Duration;

use bevy_time::{Time, Virtual};

use crate::prelude::TestApp;

pub trait TimeControls {
    fn is_paused(&self) -> bool;
    fn pause(&mut self);
    fn unpause(&mut self);
    fn advance_time_to(&mut self, duration: Duration);
    fn advance_time_by(&mut self, duration: Duration);
}

impl TimeControls for TestApp {
    fn is_paused(&self) -> bool {
        self.world()
            .get_resource::<Time<Virtual>>()
            .unwrap()
            .is_paused()
    }
    fn pause(&mut self) {
        self.world_mut()
            .get_resource_mut::<Time<Virtual>>()
            .unwrap()
            .pause()
    }
    fn unpause(&mut self) {
        self.world_mut()
            .get_resource_mut::<Time<Virtual>>()
            .unwrap()
            .unpause()
    }
    fn advance_time_by(&mut self, duration: Duration) {
        self.world_mut()
            .get_resource_mut::<Time<Virtual>>()
            .unwrap()
            .advance_by(duration);
        self.update();
    }
    fn advance_time_to(&mut self, duration: Duration) {
        self.world_mut()
            .get_resource_mut::<Time<Virtual>>()
            .unwrap()
            .advance_to(duration);
        self.update();
    }
}

#[cfg(test)]
mod tests {
    use rstest::rstest;
    use speculoos::{assert_that, option::OptionAssertions, prelude::BooleanAssertions};

    use super::*;
    use crate::prelude::minimal_test_app;

    #[rstest]
    fn pause(#[from(minimal_test_app)] mut app: TestApp) {
        app.pause();
        assert_that!(app.is_paused()).is_true();
    }

    #[rstest]
    fn unpause(#[from(minimal_test_app)] mut app: TestApp) {
        app.unpause();
        assert_that!(app.is_paused()).is_false();
    }

    #[rstest]
    #[case(0.0)]
    #[case(5.3)]
    #[case(123.3)]
    fn advance_time_to(#[from(minimal_test_app)] mut app: TestApp, #[case] seconds: f32) {
        app.pause();
        app.advance_time_to(Duration::from_secs_f32(seconds));
        assert_that!(app.world().get_resource::<Time>().map(|t| t.elapsed_secs()))
            .is_some()
            .is_equal_to(seconds);
    }

    #[rstest]
    #[case(0.0)]
    #[case(5.3)]
    #[case(123.3)]
    fn advance_time_by(#[from(minimal_test_app)] mut app: TestApp, #[case] seconds: f32) {
        app.pause();
        app.advance_time_by(Duration::from_secs_f32(3.0));
        app.advance_time_by(Duration::from_secs_f32(seconds));
        assert_that!(app.world().get_resource::<Time>().map(|t| t.elapsed_secs()))
            .is_some()
            .is_equal_to(3.0 + seconds);
    }
}