1 package net.pterodactylus.rhynodge.queries
3 import net.pterodactylus.rhynodge.Query
4 import net.pterodactylus.rhynodge.State
5 import net.pterodactylus.rhynodge.states.AbstractState
6 import net.pterodactylus.rhynodge.states.FailedState
7 import org.hamcrest.MatcherAssert.assertThat
8 import org.hamcrest.Matchers.`is`
9 import org.hamcrest.Matchers.sameInstance
12 import org.junit.rules.ExpectedException
13 import org.mockito.Mockito.`when`
14 import org.mockito.Mockito.mock
15 import org.mockito.Mockito.never
16 import org.mockito.Mockito.verify
19 * Unit test for [FallbackQuery].
21 * @author [David ‘Bombe’ Roden](mailto:bombe@pterodactylus.net)
23 class FallbackQueryTest {
25 @JvmField @Rule val expectedException = ExpectedException.none()!!
27 private val firstQuery = mock(Query::class.java)
28 private val secondQuery = mock(Query::class.java)
29 private val thirdQuery = mock(Query::class.java)
30 private val query = FallbackQuery(firstQuery, secondQuery, thirdQuery)
32 private fun setupQueries(firstState: State = FailedState(), secondState: State = FailedState(), thirdState: State = FailedState()) {
33 `when`(firstQuery.state()).thenReturn(firstState)
34 `when`(secondQuery.state()).thenReturn(secondState)
35 `when`(thirdQuery.state()).thenReturn(thirdState)
39 fun `fallback query returns state of third query`() {
40 val successState: AbstractState = object : AbstractState() {}
41 setupQueries(thirdState = successState)
42 assertThat(query.state(), sameInstance<State>(successState))
46 fun `fallback query calls all three queries`() {
47 val successState: AbstractState = object : AbstractState() {}
48 setupQueries(thirdState = successState)
50 verify(firstQuery).state()
51 verify(secondQuery).state()
52 verify(thirdQuery).state()
56 fun `fallback query returns second state`() {
57 val successState: AbstractState = object : AbstractState() {}
58 setupQueries(secondState = successState)
59 assertThat(query.state(), sameInstance<State>(successState))
63 fun `fallback query does not query third query`() {
64 val successState: AbstractState = object : AbstractState() {}
65 setupQueries(secondState = successState)
67 verify(firstQuery).state()
68 verify(secondQuery).state()
69 verify(thirdQuery, never()).state()
73 fun `fallback query returns first state`() {
74 val successState: AbstractState = object : AbstractState() {}
75 setupQueries(firstState = successState)
76 assertThat(query.state(), sameInstance<State>(successState))
80 fun `fallback query does not query second and third query`() {
81 val successState: AbstractState = object : AbstractState() {}
82 setupQueries(firstState = successState)
84 verify(firstQuery).state()
85 verify(secondQuery, never()).state()
86 verify(thirdQuery, never()).state()
90 fun `fallback query returns failed state if no query succeeds`() {
92 assertThat(query.state().success(), `is`(false))
96 fun `fallback query can not be created without queries`() {
97 expectedException.expect(IllegalArgumentException::class.java)