From 93cee3b3c980679513c380641210035d9e3372af Mon Sep 17 00:00:00 2001 From: Martin Dickopp Date: Sun, 24 Apr 2022 23:15:27 +0000 Subject: [PATCH] Make `Time::update_with_instant` public for use in tests (#4469) # Objective To test systems that implement frame rate-independent update logic, one needs to be able to mock `Time`. By mocking time, it's possible to write tests that confirm systems are frame rate-independent. This is a follow-up PR to #2549 by @ostwilkens and based on his work. ## Solution To mock `Time`, one needs to be able to manually update the Time resource with an `Instant` defined by the developer. This can be achieved by making the existing `Time::update_with_instant` method public for use in tests. ## Changelog - Make `Time::update_with_instant` public - Add doc to `Time::update_with_instant` clarifying that the method should not be called outside of tests. - Add doc test to `Time` demonstrating how to use `update_with_instant` in tests. Co-authored-by: Martin Dickopp --- crates/bevy_core/src/time/time.rs | 57 ++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/crates/bevy_core/src/time/time.rs b/crates/bevy_core/src/time/time.rs index dd75fc818d134..0995d60c79976 100644 --- a/crates/bevy_core/src/time/time.rs +++ b/crates/bevy_core/src/time/time.rs @@ -29,11 +29,66 @@ impl Default for Time { impl Time { /// Updates the internal time measurements. + /// + /// Calling this method on the [`Time`] resource as part of your app will most likely result in + /// inaccurate timekeeping, as the resource is ordinarily managed by the + /// [`CorePlugin`](crate::CorePlugin). pub fn update(&mut self) { self.update_with_instant(Instant::now()); } - pub(crate) fn update_with_instant(&mut self, instant: Instant) { + /// Update time with a specified [`Instant`] + /// + /// This method is provided for use in tests. Calling this method on the [`Time`] resource as + /// part of your app will most likely result in inaccurate timekeeping, as the resource is + /// ordinarily managed by the [`CorePlugin`](crate::CorePlugin). + /// + /// # Examples + /// + /// ``` + /// # use bevy_core::prelude::*; + /// # use bevy_ecs::prelude::*; + /// # use bevy_utils::Duration; + /// # fn main () { + /// # test_health_system(); + /// # } + /// struct Health { + /// // Health value between 0.0 and 1.0 + /// health_value: f32, + /// } + /// + /// fn health_system(time: Res