package com.github.donkirkby.vograbulary.russian;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import java.util.Arrays;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import com.github.donkirkby.vograbulary.ultraghost.WordList;
public class ControllerTest {
private Controller controller;
private RussianDollsScreen screen;
@Before
public void setUp() {
screen = mock(RussianDollsScreen.class);
WordList wordList = new WordList();
wordList.read(Arrays.asList("uncomfortable"));
controller = new Controller();
controller.setScreen(screen);
controller.setWordList(wordList);
}
@Test
public void loadSinglePuzzle() {
String expectedClue = "Puzzle number one.";
controller.loadPuzzles(Arrays.asList(expectedClue));
Puzzle puzzle = capturePuzzle();
assertThat("puzzle", puzzle.getClue(), is(expectedClue));
}
@Test
public void loadMultiplePuzzles() {
String expectedClue1 = "Puzzle number one.";
String expectedClue2 = "Another nice puzzle.";
controller.loadPuzzles(Arrays.asList(expectedClue1, expectedClue2));
Puzzle puzzle1 = capturePuzzle();
controller.next();
List<Puzzle> allPuzzles = captureAllPuzzles();
assertThat("puzzle 1", puzzle1.getClue(), is(expectedClue1));
assertThat("puzzle count", allPuzzles.size(), is(2));
assertThat("puzzle 2", allPuzzles.get(1).getClue(), is(expectedClue2));
}
@Test
public void goBack() {
String expectedClue1 = "Puzzle number one.";
String expectedClue2 = "Another nice puzzle.";
controller.loadPuzzles(Arrays.asList(expectedClue1, expectedClue2));
controller.next();
controller.back();
List<Puzzle> allPuzzles = captureAllPuzzles();
assertThat("puzzle count", allPuzzles.size(), is(3));
assertThat("puzzle 2", allPuzzles.get(2).getClue(), is(expectedClue1));
}
@Test
public void solve() {
Puzzle puzzle = new Puzzle("unable comfort");
when(screen.getPuzzle()).thenReturn(puzzle);
puzzle.setTargetWord(0);
puzzle.setTargetCharacter(2);
assertThat("is solved before", puzzle.isSolved(), is(false));
controller.solve();
assertThat("is solved", puzzle.isSolved(), is(true));
}
@Test
public void solveIncorrectly() {
Puzzle puzzle = new Puzzle("unable comfort");
when(screen.getPuzzle()).thenReturn(puzzle);
puzzle.setTargetWord(1);
puzzle.setTargetCharacter(2);
controller.solve();
assertThat("is solved", puzzle.isSolved(), is(false));
}
@Test
public void solveWithoutTarget() {
Puzzle puzzle = new Puzzle("unable comfort");
when(screen.getPuzzle()).thenReturn(puzzle);
controller.solve();
assertThat("is solved", puzzle.isSolved(), is(false));
}
@Test
public void adjustScore() {
Puzzle puzzle = new Puzzle("unable comfort");
when(screen.getPuzzle()).thenReturn(puzzle);
int seconds = 10;
String startScore = puzzle.getScoreDisplay();
String adjustedScore = controller.adjustScore(seconds);
assertThat("start score", startScore, is("100"));
assertThat("adjusted score", adjustedScore, is("50"));
}
@Test
public void nextSetsPrevious() {
controller.loadPuzzles(Arrays.asList(
"unable comfort",
"something else"));
Puzzle puzzle = capturePuzzle();
when(screen.getPuzzle()).thenReturn(puzzle);
int seconds = 10;
String adjustedScore = controller.adjustScore(seconds);
puzzle.setTargetWord(0);
puzzle.setTargetCharacter(2);
controller.solve();
controller.next();
Puzzle puzzle2 = captureAllPuzzles().get(1);
String totalScore = puzzle2.getTotalScoreDisplay();
assertThat("total score", totalScore, is(adjustedScore));
}
private Puzzle capturePuzzle() {
ArgumentCaptor<Puzzle> captor = ArgumentCaptor.forClass(Puzzle.class);
verify(screen).setPuzzle(captor.capture());
return captor.getValue();
}
private List<Puzzle> captureAllPuzzles() {
ArgumentCaptor<Puzzle> captor = ArgumentCaptor.forClass(Puzzle.class);
verify(screen, atLeastOnce()).setPuzzle(captor.capture());
return captor.getAllValues();
}
}