package com.github.donkirkby.vograbulary.ultraghost; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import java.util.Arrays; import org.junit.Before; import org.junit.Test; import com.github.donkirkby.vograbulary.SerializableTools; import com.github.donkirkby.vograbulary.VograbularyPreferences; public class MatchTest { private static final int MATCH_SCORE = 3; private Match match; private Student student; private ComputerStudent computer; private DummyRandom random; private WordList wordList; @Before public void setUp() { student = new Student("Student"); computer = new ComputerStudent(mock(VograbularyPreferences.class)); wordList = new WordList(); wordList.read(Arrays.asList("PIECE", "PIPE")); match = new Match(MATCH_SCORE, student, computer); random = new DummyRandom(); match.setRandom(random); } @Test public void firstPuzzle() { String expectedLetters = "PIE"; random.setPuzzles(expectedLetters); random.setStartingStudent(0); Puzzle puzzle = match.createPuzzle(wordList); assertThat("letters", puzzle.getLetters(), is(expectedLetters)); assertThat("student", puzzle.getOwner(), is(student)); assertThat("puzzle", match.getPuzzle(), is(puzzle)); } @Test public void firstPuzzleForOtherStudent() { String expectedLetters = "PIE"; random.setPuzzles(expectedLetters); random.setStartingStudent(1); Student expectedStudent = computer; Puzzle puzzle = match.createPuzzle(wordList); assertThat("puzzle", puzzle.getLetters(), is(expectedLetters)); assertThat("student", puzzle.getOwner(), is(expectedStudent)); } @Test public void secondPuzzle() { String expectedLetters = "PIE"; random.setPuzzles("XRZ", expectedLetters); random.setStartingStudent(0); Student expectedStudent = computer; // for second puzzle match.createPuzzle(wordList); Puzzle puzzle = match.createPuzzle(wordList); assertThat("puzzle", puzzle.getLetters(), is(expectedLetters)); assertThat("student", puzzle.getOwner(), is(expectedStudent)); } @Test public void secondPuzzleNotPaused() { random.setPuzzles("ABC", "XYZ"); match.createPuzzle(wordList); Puzzle puzzle = match.createPuzzle(wordList); assertThat("isPaused", puzzle.isPaused(), is(false)); } @Test public void secondPuzzlePaused() { random.setPuzzles("ABC", "XYZ"); Puzzle puzzle1 = match.createPuzzle(wordList); puzzle1.setPaused(true); Puzzle puzzle2 = match.createPuzzle(wordList); assertThat("isPaused", puzzle2.isPaused(), is(true)); } @Test public void wordLength() { random.setPuzzles("PIE"); int expected = 5; match.setMinimumWordLength(expected); Puzzle puzzle = match.createPuzzle(wordList); assertThat("word length", puzzle.getMinimumWordLength(), is(expected)); } @Test public void summary() { student.addScore(5); computer.addScore(9); String expectedSummary = "Student 5\nComputer 9\n"; String summary = match.getSummary(); assertThat("summary", summary, is(expectedSummary)); } @Test public void summaryOrder() { random.setStartingStudent(1); String expectedSummary = "Computer 0\nStudent 0\n"; String summary = match.getSummary(); assertThat("summary", summary, is(expectedSummary)); } @Test public void winnerNotSetForLowScores() { student.addScore(MATCH_SCORE - 1); computer.addScore(MATCH_SCORE - 2); Student winner = match.getWinner(); assertThat("winner", winner, nullValue()); } @Test public void winnerSet() { student.addScore(MATCH_SCORE); computer.addScore(MATCH_SCORE - 1); Student winner = match.getWinner(); assertThat("winner", winner, is(student)); } @Test public void winnerSecondStudent() { student.addScore(MATCH_SCORE - 1); computer.addScore(MATCH_SCORE); Student winner = match.getWinner(); assertThat("winner", winner, is((Student)computer)); } @Test public void winnerNotSetOnUnevenTurnCount() { student.addScore(MATCH_SCORE); Student winner = match.getWinner(); assertThat("winner", winner, nullValue()); } @Test public void winnerNotSetOnTie() { student.addScore(MATCH_SCORE); computer.addScore(MATCH_SCORE); Student winner = match.getWinner(); assertThat("winner", winner, nullValue()); } @Test public void serialize() throws Exception { byte[] bytes = SerializableTools.serialize(match); Match match2 = SerializableTools.deserialize(bytes, Match.class); assertThat(match2.getMatchScore(), is(MATCH_SCORE)); assertThat(match2.getStudents().get(0).getName(), is(student.getName())); } }