import domain.HitoriGameTimer; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; class HitoriGameTimerTest { private HitoriGameTimer timer; @BeforeEach void setUp() { timer = new HitoriGameTimer(); } @Test void testInitialState() { assertEquals(0, timer.getElapsedTimeInSeconds()); assertFalse(timer.isPaused()); } @Test void testStartTimer() { timer.startTimer(); try { Thread.sleep(1100); // Wait a bit more than 1 second } catch (InterruptedException e) { fail("Timer test interrupted"); } assertTrue(timer.getElapsedTimeInSeconds() >= 1); assertFalse(timer.isPaused()); } @Test void testPauseTimer() { timer.startTimer(); try { Thread.sleep(1000); } catch (InterruptedException e) { fail("Timer test interrupted"); } timer.pauseTimer(); long pausedTime = timer.getElapsedTimeInSeconds(); assertTrue(timer.isPaused()); try { Thread.sleep(500); } catch (InterruptedException e) { fail("Timer test interrupted"); } // Time should not have increased while paused assertEquals(pausedTime, timer.getElapsedTimeInSeconds()); } @Test void testResumeTimer() { timer.startTimer(); try { Thread.sleep(1000); } catch (InterruptedException e) { fail("Timer test interrupted"); } timer.pauseTimer(); long pausedTime = timer.getElapsedTimeInSeconds(); timer.startTimer(); // Resume try { Thread.sleep(1000); } catch (InterruptedException e) { fail("Timer test interrupted"); } assertTrue(timer.getElapsedTimeInSeconds() > pausedTime); } @Test void testStopTimer() { timer.startTimer(); try { Thread.sleep(1000); } catch (InterruptedException e) { fail("Timer test interrupted"); } timer.stopTimer(); long stoppedTime = timer.getElapsedTimeInSeconds(); try { Thread.sleep(500); } catch (InterruptedException e) { fail("Timer test interrupted"); } assertEquals(stoppedTime, timer.getElapsedTimeInSeconds()); } @Test void testResetTimer() { timer.startTimer(); try { Thread.sleep(1000); } catch (InterruptedException e) { fail("Timer test interrupted"); } timer.resetTimer(); assertEquals(0, timer.getElapsedTimeInSeconds()); assertFalse(timer.isPaused()); } @Test void testMultiplePauseResume() { timer.startTimer(); try { Thread.sleep(500); timer.pauseTimer(); Thread.sleep(500); timer.startTimer(); Thread.sleep(500); timer.pauseTimer(); Thread.sleep(500); timer.startTimer(); Thread.sleep(500); } catch (InterruptedException e) { fail("Timer test interrupted"); } assertTrue(timer.getElapsedTimeInSeconds() >= 1); } }