import domain.HitoriGameScores; import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; import java.io.File; import java.util.List; class HitoriGameScoresTest { private HitoriGameScores scores; @BeforeEach void setUp() { scores = new HitoriGameScores(); new File("highscores.dat").delete(); // Ensure clean state } @AfterEach void tearDown() { new File("highscores.dat").delete(); // Cleanup } @Test void testAddHighScore() { scores.addHighScore("TestPlayer", 100, 2); List highScores = scores.getHighScoresWithAverage(); assertFalse(highScores.isEmpty()); assertTrue(highScores.get(0).contains("TestPlayer")); assertTrue(highScores.get(0).contains("100s")); assertTrue(highScores.get(0).contains("2")); } @Test void testMultipleHighScores() { scores.addHighScore("Player1", 100, 1); scores.addHighScore("Player2", 200, 2); scores.addHighScore("Player3", 150, 3); List highScores = scores.getHighScoresWithAverage(); assertEquals(4, highScores.size()); // 3 scores + average line // Should be sorted by time assertTrue(highScores.get(0).contains("Player1")); assertTrue(highScores.get(1).contains("Player3")); assertTrue(highScores.get(2).contains("Player2")); } @Test void testDeleteHighScores() { scores.addHighScore("Player1", 100, 1); scores.addHighScore("Player2", 200, 2); scores.deleteHighScores(); List highScores = scores.getHighScoresWithAverage(); assertEquals(1, highScores.size()); // Only average line remains assertTrue(highScores.get(0).contains("Average Time: 0")); } @Test void testAverageCalculation() { scores.addHighScore("Player1", 100, 1); scores.addHighScore("Player2", 200, 2); List highScores = scores.getHighScoresWithAverage(); String averageLine = highScores.get(highScores.size() - 1); assertTrue(averageLine.contains("Average Time: 150.0")); } @Test void testSaveAndLoadHighScores() { scores.addHighScore("Player1", 100, 1); scores.addHighScore("Player2", 200, 2); scores.saveHighScoresToFile(); HitoriGameScores newScores = new HitoriGameScores(); newScores.loadHighScoresFromFile(); List loadedScores = newScores.getHighScoresWithAverage(); assertFalse(loadedScores.isEmpty()); assertTrue(loadedScores.get(0).contains("Player1")); assertTrue(loadedScores.get(1).contains("Player2")); } @Test void testLoadWithNoFile() { scores.loadHighScoresFromFile(); // No file exists List highScores = scores.getHighScoresWithAverage(); assertEquals(1, highScores.size()); // Only average line assertTrue(highScores.get(0).contains("Average Time: 0")); } @Test void testTop10Limit() { // Add more than 10 scores for (int i = 0; i < 15; i++) { scores.addHighScore("Player" + i, 100 + i, i); } List highScores = scores.getHighScoresWithAverage(); assertEquals(11, highScores.size()); // 10 scores + average line } @Test void testScoreSorting() { scores.addHighScore("Fast", 50, 0); scores.addHighScore("Medium", 100, 1); scores.addHighScore("Slow", 150, 2); List highScores = scores.getHighScoresWithAverage(); assertTrue(highScores.get(0).contains("Fast")); assertTrue(highScores.get(1).contains("Medium")); assertTrue(highScores.get(2).contains("Slow")); } }