From a3532b78d7f0185b0b2c72367c1f29ef17a2d70e Mon Sep 17 00:00:00 2001 From: Noel Stephens Date: Tue, 18 Mar 2025 10:40:02 -0500 Subject: [PATCH] fix: android time test failures due to edge case float precision errors (#3351) `NetworkTimeSystemTests.CorrectAmountTicksTest` Using the double version of tick frequency to calculate number of ticks passed. `TimeInitializationTest.TestClientTimeInitializationOnConnect` Dividing the double version of tick frequency to calculate number of ticks passed and using the double version of `Math.Floor` before casting that to an integer. ## Changelog NA ## Testing and Documentation - Includes integration test updates. - No documentation changes or additions were necessary. --- .../Tests/Runtime/Timing/NetworkTimeSystemTests.cs | 3 +-- .../Tests/Runtime/Timing/TimeInitializationTest.cs | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Timing/NetworkTimeSystemTests.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Timing/NetworkTimeSystemTests.cs index 2e6279999c..c9a0a293da 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Timing/NetworkTimeSystemTests.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Timing/NetworkTimeSystemTests.cs @@ -62,7 +62,7 @@ public IEnumerator PlayerLoopTimeTest_WithDifferentTimeScale([Values(0.0f, 0.1f, public IEnumerator CorrectAmountTicksTest() { NetworkTickSystem tickSystem = NetworkManager.Singleton.NetworkTickSystem; - float delta = tickSystem.LocalTime.FixedDeltaTime; + double delta = tickSystem.LocalTime.FixedDeltaTimeAsDouble; int previous_localTickCalculated = 0; int previous_serverTickCalculated = 0; @@ -79,7 +79,6 @@ public IEnumerator CorrectAmountTicksTest() previous_localTickCalculated++; } - tickCalculated = NetworkManager.Singleton.ServerTime.Time / delta; previous_serverTickCalculated = (int)tickCalculated; diff --git a/com.unity.netcode.gameobjects/Tests/Runtime/Timing/TimeInitializationTest.cs b/com.unity.netcode.gameobjects/Tests/Runtime/Timing/TimeInitializationTest.cs index 507fbafac4..85e7ecca4e 100644 --- a/com.unity.netcode.gameobjects/Tests/Runtime/Timing/TimeInitializationTest.cs +++ b/com.unity.netcode.gameobjects/Tests/Runtime/Timing/TimeInitializationTest.cs @@ -43,10 +43,11 @@ public IEnumerator TestClientTimeInitializationOnConnect([Values(0, 1f)] float s yield return new WaitUntil(() => server.NetworkTickSystem.ServerTime.Tick > 2); var serverTimePassed = server.NetworkTickSystem.ServerTime.Time; - var expectedServerTickCount = Mathf.FloorToInt((float)(serverTimePassed * 30)); + // Use FixedDeltaTimeAsDouble and divide the tick frequency into the time passed to get the accurate tick count + var expectedServerTickCount = (int)System.Math.Floor(serverTimePassed / server.ServerTime.FixedDeltaTimeAsDouble); var ticksPassed = server.NetworkTickSystem.ServerTime.Tick - serverTick; - Assert.AreEqual(expectedServerTickCount, ticksPassed); + Assert.AreEqual(expectedServerTickCount, ticksPassed, $"Calculated tick failed: Tick ({expectedServerTickCount}) TicksPassed ({ticksPassed}) Server Tick ({server.NetworkTickSystem.ServerTime.Tick}) Prev-Server Tick ({serverTick})"); yield return new WaitForSeconds(clientStartDelay);