package tests;
import java.util.ArrayList;
import java.util.List;
import models.Question;
import models.User;
import models.database.IQuestionDatabase;
import models.database.HotDatabase.HotQuestionDatabase;
import models.helpers.Tools;
import org.junit.Before;
import org.junit.Test;
public class PaginationTest extends MockedUnitTest {
private Question question1;
private Question question3;
private final User jack = new User("Jack");
private final int questionsPerPage = 15;
private IQuestionDatabase questionDB;
@Before
public void setup() {
this.questionDB = new HotQuestionDatabase(null);
sysInfo.year(2010).month(9).day(3).hour(0).minute(0).second(0);
question3 = this.questionDB.add(jack, "Who?");
sysInfo.year(2010).month(10).day(3).hour(0).minute(0).second(0);
questionDB.add(jack, "Where?");
sysInfo.year(2010).month(10).day(3).hour(0).minute(0).second(5);
question1 = this.questionDB.add(jack, "Why?");
// To make sure all other questions have a different timestamp
sysInfo.year(2010).month(10).day(4).hour(0).minute(0).second(5);
}
@Test
public void shouldDetermineMaxIndexZeroForThreeQuestions() {
List<Question> questions = produceQuestionList(3);
assertEquals(3, questions.size());
int maxIndex = Tools.determineMaximumIndex(questions, questionsPerPage);
assertEquals(0, maxIndex);
}
@Test
public void shouldDetermineMaxIndexZeroForZeroQuestions() {
int maxIndex = Tools.determineMaximumIndex(this.questionDB.all(),
questionsPerPage);
jack.delete();
assertEquals(0, this.questionDB.all().size());
assertEquals(0, maxIndex);
}
@Test
public void shouldDetermineMaxIndexTwoForThreePages() {
int maxIndex = Tools.determineMaximumIndex(
this.produceQuestionList(42), questionsPerPage);
assertEquals(2, maxIndex);
}
@Test
public void shouldDetermineMaxIndexThreeForFourPages() {
int maxIndex = Tools.determineMaximumIndex(
this.produceQuestionList(46), questionsPerPage);
assertEquals(3, maxIndex);
}
@Test
public void shouldBeOfSizeThree() {
List<Question> questions = Tools.paginate(this.produceQuestionList(3),
questionsPerPage, 0);
assertEquals(3, questions.size());
}
@Test
public void shouldPaginateCorrectly() {
List<Question> questionList = this.produceQuestionList(18);
List<Question> questions = Tools.paginate(questionList,
questionsPerPage, 0);
assertEquals(15, questions.size());
questions = Tools.paginate(questionList, questionsPerPage, 1);
assertEquals(3, questions.size());
}
@Test
public void shouldPaginateCorrectlyForThreePages() {
List<Question> questionList = this.produceQuestionList(45);
List<Question> questions = Tools.paginate(questionList,
questionsPerPage, 0);
assertEquals(15, questions.size());
questions = Tools.paginate(questionList, questionsPerPage, 1);
assertEquals(15, questions.size());
questions = Tools.paginate(questionList, questionsPerPage, 2);
assertEquals(15, questions.size());
}
@Test
public void shouldPaginateCorrectlyForZeroQuestions() {
jack.delete();
int index = 0;
List<Question> questions = Tools.paginate(this.questionDB.all(),
questionsPerPage, index);
assertEquals(0, questions.size());
}
@Test
public void shouldPaginateCorrectlyForOneQuestion() {
question1.delete();
question3.delete();
int index = 0;
List<Question> questions = Tools.paginate(this.questionDB.all(),
questionsPerPage, index);
assertEquals(1, questions.size());
}
@Test
public void shouldPaginateCorrectlyForFifteenQuestions() {
List<Question> questionList = this.produceQuestionList(15);
List<Question> questions = Tools.paginate(questionList,
questionsPerPage, 0);
assertEquals(15, questions.size());
questions = Tools.paginate(questionList, questionsPerPage, 1);
assertEquals(0, questions.size());
}
@Test
public void shouldPaginateCorrectlyForSixteenQuestions() {
List<Question> questionList = this.produceQuestionList(16);
List<Question> questions = Tools.paginate(questionList,
questionsPerPage, 0);
assertEquals(15, questions.size());
questions = Tools.paginate(questionList, questionsPerPage, 1);
assertEquals(1, questions.size());
}
@Test
public void shouldYieldEmptyPagesAfterEnd() {
List<Question> questions = Tools.paginate(this.questionDB.all(),
questionsPerPage, 1);
assertEquals(0, questions.size());
}
private List<Question> produceQuestionList(int size) {
List<Question> questions = new ArrayList<Question>();
for (int i = 0; i < size; i++) {
questions.add(new Question(this.jack, "Question " + i));
}
return questions;
}
}