package tests; import java.util.ArrayList; import java.util.List; import models.Answer; import models.Question; import models.Tag; import models.User; import models.database.IQuestionDatabase; import models.database.ITagDatabase; import models.database.HotDatabase.HotQuestionDatabase; import models.database.HotDatabase.HotTagDatabase; import org.junit.Before; import org.junit.Test; public class ExpertiseTest extends MockedUnitTest { private User john; private List<User> users; private Question question; private IQuestionDatabase questionDB; private ITagDatabase tagDB; @Before public void setUp() { this.tagDB = new HotTagDatabase(); this.questionDB = new HotQuestionDatabase(this.tagDB); users = new ArrayList(); for (int i = 0; i < 20; i++) users.add(new User("user " + i)); john = new User("John"); question = this.questionDB.add(new User("James"), "Question"); } @Test public void shouldBeSoleExpert() { question.setTagString("sole-expert"); for (int i = 10; i < 20; i++) question.answer(users.get(i), "Answer " + i); Answer answer = question.answer(john, "Answer"); for (int i = 0; i < 10; i++) answer.voteUp(users.get(i)); Tag tag = this.tagDB.get("sole-expert"); assertEquals(this.questionDB.getExpertise(john).size(), 1); assertTrue(this.questionDB.getExpertise(john).contains(tag)); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); for (int i = 0; i < 20; i++) assertFalse(this.questionDB.getExpertise(users.get(i)) .contains(tag)); } @Test public void shouldAlsoBeExpert() { question.setTagString("also-expert"); for (int i = 10; i < 20; i++) question.answer(users.get(i), "Answer " + i); int k = 6; for (Answer uanswer : question.answers()) { for (int i = 0; i < k; i++) uanswer.voteUp(users.get(i)); k--; } Answer answer = question.answer(john, "Answer"); question.setBestAnswer(answer); Tag tag = this.tagDB.get("also-expert"); assertEquals(this.questionDB.getExpertise(john).size(), 1); assertTrue(this.questionDB.getExpertise(john).contains(tag)); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); for (int i = 0; i < 20; i++) assertEquals( this.questionDB.getExpertise(users.get(i)).contains(tag), 10 <= i && i < 12); } @Test public void shouldNotBeExpert() { question.setTagString("no-expert"); for (int i = 10; i < 20; i++) question.answer(users.get(i), "Answer " + i); int k = 7; for (Answer uanswer : question.answers()) { for (int i = 0; i < k; i++) uanswer.voteUp(users.get(i)); k--; } Answer answer = question.answer(john, "Answer"); for (int i = 0; i < 4; i++) answer.voteUp(users.get(i)); Tag tag = this.tagDB.get("no-expert"); assertEquals(this.questionDB.getExpertise(john).size(), 0); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); for (int i = 0; i < 20; i++) assertEquals( this.questionDB.getExpertise(users.get(i)).contains(tag), 10 <= i && i < 13); assertEquals(this.questionDB.getExpertise(john).size(), 0); users.get(10).anonymize(true); users.get(11).anonymize(true); assertEquals(this.questionDB.getExpertise(john).size(), 1); } @Test public void shouldNotBeExpertWithoutAnswer() { question.setTagString("no-answer"); for (int i = 10; i < 20; i++) question.answer(users.get(i), "Answer " + i); int k = 2; for (Answer uanswer : question.answers()) { for (int i = 0; i < k; i++) uanswer.voteUp(users.get(i)); k--; } Tag tag = this.tagDB.get("no-answer"); assertEquals(this.questionDB.getExpertise(john).size(), 0); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); for (int i = 0; i < 20; i++) assertEquals( this.questionDB.getExpertise(users.get(i)).contains(tag), 10 == i); } @Test public void shouldNotBeExpertForOwnQuestions() { User james = question.owner(); question.setTagString("own-answer"); Answer answer = question.answer(james, "Answer"); question.setBestAnswer(answer); Tag tag = this.tagDB.get("own-answer"); assertEquals(this.questionDB.getExpertise(james).size(), 0); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); } @Test public void shouldNotBeExpertWithoutTags() { Answer answer = question.answer(john, "Answer"); for (int i = 0; i < 10; i++) answer.voteUp(users.get(i)); assertEquals(this.questionDB.getExpertise(john).size(), 0); } @Test public void shouldCumulateVotes() { question.setTagString("sole-expert"); for (int i = 0; i < 10; i++) question.answer(john, "Answer " + i); for (int i = 0; i < 3; i++) john.getAnswers().get(3 + i).voteUp(question.owner()); Tag tag = this.tagDB.get("sole-expert"); assertEquals(this.questionDB.getExpertise(john).size(), 1); assertTrue(this.questionDB.getExpertise(john).contains(tag)); assertFalse(this.questionDB.getExpertise(question.owner()) .contains(tag)); } }