package eu.project.ttc.test.unit.api; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.CoreMatchers.startsWith; import java.util.Collection; import java.util.List; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.Mockito; import com.google.common.collect.Lists; import eu.project.ttc.api.Traverser; import eu.project.ttc.models.Term; import eu.project.ttc.models.TermIndex; import eu.project.ttc.test.unit.TermFactory; public class TraverserSpec { TermIndex termIndex; Collection<Term> terms; Term term1, term2, term3; @Before public void setup() { termIndex = Mockito.mock(TermIndex.class); term1 = TermFactory.termMock("t1", 1, 3, 0.8); term2 = TermFactory.termMock("t2", 2, 1, 0.8); term3 = TermFactory.termMock("t3", 3, 2, 1); terms = Lists.newArrayList( term1, term2, term3 ); Mockito.when(termIndex.getTerms()).thenReturn(terms); } @Test public void testByFrequency() { List<Term> list = Traverser.by("f desc").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t2", "t1"); list = Traverser.by("f").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t1", "t2", "t3"); } @Test public void testDefaultTraverser() { List<Term> list = Traverser.create().toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t2", "t3", "t1"); } @Test public void testByRank() { List<Term> list = Traverser.by("#").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t2", "t3", "t1"); list = Traverser.by("# desc").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t1", "t3", "t2"); } @Test public void testBySpecificity() { List<Term> list = Traverser.by("sp").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t2", "t1", "t3"); list = Traverser.by("sp desc").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t2", "t1"); } @Test public void testBySpecificityAndRank() { List<Term> list = Traverser.by("sp desc, #").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t2", "t1"); list = Traverser.by("sp desc, # desc").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t1", "t2"); } @Test public void testBySpecificityAndFrequency() { List<Term> list = Traverser.by("sp desc, f").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t1", "t2"); list = Traverser.by("sp desc, f desc").toList(termIndex); assertThat(list) .extracting("groupingKey") .containsExactly("t3", "t2", "t1"); } @Rule public ExpectedException thrown = ExpectedException.none(); @Test public void testBadOrderingSyntax() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage(startsWith("Too many arguments")); Traverser.by("sp desc rete"); } @Test public void testUnknownOrdering() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage(startsWith("Unknown direction")); Traverser.by("sp ierygfiuer"); } @Test public void testEmptyStringNotAllowed1() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Empty string not allowed"); Traverser.by(""); } @Test public void testEmptyStringNotAllowed2() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage("Empty string not allowed"); Traverser.by("sp desc,"); } @Test public void testBadPropertyPropertyName() { thrown.expect(IllegalArgumentException.class); thrown.expectMessage(startsWith("Bad term property name")); Traverser.by("spspspspsps desc"); } }