diff --git a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs
index 39e3920055..4a90602916 100644
--- a/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs
+++ b/com.unity.netcode.gameobjects/Runtime/Timing/NetworkTime.cs
@@ -60,6 +60,8 @@ public struct NetworkTime
/// The tickrate.
public NetworkTime(int tickRate)
{
+ Assert.IsTrue(tickRate > 0, "Tickrate must be a positive value.");
+
m_TickRate = tickRate;
m_TickInterval = 1f / m_TickRate; // potential floating point precision issue, could result in different interval on different machines
m_CachedTickOffset = 0;
diff --git a/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs b/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs
index 5fac93a20a..944d40863f 100644
--- a/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs
+++ b/com.unity.netcode.gameobjects/Tests/Editor/Timing/NetworkTimeTests.cs
@@ -9,6 +9,54 @@ namespace Unity.Netcode.EditorTests
{
public class NetworkTimeTests
{
+ [Test]
+ [TestCase(0d, 0)]
+ [TestCase(5d, 0)]
+ [TestCase(-5d, 0)]
+ [TestCase(0d, -20)]
+ [TestCase(5d, int.MinValue)]
+ [TestCase(-5d, -1)]
+ public void TestFailCreateInvalidTime(double time, int tickrate)
+ {
+ Assert.Throws(() => new NetworkTime(tickrate, time));
+ }
+
+ [Test]
+ [TestCase(0d, 0f, 20)]
+ [TestCase(0d, 0f, 30)]
+ [TestCase(0d, 0f, 60)]
+
+ [TestCase(201d, 201f, 20)]
+ [TestCase(201d, 201f, 30)]
+ [TestCase(201d, 201f, 60)]
+
+ [TestCase(-4301d, -4301f, 20)]
+ [TestCase(-4301d, -4301f, 30)]
+ [TestCase(-4301d, -4301f, 60)]
+
+ [TestCase(float.MaxValue, float.MaxValue, 20)]
+ [TestCase(float.MaxValue, float.MaxValue, 30)]
+ [TestCase(float.MaxValue, float.MaxValue, 60)]
+ public void TestTimeAsFloat(double d, float f, int tickRate)
+ {
+ var networkTime = new NetworkTime(tickRate, d);
+ Assert.True(Mathf.Approximately(networkTime.TimeAsFloat, f));
+ }
+
+ [Test]
+ [TestCase(53.55d, 53.5d, 10)]
+ [TestCase(1013553.55d, 1013553.5d, 10)]
+ [TestCase(0d, 0d, 10)]
+ [TestCase(-27.41d, -27.5d, 10)]
+
+ [TestCase(53.55d, 53.54d, 50)]
+ [TestCase(1013553.55d, 1013553.54d, 50)]
+ [TestCase(0d, 0d, 50)]
+ [TestCase(-27.4133d, -27.42d, 50)]
+ public void TestToFixedTime(double time, double expectedFixedTime, int tickRate)
+ {
+ Assert.AreEqual(expectedFixedTime, new NetworkTime(tickRate, time).ToFixedTime().Time);
+ }
[Test]
public void NetworkTimeCreate()
@@ -104,7 +152,6 @@ public void NetworkTimeSubFloatTest()
Assert.IsTrue(Approximately(floatResultE, timeE.Time));
}
-
[Test]
public void NetworkTimeAddNetworkTimeTest()
{
@@ -170,7 +217,6 @@ public void NetworkTimeAdvanceTest()
NetworkTimeAdvanceTestInternal(randomSteps, 30, 0f);
NetworkTimeAdvanceTestInternal(randomSteps, 144, 0f);
-
NetworkTimeAdvanceTestInternal(randomSteps, 60, 23132.231f);
NetworkTimeAdvanceTestInternal(randomSteps, 1, 23132.231f);
NetworkTimeAdvanceTestInternal(randomSteps, 10, 23132.231f);
@@ -220,6 +266,5 @@ private static bool Approximately(double a, double b, double epsilon = 0.000001d
var dif = Math.Abs(a - b);
return dif <= epsilon;
}
-
}
}