package uk.co.bytemark.vm.enigma.inquisition.quiz; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.junit.Before; import org.junit.Test; import uk.co.bytemark.vm.enigma.inquisition.gui.misc.QuizConfig; import uk.co.bytemark.vm.enigma.inquisition.misc.Utils; import uk.co.bytemark.vm.enigma.inquisition.questions.MultipleChoiceQuestion; import uk.co.bytemark.vm.enigma.inquisition.questions.Question; import uk.co.bytemark.vm.enigma.inquisition.questions.QuestionSet; import uk.co.bytemark.vm.enigma.inquisition.questions.MultipleChoiceQuestion.Builder; import uk.co.bytemark.vm.enigma.inquisition.questions.QuestionSet.QuestionSetBuilder; public class QuizStateNavigationTest { private QuizState quizState; private MultipleChoiceQuestion question1; private MultipleChoiceQuestion question2; private MultipleChoiceQuestion question3; private MultipleChoiceQuestion question4; private Map<Integer, Question> questionsMap; @Test public void initialStateOfQuiz() throws Exception { assertEquals(question1, quizState.getQuestion()); assertEquals(0, quizState.getNumberOfAnsweredQuestions()); assertEquals(4, quizState.getNumberOfQuestions()); assertEquals(1, quizState.getQuestionNumber()); assertFalse(quizState.isAnyQuestionMarked()); assertTrue(quizState.isAnyQuestionUnanswered()); assertTrue(quizState.isFirstQuestion()); assertFalse(quizState.isQuizTimed()); assertEquals(question1.getSubstitutedExplanationText(), quizState.getExplanationText()); for (int questionNumber = 1; questionNumber <= quizState.getNumberOfQuestions(); questionNumber++) { assertFalse(quizState.isCorrect(questionNumber)); assertFalse(quizState.isMarked(questionNumber)); assertFalse(quizState.isAnswered(questionNumber)); } } @Test public void basicNavigation() throws Exception { checkCurrentLocation(1); quizState.goToNextQuestion(); checkCurrentLocation(2); assertFalse(quizState.isFirstQuestion()); assertFalse(quizState.isLastQuestion()); quizState.goToNextQuestion(); checkCurrentLocation(3); quizState.goToNextQuestion(); checkCurrentLocation(4); quizState.goToPreviousQuestion(); checkCurrentLocation(3); quizState.goToPreviousQuestion(); checkCurrentLocation(2); quizState.goToPreviousQuestion(); checkCurrentLocation(1); quizState.goToLastQuestion(); assertTrue(quizState.isLastQuestion()); checkCurrentLocation(4); quizState.goToFirstQuestion(); assertTrue(quizState.isFirstQuestion()); checkCurrentLocation(1); for (int questionNumber = 1; questionNumber <= quizState.getNumberOfQuestions(); questionNumber++) { quizState.goToQuestion(questionNumber); assertEquals(questionNumber, quizState.getQuestionNumber()); } } @Test public void marked() throws Exception { assertMarked(); quizState.markCurrentQuestionForReview(true); assertMarked(1); quizState.goToLastQuestion(); quizState.markCurrentQuestionForReview(true); assertMarked(1, 4); quizState.goToFirstQuestion(); quizState.markCurrentQuestionForReview(false); assertMarked(4); quizState.goToQuestion(2); quizState.markCurrentQuestionForReview(true); assertMarked(2, 4); quizState.goToQuestion(3); quizState.goToNextMarked(); checkCurrentLocation(4); quizState.goToNextMarked(); checkCurrentLocation(2); quizState.goToNextMarked(); checkCurrentLocation(4); } private void assertMarked(Integer... questionNumbersArray) { Set<Integer> expectedMarkedQuestionNumbers = Utils.makeSet(questionNumbersArray); assertEquals(expectedMarkedQuestionNumbers.size() > 0, quizState.isAnyQuestionMarked()); Set<Integer> actualMarkedQuestionNumbers = new HashSet<Integer>(); for (int questionNumber = 1; questionNumber <= quizState.getNumberOfQuestions(); questionNumber++) if (quizState.isMarked(questionNumber)) actualMarkedQuestionNumbers.add(questionNumber); assertEquals(expectedMarkedQuestionNumbers, actualMarkedQuestionNumbers); } private void checkCurrentLocation(int expectedCurrentQuestionNumber) { assertEquals(questionsMap.get(expectedCurrentQuestionNumber), quizState.getQuestion()); assertEquals(expectedCurrentQuestionNumber, quizState.getQuestionNumber()); } private MultipleChoiceQuestion makeMultipleChoiceQuestion(int questionNumber) { return new Builder().questionText("Question " + questionNumber).explanationText("Explanation").option("First", true).build(); } @Before public void setUp() throws Exception { QuizConfig quizConfig = QuizConfig.createWithoutTimer(shuffleQuestions(false), stateNumberOfOptions(false)); question1 = makeMultipleChoiceQuestion(1); question2 = makeMultipleChoiceQuestion(2); question3 = makeMultipleChoiceQuestion(3); question4 = makeMultipleChoiceQuestion(4); QuestionSet questionSet = new QuestionSetBuilder().name("QuestionSet1").addQuestions(question1, question2, question3, question4).build(); quizState = new QuizState(questionSet, quizConfig); questionsMap = new HashMap<Integer, Question>(); questionsMap.put(1, question1); questionsMap.put(2, question2); questionsMap.put(3, question3); questionsMap.put(4, question4); } // -- Argument-documenting methods ---------------------------------------------------------------------- private boolean shuffleQuestions(boolean in) { return in; } private boolean stateNumberOfOptions(boolean in) { return in; } }