/*
* Copyright (c) 2005-2011 Grameen Foundation USA
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
* See also http://www.apache.org/licenses/LICENSE-2.0.html for an
* explanation of the license and how it is applied.
*/
package org.mifos.platform.questionnaire.ui.controller;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mifos.platform.questionnaire.service.dtos.ChoiceDto;
import org.mifos.platform.questionnaire.service.QuestionDetail;
import org.mifos.platform.questionnaire.service.QuestionType;
import org.mifos.platform.questionnaire.ui.model.Question;
import org.mockito.runners.MockitoJUnitRunner;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import static org.hamcrest.Matchers.is;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
@RunWith(MockitoJUnitRunner.class)
public class QuestionTest {
@Test
public void testAddAnswerChoice() {
Question question = new Question(new QuestionDetail());
question.setCurrentChoice("choice1");
question.addAnswerChoice();
question.setCurrentChoice("choice2");
question.addAnswerChoice();
question.setCurrentChoice("choice1");
question.addAnswerChoice();
question.setCurrentChoice("choice3");
question.addAnswerChoice();
assertThat(question.getChoices().size(), is(4));
assertThat(question.getCurrentSmartChoiceTags().size(), is(4));
assertEquals("choice1", question.getChoices().get(0).getValue());
assertEquals("choice2", question.getChoices().get(1).getValue());
assertEquals("choice1", question.getChoices().get(2).getValue());
assertEquals("choice3", question.getChoices().get(3).getValue());
assertEquals("choice1, choice2, choice1, choice3", question.getCommaSeparateChoices());
}
@Test
public void testRemoveAnswerChoice() {
Question question = new Question(new QuestionDetail());
question.setCurrentChoice("choice1");
question.addAnswerChoice();
question.setCurrentChoice("choice2");
question.addAnswerChoice();
question.setCurrentChoice("choice1");
question.addAnswerChoice();
assertEquals("choice1", question.getChoices().get(0).getValue());
assertEquals("choice2", question.getChoices().get(1).getValue());
assertEquals("choice1", question.getChoices().get(2).getValue());
question.removeChoice(0);
assertEquals("choice2", question.getChoices().get(0).getValue());
assertEquals("choice1", question.getChoices().get(1).getValue());
question.removeChoice(1);
assertEquals("choice2", question.getChoices().get(0).getValue());
}
@Test
public void shouldGetTitleAndType() {
assertQuestion("Question Title1", QuestionType.NUMERIC, "number", new LinkedList<String>());
assertQuestion("Question Title2", QuestionType.FREETEXT, "freeText", new LinkedList<String>());
assertQuestion("Question Title3", QuestionType.DATE, "date", new LinkedList<String>());
assertQuestion("Question Title4", QuestionType.SINGLE_SELECT, "singleSelect", Arrays.asList("choice-1", "choice-2"));
assertQuestion("Question Title5", QuestionType.MULTI_SELECT, "multiSelect", Arrays.asList("choice1", "choice2"));
}
@Test
public void testQuestionTypeConversion() {
Question question = new Question(new QuestionDetail());
question.setType("number");
assertThat(question.getType(), is("number"));
question.setType("freeText");
assertThat(question.getType(), is("freeText"));
question.setType("date");
assertThat(question.getType(), is("date"));
question.setType("singleSelect");
assertThat(question.getType(), is("singleSelect"));
question.setType("number");
assertThat(question.getType(), is("number"));
question.setType("multiSelect");
assertThat(question.getType(), is("multiSelect"));
question.setType("Multi Selects");
Assert.assertNull(question.getType());
}
@Test
public void testAddSmartChoice() {
Question question = new Question(new QuestionDetail());
question.setCurrentSmartChoice("Choice1");
question.addAnswerSmartChoice();
assertThat(question.getCurrentSmartChoice(), is(nullValue()));
assertThat(question.getCurrentSmartChoiceTags().size(), is(1));
assertThat(question.getCurrentSmartChoiceTags().get(0), is(""));
question.setCurrentSmartChoice("Choice2");
question.addAnswerSmartChoice();
assertThat(question.getCurrentSmartChoice(), is(nullValue()));
assertThat(question.getCurrentSmartChoiceTags().size(), is(2));
assertThat(question.getCurrentSmartChoiceTags().get(0), is(""));
assertThat(question.getCurrentSmartChoiceTags().get(1), is(""));
}
@Test
public void testAddSmartChoiceTag() {
QuestionDetail questionDetail = new QuestionDetail();
Question question = new Question(questionDetail);
question.setCurrentSmartChoice("Choice1");
question.addAnswerSmartChoice();
question.setCurrentSmartChoice("Choice2");
question.addAnswerSmartChoice();
question.getCurrentSmartChoiceTags().set(1, "Tag1");
question.addSmartChoiceTag(0);
assertThat(questionDetail.getAnswerChoices().get(0).getTags().size(), is(0));
assertThat(questionDetail.getAnswerChoices().get(1).getTags().size(), is(0));
question.addSmartChoiceTag(1);
assertThat(questionDetail.getAnswerChoices().get(1).getTags().get(0), is("Tag1"));
assertThat(question.getCurrentSmartChoiceTags().get(1), is(""));
}
@Test
public void testAddSmartChoiceTagUptoFiveTags() {
QuestionDetail questionDetail = new QuestionDetail();
Question question = new Question(questionDetail);
question.setCurrentSmartChoice("Choice1");
question.addAnswerSmartChoice();
question.getCurrentSmartChoiceTags().set(0, "Tag_1");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_2");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_3");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_4");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_5");
question.addSmartChoiceTag(0);
assertThat(questionDetail.getAnswerChoices().get(0).getTags().size(), is(5));
question.getCurrentSmartChoiceTags().set(0, "Tag_6");
question.addSmartChoiceTag(0);
assertThat(questionDetail.getAnswerChoices().get(0).getTags().size(), is(5));
assertThat(question.getCurrentSmartChoiceTags().get(0), is(""));
}
@Test
public void testAddSmartChoiceTagDoesnotAllowDuplicates() {
QuestionDetail questionDetail = new QuestionDetail();
Question question = new Question(questionDetail);
question.setCurrentSmartChoice("Choice1");
question.addAnswerSmartChoice();
question.getCurrentSmartChoiceTags().set(0, "Tag_1");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_1");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag_2");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "TAg_2");
question.addSmartChoiceTag(0);
assertThat(questionDetail.getAnswerChoices().get(0).getTags().size(), is(2));
}
@Test
public void testRemoveChoiceTag() {
Question question = new Question(new QuestionDetail());
question.setCurrentSmartChoice("Choice1");
question.addAnswerSmartChoice();
question.getCurrentSmartChoiceTags().set(0, "Tag1");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag2");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag3");
question.addSmartChoiceTag(0);
question.getCurrentSmartChoiceTags().set(0, "Tag4");
question.addSmartChoiceTag(0);
question.removeChoiceTag("0_2");
assertThat(question.getQuestionDetail().getAnswerChoices().size(), is(1));
assertThat(question.getQuestionDetail().getAnswerChoices().get(0).getTags().size(), is(3));
assertThat(question.getQuestionDetail().getAnswerChoices().get(0).getTags().get(0), is("Tag1"));
assertThat(question.getQuestionDetail().getAnswerChoices().get(0).getTags().get(1), is("Tag2"));
assertThat(question.getQuestionDetail().getAnswerChoices().get(0).getTags().get(2), is("Tag4"));
question.removeChoiceTag("0_0");
question.removeChoiceTag("0_0");
question.removeChoiceTag("0_0");
assertThat(question.getQuestionDetail().getAnswerChoices().size(), is(1));
assertThat(question.getQuestionDetail().getAnswerChoices().get(0).getTags().size(), is(0));
}
private void assertQuestion(String text, QuestionType questionType, String questionTypeString, List<String> choices) {
QuestionDetail questionDetail = new QuestionDetail(123, text, questionType, true, true);
List<ChoiceDto> choiceDtos = getChoiceDetails(choices);
questionDetail.setAnswerChoices(choiceDtos);
Question question = new Question(questionDetail);
assertThat(question.getText(), is(text));
assertThat(question.getType(), is(questionTypeString));
assertEquals(question.getChoices(), choiceDtos);
}
private List<ChoiceDto> getChoiceDetails(List<String> choices) {
List<ChoiceDto> choiceDtos = new ArrayList<ChoiceDto>();
for (String choice : choices) choiceDtos.add(new ChoiceDto(choice));
return choiceDtos;
}
}