package io.kaif.model.debate;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.*;
import static org.junit.Assert.*;
import java.util.Collections;
import java.util.List;
import java.util.function.ToDoubleFunction;
import org.junit.Test;
import io.kaif.model.article.Article;
import io.kaif.model.zone.Zone;
import io.kaif.test.ModelFixture;
import io.kaif.web.v1.dto.V1DebateNodeDto;
public class DebateTreeTest implements ModelFixture {
private Article article = article(Zone.valueOf("fun"), "art-1");
@Test
public void fromDepthFirst_empty() throws Exception {
DebateTree debateTree = DebateTree.fromDepthFirst(Collections.emptyList());
assertEquals(0, debateTree.depthFirst().count());
}
@Test
public void sortByBestScore() throws Exception {
Debate d1 = debate(null).withVote(100, 0);
Debate d1_1 = debate(d1).withVote(80, 0);
Debate d1_1_1 = debate(d1_1).withVote(60, 0);
Debate d1_1_2 = debate(d1_1).withVote(120, 0);
Debate d1_2 = debate(d1).withVote(150, 0);
Debate d2 = debate(null).withVote(20, 0);
Debate d2_1 = debate(d2).withVote(250, 0);
Debate d2_1_1 = debate(d2_1).withVote(0, 0);
Debate d2_2 = debate(d2).withVote(40, 0);
Debate d3 = debate(null).withVote(10, 0);
Debate d3_1 = debate(d3).withVote(3, 0);
List<Debate> flatten = asList(//
d1, d1_1, d1_1_1, d1_1_2, d1_2, //
d2, d2_1, d2_1_1, d2_2, //
d3, d3_1);
DebateTree debateTree = DebateTree.fromDepthFirst(flatten);
//calc only up vote only
ToDoubleFunction<Debate> upVoteCalc = (debate) -> debate == null ? 0 : debate.getUpVote();
DebateTree sorted = debateTree.sortByBestScore(upVoteCalc);
List<Debate> bestScore = asList(//
d2, d2_1, d2_1_1, d2_2, //
d1, d1_2, d1_1, d1_1_2, d1_1_1, //
d3, d3_1);
assertEquals(bestScore, sorted.depthFirst().collect(toList()));
}
@Test
public void sortByBestScore_wilson() throws Exception {
Debate d1 = debate(null).withVote(100, 30);
Debate d2 = debate(null).withVote(20, 30);
Debate d2_1 = debate(d2).withVote(25, 3); //highest in wilson, > d1
Debate d2_2 = debate(d2).withVote(40, 30);
Debate d3 = debate(null).withVote(10, 30);
Debate d3_1 = debate(d3).withVote(3, 30);
List<Debate> flatten = asList(//
d1,//
d2, d2_1, d2_2, //
d3, d3_1);
DebateTree debateTree = DebateTree.fromDepthFirst(flatten);
DebateTree sorted = debateTree.sortByBestScore();
List<Debate> bestScore = asList(//
d2, d2_1, d2_2, //
d1,//
d3, d3_1);
assertEquals(bestScore, sorted.depthFirst().collect(toList()));
}
@Test
public void fromDepthFirst() throws Exception {
Debate d1 = debate(null);
Debate d1_1 = debate(d1);
Debate d1_1_1 = debate(d1_1);
Debate d1_1_2 = debate(d1_1);
Debate d1_2 = debate(d1);
Debate d2 = debate(null);
Debate d2_1 = debate(d2);
Debate d2_1_1 = debate(d2_1);
Debate d2_2 = debate(d2);
Debate d3 = debate(null);
Debate d3_1 = debate(d3);
List<Debate> flatten = asList(//
d1, d1_1, d1_1_1, d1_1_2, d1_2, //
d2, d2_1, d2_1_1, d2_2, //
d3, d3_1);
DebateTree debateTree = DebateTree.fromDepthFirst(flatten);
assertEquals(flatten, debateTree.depthFirst().collect(toList()));
}
@Test
public void toV1Dto() throws Exception {
Debate d1 = debate(null);
Debate d2 = debate(null);
Debate d2_1 = debate(d2);
Debate d2_2 = debate(d2);
Debate d3 = debate(null);
Debate d3_1 = debate(d3);
List<Debate> flatten = asList(//
d1,//
d2, d2_1, d2_2, //
d3, d3_1);
DebateTree tree = DebateTree.fromDepthFirst(flatten);
V1DebateNodeDto dto = tree.toV1Dto();
assertNull(dto.getDebate());
List<V1DebateNodeDto> children1 = dto.getChildren();
assertEquals(d1.getDebateId().toString(), children1.get(0).getDebate().getDebateId());
assertEquals(d2.getDebateId().toString(), children1.get(1).getDebate().getDebateId());
assertEquals(d3.getDebateId().toString(), children1.get(2).getDebate().getDebateId());
assertTrue(children1.get(0).getChildren().isEmpty());
List<V1DebateNodeDto> children2 = children1.get(1).getChildren();
assertEquals(d2_1.getDebateId().toString(), children2.get(0).getDebate().getDebateId());
assertEquals(d2_2.getDebateId().toString(), children2.get(1).getDebate().getDebateId());
assertTrue(children2.get(0).getChildren().isEmpty());
assertTrue(children2.get(1).getChildren().isEmpty());
List<V1DebateNodeDto> children3 = children1.get(2).getChildren();
assertEquals(d3_1.getDebateId().toString(), children3.get(0).getDebate().getDebateId());
assertTrue(children3.get(0).getChildren().isEmpty());
}
private Debate debate(Debate parent) {
return debate(article, "", parent);
}
}