package tv.dyndns.kishibe.qmaclone.client.creation;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static tv.dyndns.kishibe.qmaclone.client.constant.Constant.DELIMITER_GENERAL;
import static tv.dyndns.kishibe.qmaclone.client.constant.Constant.DELIMITER_KUMIAWASE_PAIR;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import tv.dyndns.kishibe.qmaclone.client.game.ProblemType;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketProblem;
import tv.dyndns.kishibe.qmaclone.client.packet.PacketWrongAnswer;
import tv.dyndns.kishibe.qmaclone.client.testing.TestDataProvider;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
@RunWith(MockitoJUnitRunner.class)
public class WrongAnswerPresenterTest {
private static final String FAKE_ANSWER = "aaa";
private static final int FAKE_COUNT = 123;
@Mock
private WrongAnswerView mockView;
private WrongAnswerPresenter presenter;
private PacketProblem problem;
@Before
public void setUp() throws Exception {
presenter = new WrongAnswerPresenter(mockView);
problem = TestDataProvider.getProblem();
problem.type = ProblemType.YonTaku;
}
@Test
public void setWrongAnswersShouldShowString() {
presenter = spy(presenter);
List<PacketWrongAnswer> wrongAnswers = ImmutableList.of(new PacketWrongAnswer().setAnswer(
FAKE_ANSWER).setCount(FAKE_COUNT));
when(presenter.normalize(wrongAnswers, problem)).thenReturn(wrongAnswers);
presenter.setWrongAnswers(wrongAnswers, problem);
verify(mockView).setAnswer(wrongAnswers);
}
@Test
public void asStringShouldWorkWithSingleAnswer() {
List<PacketWrongAnswer> actual = presenter.normalize(
ImmutableList.of(new PacketWrongAnswer().setAnswer("aaa").setCount(123)), problem);
assertEquals(ImmutableList.of(new PacketWrongAnswer().setAnswer("aaa").setCount(123)),
actual);
}
@Test
public void asStringShouldMergeSimilarPoint() {
problem.type = ProblemType.Click;
String p1 = "100 100";
String p2 = "105 105";
List<PacketWrongAnswer> actual = presenter.normalize(ImmutableList.of(
new PacketWrongAnswer().setAnswer(p1).setCount(10), new PacketWrongAnswer()
.setAnswer(p2).setCount(20)), problem);
assertEquals(ImmutableList.of(new PacketWrongAnswer().setAnswer(p1).setCount(30)), actual);
}
@Test
public void asStringShouldNormalizeSingleUrl() {
List<PacketWrongAnswer> actual = presenter.normalize(ImmutableList
.of(new PacketWrongAnswer().setAnswer("http://example.com/a.jpg").setCount(10)),
problem);
assertEquals(ImmutableList.of(new PacketWrongAnswer().setAnswer("a.jpg").setCount(10)),
actual);
}
@Test
public void asStringShouldNormalizeMultipleUrl() {
String a1 = "http://example.com/a.jpg";
String a2 = "http://example.com/b.jpg";
String a3 = "http://example.com/c.jpg";
List<PacketWrongAnswer> actual = presenter.normalize(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join(a1, a2, a3)).setCount(10)), problem);
assertEquals(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join("a.jpg", "b.jpg", "c.jpg")).setCount(10)),
actual);
}
@Test
public void asStringShouldNormalizeMultipleUrlPair() {
String a1 = "http://example.com/a.jpg" + DELIMITER_KUMIAWASE_PAIR
+ "http://example.com/A.jpg";
String a2 = "http://example.com/b.jpg" + DELIMITER_KUMIAWASE_PAIR
+ "http://example.com/B.jpg";
String a3 = "http://example.com/c.jpg" + DELIMITER_KUMIAWASE_PAIR
+ "http://example.com/C.jpg";
List<PacketWrongAnswer> actual = presenter.normalize(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join(a1, a2, a3)).setCount(10)), problem);
assertEquals(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join(
"a.jpg" + DELIMITER_KUMIAWASE_PAIR + "A.jpg",
"b.jpg" + DELIMITER_KUMIAWASE_PAIR + "B.jpg",
"c.jpg" + DELIMITER_KUMIAWASE_PAIR + "C.jpg")).setCount(10)),
actual);
}
@Test
public void asStringShouldSortMultipleAnswers() {
String a1 = "aaa";
String a2 = "bbb";
String a3 = "ccc";
List<PacketWrongAnswer> actual = presenter.normalize(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join(a3, a2, a1)).setCount(10)), problem);
assertEquals(
ImmutableList.of(new PacketWrongAnswer().setAnswer(
Joiner.on(DELIMITER_GENERAL).join(a1, a2, a3)).setCount(10)), actual);
}
@Test
public void asStringShouldSortAnswersByCounterThenLexicograph() {
String a1 = "aaa";
String a2 = "bbb";
String a3 = "ccc";
List<PacketWrongAnswer> actual = presenter.normalize(ImmutableList.of(
new PacketWrongAnswer().setAnswer(a2).setCount(10), new PacketWrongAnswer()
.setAnswer(a3).setCount(20), new PacketWrongAnswer().setAnswer(a1)
.setCount(10)), problem);
assertEquals(ImmutableList.of(new PacketWrongAnswer().setAnswer(a3).setCount(20),
new PacketWrongAnswer().setAnswer(a1).setCount(10), new PacketWrongAnswer()
.setAnswer(a2).setCount(10)), actual);
}
@Test
public void asStringShouldNotSortTatoStrings() {
problem.type = ProblemType.Junban;
String a1 = "ccc" + DELIMITER_GENERAL + "aaa" + DELIMITER_GENERAL + "bbb";
String a2 = "bbb" + DELIMITER_GENERAL + "aaa" + DELIMITER_GENERAL + "ccc";
String a3 = "aaa" + DELIMITER_GENERAL + "bbb" + DELIMITER_GENERAL + "ccc";
List<PacketWrongAnswer> actual = presenter.normalize(ImmutableList.of(
new PacketWrongAnswer().setAnswer(a1).setCount(20), new PacketWrongAnswer()
.setAnswer(a2).setCount(10), new PacketWrongAnswer().setAnswer(a3)
.setCount(10)), problem);
assertEquals(ImmutableList.of(new PacketWrongAnswer().setAnswer(a1).setCount(20),
new PacketWrongAnswer().setAnswer(a3).setCount(10), new PacketWrongAnswer()
.setAnswer(a2).setCount(10)), actual);
}
}