From 9cf088cc6c399f230f254bbd8367355e9dbaba67 Mon Sep 17 00:00:00 2001 From: Ross W Date: Sun, 17 Aug 2025 21:50:51 +0100 Subject: [PATCH] Added Time class + tests --- src/main/java/org/hirw/game/Window.java | 8 +-- src/main/java/org/hirw/game/util/Time.java | 31 +++++++++ .../java/org/hirw/game/util/TimeTest.java | 64 +++++++++++++++++++ 3 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/hirw/game/util/Time.java create mode 100644 src/test/java/org/hirw/game/util/TimeTest.java diff --git a/src/main/java/org/hirw/game/Window.java b/src/main/java/org/hirw/game/Window.java index b0d7352..484024c 100644 --- a/src/main/java/org/hirw/game/Window.java +++ b/src/main/java/org/hirw/game/Window.java @@ -5,6 +5,7 @@ import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryUtil.*; +import org.hirw.game.util.Time; import org.lwjgl.Version; import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; @@ -82,11 +83,8 @@ public class Window { private void loop() { while (!glfwWindowShouldClose(glfwWindow)) { - - if (Mouse.isPressed(Mouse.Buttons.LEFT)) { - System.out.println("LEFT CLICKED"); - } - + Time.update(); + System.out.println(Time.deltaTime()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glfwSwapBuffers(glfwWindow); glfwPollEvents(); diff --git a/src/main/java/org/hirw/game/util/Time.java b/src/main/java/org/hirw/game/util/Time.java new file mode 100644 index 0000000..ed578d1 --- /dev/null +++ b/src/main/java/org/hirw/game/util/Time.java @@ -0,0 +1,31 @@ +package org.hirw.game.util; + +public final class Time { + private static long lastTime = NanoTimer.system().nanoTime(); + private static long currentTime = NanoTimer.system().nanoTime(); + private static NanoTimer nanoTimer = NanoTimer.system(); + + public interface NanoTimer { + long nanoTime(); + + static NanoTimer system() { + return System::nanoTime; + } + } + + static void setNanoTimer(NanoTimer timer) { + nanoTimer = timer; + lastTime = nanoTimer.nanoTime(); + currentTime = nanoTimer.nanoTime(); + } + + public static void update() { + lastTime = currentTime; + currentTime = nanoTimer.nanoTime(); + } + + public static float deltaTime() { + final float ONE_SECOND = 1_000_000_000f; + return (currentTime - lastTime) / ONE_SECOND; + } +} diff --git a/src/test/java/org/hirw/game/util/TimeTest.java b/src/test/java/org/hirw/game/util/TimeTest.java new file mode 100644 index 0000000..5df32c6 --- /dev/null +++ b/src/test/java/org/hirw/game/util/TimeTest.java @@ -0,0 +1,64 @@ +package org.hirw.game.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.when; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +class TimeTest { + final float ONE_SECOND = 1_000_000_000f; + final long ONE_MILLISECOND = 1_000_000L; + final float MOE = 0.00000001f; // Margin of error + + private Time.NanoTimer nanoTimer; + + @BeforeEach + void setUp() { + nanoTimer = Mockito.mock(Time.NanoTimer.class); + when(nanoTimer.nanoTime()).thenReturn(0L); + Time.setNanoTimer(nanoTimer); + } + + @Test + void testDeltaTimeInitialState() { + float deltaTime = Time.deltaTime(); + assertEquals(deltaTime, 0f, MOE, "should be 0"); + } + + @Test + void testDeltaTimeAfterUpdate() { + when(nanoTimer.nanoTime()).thenReturn(ONE_MILLISECOND); + + Time.update(); + float deltaTime = Time.deltaTime(); + + assertEquals(deltaTime, ONE_MILLISECOND / ONE_SECOND, MOE, "should reflect time difference"); + } + + @Test + void testMultipleUpdates() { + when(nanoTimer.nanoTime()).thenReturn(ONE_MILLISECOND).thenReturn(ONE_MILLISECOND * 4); + + Time.update(); + float delta1 = Time.deltaTime(); + + Time.update(); + float delta2 = Time.deltaTime(); + + assertEquals(delta1, ONE_MILLISECOND / ONE_SECOND, MOE, "should be 1/1000th second"); + assertEquals(delta2, (ONE_MILLISECOND * 3) / ONE_SECOND, MOE, "should be 3/1000th second"); + } + + @Test + void testConsistentStateAcrossCalls() { + when(nanoTimer.nanoTime()).thenReturn(ONE_MILLISECOND); + + Time.update(); + float delta1 = Time.deltaTime(); + float delta2 = Time.deltaTime(); + + assertEquals(delta1, delta2, MOE, "should be equal delta time"); + } +}