package org.erikaredmark.monkeyshines; import static org.junit.Assert.*; import java.io.BufferedWriter; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import org.erikaredmark.monkeyshines.HighScores.HighScore; import org.junit.Test; public final class HighScores_Test { /** * * Tests adding scores to a high scores list and ensures they stay ordered (also * tests the return-type for accessing the list) * */ @Test public void addScoresEnsureSorted() { HighScores scores = new HighScores(); scores.addScore("Test 1", 451); scores.addScore("Test 2", 200); scores.addScore("Test 3", 797); scores.addScore("Test 4", 900); scores.addScore("Test 5", 100); scores.addScore("Test 6", 40); List<HighScore> actual = scores.getHighScores(); assertEquals(6, actual.size() ); HighScore first = actual.get(0); HighScore second = actual.get(1); HighScore third = actual.get(2); HighScore fourth = actual.get(3); HighScore fifth = actual.get(4); HighScore sixth = actual.get(5); assertEquals("Test 4", first.getName() ); assertEquals(900, first.getScore() ); assertEquals("Test 3", second.getName() ); assertEquals(797, second.getScore() ); assertEquals("Test 1", third.getName() ); assertEquals(451, third.getScore() ); assertEquals("Test 2", fourth.getName() ); assertEquals(200, fourth.getScore() ); assertEquals("Test 5", fifth.getName() ); assertEquals(100, fifth.getScore() ); assertEquals("Test 6", sixth.getName() ); assertEquals(40, sixth.getScore() ); } /** * * Adds a high score to a high scores list that displaces a lower one, bumping it out. * */ @Test public void addScoreBumpOut() { HighScores scores = new HighScores(); scores.addScore("Test 1", 8000); scores.addScore("Test 2", 8100); scores.addScore("Test 3", 8200); scores.addScore("Test 4", 8300); scores.addScore("Test 5", 8400); scores.addScore("Test 6", 8500); scores.addScore("Test 7", 8600); scores.addScore("Test 8", 8700); scores.addScore("Test 9", 8800); scores.addScore("Test 10", 8900); assertTrue(scores.isScoreHigh(8555) ); scores.addScore("Newer", 8555); List<HighScore> actual = scores.getHighScores(); assertEquals(10, actual.size() ); HighScore first = actual.get(0); HighScore second = actual.get(1); HighScore third = actual.get(2); HighScore fourth = actual.get(3); HighScore fifth = actual.get(4); HighScore sixth = actual.get(5); HighScore seventh = actual.get(6); HighScore eighth = actual.get(7); HighScore ninth = actual.get(8); HighScore tenth = actual.get(9); assertEquals("Test 10", first.getName() ); assertEquals(8900, first.getScore() ); assertEquals("Test 9", second.getName() ); assertEquals(8800, second.getScore() ); assertEquals("Test 8", third.getName() ); assertEquals(8700, third.getScore() ); assertEquals("Test 7", fourth.getName() ); assertEquals(8600, fourth.getScore() ); assertEquals("Newer", fifth.getName() ); assertEquals(8555, fifth.getScore() ); assertEquals("Test 6", sixth.getName() ); assertEquals(8500, sixth.getScore() ); assertEquals("Test 5", seventh.getName() ); assertEquals(8400, seventh.getScore() ); assertEquals("Test 4", eighth.getName() ); assertEquals(8300, eighth.getScore() ); assertEquals("Test 3", ninth.getName() ); assertEquals(8200, ninth.getScore() ); assertEquals("Test 2", tenth.getName() ); assertEquals(8100, tenth.getScore() ); } /** * * An exception should occur if a score too low is added to the list, and ensures that the * state checking method properly reflects if the given score should not be added. * */ @Test(expected=IllegalArgumentException.class) public void addScoreNotAllowed() { HighScores scores = new HighScores(); scores.addScore("Test 1", 8000); scores.addScore("Test 2", 8100); scores.addScore("Test 3", 8200); scores.addScore("Test 4", 8300); scores.addScore("Test 5", 8400); scores.addScore("Test 6", 8500); scores.addScore("Test 7", 8600); scores.addScore("Test 8", 8700); scores.addScore("Test 9", 8800); scores.addScore("Test 10", 8900); assertFalse(scores.isScoreHigh(500) ); scores.addScore("Throws Exception", 500); } /** * * Ensures high scores can be properly saved and read back. * */ @Test public void saveAndRestore() throws IOException { HighScores scores = new HighScores(); scores.addScore("Test 1", 8000); scores.addScore("Test 2", 8100); scores.addScore("Test 3", 8200); scores.addScore("Test 4", 8300); scores.addScore("Test 5", 8400); scores.addScore("Test 6", 8500); scores.addScore("Test 7", 8600); scores.addScore("Test 8", 8700); scores.addScore("Test 9", 8800); scores.addScore("Test 10", 8900); Path temp = Files.createTempFile("score", "ms"); scores.persistScores(temp); HighScores other = HighScores.fromFile(temp); List<HighScore> result = other.getHighScores(); assertEquals("Test 10", result.get(0).getName() ); assertEquals(8900, result.get(0).getScore() ); assertEquals("Test 9", result.get(1).getName() ); assertEquals(8800, result.get(1).getScore() ); assertEquals("Test 8", result.get(2).getName() ); assertEquals(8700, result.get(2).getScore() ); assertEquals("Test 7", result.get(3).getName() ); assertEquals(8600, result.get(3).getScore() ); assertEquals("Test 6", result.get(4).getName() ); assertEquals(8500, result.get(4).getScore() ); assertEquals("Test 5", result.get(5).getName() ); assertEquals(8400, result.get(5).getScore() ); assertEquals("Test 4", result.get(6).getName() ); assertEquals(8300, result.get(6).getScore() ); assertEquals("Test 3", result.get(7).getName() ); assertEquals(8200, result.get(7).getScore() ); assertEquals("Test 2", result.get(8).getName() ); assertEquals(8100, result.get(8).getScore() ); assertEquals("Test 1", result.get(9).getName() ); assertEquals(8000, result.get(9).getScore() ); } /** * * Writes a file with too many scores. Ensures result contains only the first ten. * */ @Test public void tooManyScoresRestore() throws IOException { Path temp = Files.createTempFile("score", "ms"); try (BufferedWriter writer = Files.newBufferedWriter(temp, Charset.forName("UTF-8") ) ) { writer.write("Test1,800\n"); writer.write("Test2,790\n"); writer.write("Test3,780\n"); writer.write("Test4,770\n"); // Intentional; ensures duplicates are allowed. writer.write("Test5,760\n"); writer.write("Test5,750\n"); writer.write("Test5,740\n"); writer.write("Test5,730\n"); writer.write("Test9,720\n"); writer.write("Test10,710\n"); // These two don't make the cut even though they are higher. writer.write("Test11,1700\n"); writer.write("Test12,4690\n"); } HighScores scores = HighScores.fromFile(temp); List<HighScore> result = scores.getHighScores(); assertEquals("Test1", result.get(0).getName() ); assertEquals(800, result.get(0).getScore() ); assertEquals("Test2", result.get(1).getName() ); assertEquals(790, result.get(1).getScore() ); assertEquals("Test3", result.get(2).getName() ); assertEquals(780, result.get(2).getScore() ); assertEquals("Test4", result.get(3).getName() ); assertEquals(770, result.get(3).getScore() ); assertEquals("Test5", result.get(4).getName() ); assertEquals(760, result.get(4).getScore() ); assertEquals("Test5", result.get(5).getName() ); assertEquals(750, result.get(5).getScore() ); assertEquals("Test5", result.get(6).getName() ); assertEquals(740, result.get(6).getScore() ); assertEquals("Test5", result.get(7).getName() ); assertEquals(730, result.get(7).getScore() ); assertEquals("Test9", result.get(8).getName() ); assertEquals(720, result.get(8).getScore() ); assertEquals("Test10", result.get(9).getName() ); assertEquals(710, result.get(9).getScore() ); } /** * * Rights scores to file out of order. Loading should not be contingent on order. * */ @Test public void outOfOrderRestore() throws IOException { Path temp = Files.createTempFile("score", "ms"); try (BufferedWriter writer = Files.newBufferedWriter(temp, Charset.forName("UTF-8") ) ) { writer.write("Test1,400\n"); writer.write("Test2,790\n"); writer.write("Test3,180\n"); } HighScores scores = HighScores.fromFile(temp); List<HighScore> result = scores.getHighScores(); assertEquals("Test2", result.get(0).getName() ); assertEquals(790, result.get(0).getScore() ); assertEquals("Test1", result.get(1).getName() ); assertEquals(400, result.get(1).getScore() ); assertEquals("Test3", result.get(2).getName() ); assertEquals(180, result.get(2).getScore() ); } }