package tv.dyndns.kishibe.qmaclone.client.packet; import static com.google.common.truth.Truth.assertThat; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Date; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import com.google.common.collect.ImmutableList; import tv.dyndns.kishibe.qmaclone.client.UserData; import tv.dyndns.kishibe.qmaclone.client.constant.Constant; import tv.dyndns.kishibe.qmaclone.client.game.ProblemGenre; import tv.dyndns.kishibe.qmaclone.client.game.ProblemType; import tv.dyndns.kishibe.qmaclone.client.game.RandomFlag; import tv.dyndns.kishibe.qmaclone.client.testing.TestDataProvider; @RunWith(JUnit4.class) public class PacketProblemTest { private PacketProblem problem; @Before public void setUp() throws Exception { problem = TestDataProvider.getProblem(); } @Test public void testSetSentence() { problem.setSentence("a\r\n <>&'"); assertEquals("a%n%w%lt;%gt;%amp;%dash;", problem.sentence); } @Test public void testGetPanelSentence() { problem.sentence = "a%n%w%lt;%gt;%amp;%dash;"; assertEquals("a\n <>&'", problem.getPanelSentence()); } @Test public void testGetProblemCreationSentence() { problem.sentence = "a%n%w%lt;%gt;%amp;%dash;"; assertEquals("a%n%w<>&'", problem.getProblemCreationSentence()); } @Test public void testGetProblemReportSentence() { problem.answers = new String[] { "answer" }; problem.sentence = "a%n%w%lt;%gt;%amp;%dash;!<div></div><object></object>"; assertEquals("a <>&' answer", problem.getProblemReportSentence()); } @Test public void testIsCorrect() { problem.type = ProblemType.Senmusubi; problem.answers = new String[] { "a", "b", "c", "d", null, null, null, null }; problem.choices = new String[] { "A", "B", "C", "D", null, null, null, null }; String answer = "A" + Constant.DELIMITER_KUMIAWASE_PAIR + "a" + Constant.DELIMITER_GENERAL + "B" + Constant.DELIMITER_KUMIAWASE_PAIR + "b" + Constant.DELIMITER_GENERAL + "C" + Constant.DELIMITER_KUMIAWASE_PAIR + "c" + Constant.DELIMITER_GENERAL + "D" + Constant.DELIMITER_KUMIAWASE_PAIR + "d"; assertTrue(problem.isCorrect(answer)); } @Test public void testGetNumberOfAnswers() { assertEquals(4, problem.getNumberOfAnswers()); } @Test public void testGetNumberOfChoices() { assertEquals(4, problem.getNumberOfChoices()); } @Test public void testGetAnswerList() { problem.answers = new String[] { "a", "b", "c", "d", null, null, null, null }; assertEquals(Arrays.asList("a", "b", "c", "d"), problem.getAnswerList()); } @Test public void testGetChoiceList() { problem.choices = new String[] { "A", "B", "C", "D", null, null, null, null }; assertEquals(Arrays.asList("A", "B", "C", "D"), problem.getChoiceList()); } @Test public void testGetSearchQuery() { problem.sentence = "問題文"; problem.answers = new String[] { "a", "b", "c", "d", null, null, null, null }; problem.choices = new String[] { "A", "B", "C", "D", null, null, null, null }; problem.note = "ノート"; assertEquals("問題文 a b c d A B C D ノート", problem.getSearchDocument()); } @Test public void testCreateShuffledData() { problem.type = ProblemType.YonTaku; problem.answers = new String[] { "a" }; problem.choices = new String[] { "a", "b", "c", "d" }; problem.prepareShuffledAnswersAndChoices(); assertThat(Arrays.asList(problem.shuffledAnswers), containsInAnyOrder("a")); assertThat(Arrays.asList(problem.shuffledChoices), containsInAnyOrder("a", "b", "c", "d")); } @Test public void prepareShuffledAnswersAndChoicesShouldTruncateAnswersAndChoices() { problem.type = ProblemType.Senmusubi; problem.answers = new String[] { "a", "b", "c", "d", "e", "f", "g", "h" }; problem.choices = new String[] { "a", "b", "c", "d", "e", "f", "g", "h" }; problem.prepareShuffledAnswersAndChoices(); assertEquals(4, problem.shuffledAnswers.length); assertEquals(4, problem.shuffledChoices.length); } @Test public void testGetShuffledAnswerIndex() { problem.shuffledAnswers = new String[] { "d", "c", "b", "a" }; assertEquals(0, problem.getShuffledAnswerIndex("d")); } @Test public void testGetShuffledChoiceIndex() { problem.shuffledChoices = new String[] { "D", "C", "B", "A" }; assertEquals(0, problem.getShuffledChoiceIndex("D")); } @Test public void testHasImage() { assertTrue(problem.hasImage()); } @Test public void testHasMovie() { assertTrue(problem.hasMovie()); } @Test public void testAsMinimum() { Date date = new Date(); problem.id = 12345; problem.genre = ProblemGenre.Anige; problem.type = ProblemType.Senmusubi; problem.good = 11; problem.bad = 22; problem.randomFlag = RandomFlag.Random1; problem.creatorHash = "作成者".hashCode(); problem.userCode = 12345678; problem.indication = date; PacketProblemMinimum expected = new PacketProblemMinimum(); expected.id = 12345; expected.genre = ProblemGenre.Anige; expected.type = ProblemType.Senmusubi; expected.good = 11; expected.bad = 22; expected.randomFlag = RandomFlag.Random1; expected.creatorHash = "作成者".hashCode(); expected.userCode = 12345678; expected.indication = date; assertEquals(expected, problem.asMinimum()); } @Test public void getProblemReportSentenceShouldReturnTestingProblem() { problem.answers = new String[] { "answer" }; problem.sentence = "sentence"; problem.testing = true; assertEquals("sentence (出題中)", problem.getProblemReportSentence()); } @Test public void getProblemReportSentenceShouldWorkWithImageAnswer() { problem.answers = new String[] { "answer" }; problem.sentence = "sentence"; problem.testing = false; problem.imageAnswer = true; assertEquals("sentence (画像)", problem.getProblemReportSentence()); } @Test public void getProblemReportSentenceShouldWorkWithImageChoice() { problem.answers = new String[] { "answer" }; problem.sentence = "sentence"; problem.testing = false; problem.imageChoice = true; assertEquals("sentence (画像)", problem.getProblemReportSentence()); } @Test public void getProblemReportSentenceShouldWorkWithNormalProblem() { problem.answers = new String[] { "answer" }; problem.sentence = "sentence"; problem.testing = false; problem.imageAnswer = false; assertEquals("sentence answer", problem.getProblemReportSentence()); } @Test public void cloneShouldCopyDeeply() { PacketProblem problem = TestDataProvider.getProblem(); assertEquals(problem, problem.clone()); } @Test public void cloneForCopyingProblemShouldClearFields() { PacketProblem problem = TestDataProvider.getProblem(); PacketProblem cloned = problem.cloneForCopyingProblem(); assertThat(cloned.id).isEqualTo(PacketProblem.CREATING_PROBLEM_ID); assertThat(cloned.good).isEqualTo(0); assertThat(cloned.bad).isEqualTo(0); assertThat(cloned.indication).isNull(); assertThat(cloned.creator).isEqualTo(UserData.get().getPlayerName()); assertThat(cloned.voteGood).isEqualTo(0); assertThat(cloned.voteBad).isEqualTo(0); assertThat(cloned.indicationMessage).isNull(); assertThat(cloned.indicationResolved).isNull(); } @Test public void getImageUrlsReturnsNormalizedImageUrls() { problem.imageChoice = true; problem.choices = new String[] { "http://upload.wikimedia.org/1", "http://upload.wikimedia.org/2", "http://upload.wikimedia.org/3", "http://upload.wikimedia.org/4", }; problem.imageAnswer = true; problem.answers = new String[] { "http://upload.wikimedia.org/5", "http://upload.wikimedia.org/6", "http://upload.wikimedia.org/7", "http://upload.wikimedia.org/8", }; problem.imageUrl = "http://upload.wikimedia.org/9"; assertThat(problem.getImageUrls()).isEqualTo(ImmutableList.of("https://upload.wikimedia.org/1", "https://upload.wikimedia.org/2", "https://upload.wikimedia.org/3", "https://upload.wikimedia.org/4", "https://upload.wikimedia.org/5", "https://upload.wikimedia.org/6", "https://upload.wikimedia.org/7", "https://upload.wikimedia.org/8", "https://upload.wikimedia.org/9")); } }