1 package net.pterodactylus.sone.core
3 import com.google.common.eventbus.EventBus
4 import com.google.common.eventbus.Subscribe
5 import net.pterodactylus.sone.core.event.InsertionDelayChangedEvent
6 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired
7 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.ALWAYS
8 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.NO
9 import net.pterodactylus.sone.fcp.FcpInterface.FullAccessRequired.WRITING
10 import net.pterodactylus.sone.fcp.event.FcpInterfaceActivatedEvent
11 import net.pterodactylus.sone.fcp.event.FcpInterfaceDeactivatedEvent
12 import net.pterodactylus.sone.fcp.event.FullAccessRequiredChanged
13 import net.pterodactylus.util.config.Configuration
14 import net.pterodactylus.util.config.MapConfigurationBackend
15 import org.hamcrest.MatcherAssert.assertThat
16 import org.hamcrest.Matchers.emptyIterable
17 import org.hamcrest.Matchers.equalTo
18 import org.hamcrest.Matchers.hasItem
19 import org.hamcrest.Matchers.instanceOf
20 import org.hamcrest.Matchers.nullValue
24 * Unit test for [Preferences].
26 class PreferencesTest {
28 private val eventBus = EventBus()
29 private val preferences = Preferences(eventBus)
32 fun `preferences retain insertion delay`() {
33 preferences.newInsertionDelay = 15
34 assertThat(preferences.insertionDelay, equalTo(15))
38 fun `preferences sends event on setting insertion delay`() {
39 val events = mutableListOf<InsertionDelayChangedEvent>()
40 eventBus.register(object {
42 fun insertionDelayChangedEvent(event: InsertionDelayChangedEvent) =
45 preferences.newInsertionDelay = 15
46 assertThat(events, hasItem(InsertionDelayChangedEvent(15)))
49 @Test(expected = IllegalArgumentException::class)
50 fun `invalid insertion delay is rejected`() {
51 preferences.newInsertionDelay = -15
55 fun `no event is sent when invalid insertion delay is set`() {
56 val events = mutableListOf<InsertionDelayChangedEvent>()
57 eventBus.register(object {
59 fun insertionDelayChanged(event: InsertionDelayChangedEvent) =
63 preferences.newInsertionDelay = -15
64 } catch (iae: IllegalArgumentException) {
68 assertThat(events, emptyIterable())
72 fun `preferences return default value when insertion delay is set to null`() {
73 preferences.newInsertionDelay = null
74 assertThat(preferences.insertionDelay, equalTo(60))
78 fun `preferences start with insertion delay default value`() {
79 assertThat(preferences.insertionDelay, equalTo(60))
83 fun `preferences saves null for default insertion delay setting`() {
84 val configuration = Configuration(MapConfigurationBackend())
85 preferences.saveTo(configuration)
86 assertThat(configuration.getIntValue("Option/InsertionDelay").getValue(null), nullValue())
90 fun `preferences retain posts per page`() {
91 preferences.newPostsPerPage = 15
92 assertThat(preferences.postsPerPage, equalTo(15))
95 @Test(expected = IllegalArgumentException::class)
96 fun `invalid posts per page is rejected`() {
97 preferences.newPostsPerPage = -15
101 fun `preferences return default value when posts per page is set to null`() {
102 preferences.newPostsPerPage = null
103 assertThat(preferences.postsPerPage, equalTo(10))
107 fun `preferences start with posts per page default value`() {
108 assertThat(preferences.postsPerPage, equalTo(10))
112 fun `preferences retain images per page`() {
113 preferences.newImagesPerPage = 15
114 assertThat(preferences.imagesPerPage, equalTo(15))
117 @Test(expected = IllegalArgumentException::class)
118 fun `invalid images per page is rejected`() {
119 preferences.newImagesPerPage = -15
123 fun `preferences return default value when images per page is set to null`() {
124 preferences.newImagesPerPage = null
125 assertThat(preferences.imagesPerPage, equalTo(9))
129 fun `preferences start with images per page default value`() {
130 assertThat(preferences.imagesPerPage, equalTo(9))
134 fun `preferences retain characters per post`() {
135 preferences.newCharactersPerPost = 150
136 assertThat(preferences.charactersPerPost, equalTo(150))
139 @Test(expected = IllegalArgumentException::class)
140 fun `invalid characters per post is rejected`() {
141 preferences.newCharactersPerPost = -15
145 fun `preferences return default value when characters per post is set to null`() {
146 preferences.newCharactersPerPost = null
147 assertThat(preferences.charactersPerPost, equalTo(400))
151 fun `preferences start with characters per post default value`() {
152 assertThat(preferences.charactersPerPost, equalTo(400))
156 fun `preferences retain post cut off length`() {
157 preferences.newPostCutOffLength = 150
158 assertThat(preferences.postCutOffLength, equalTo(150))
161 @Test(expected = IllegalArgumentException::class)
162 fun `invalid post cut off length is rejected`() {
163 preferences.newPostCutOffLength = -15
166 @Test(expected = IllegalArgumentException::class)
167 fun `cut off length of minus one is not allowed`() {
168 preferences.newPostCutOffLength = -1
172 fun `preferences return default value when post cut off length is set to null`() {
173 preferences.newPostCutOffLength = null
174 assertThat(preferences.postCutOffLength, equalTo(200))
178 fun `preferences start with post cut off length default value`() {
179 assertThat(preferences.postCutOffLength, equalTo(200))
183 fun `preferences retain require full access of true`() {
184 preferences.newRequireFullAccess = true
185 assertThat(preferences.requireFullAccess, equalTo(true))
189 fun `preferences retain require full access of false`() {
190 preferences.newRequireFullAccess = false
191 assertThat(preferences.requireFullAccess, equalTo(false))
195 fun `preferences return default value when require full access is set to null`() {
196 preferences.newRequireFullAccess = null
197 assertThat(preferences.requireFullAccess, equalTo(false))
201 fun `preferences start with require full access default value`() {
202 assertThat(preferences.requireFullAccess, equalTo(false))
206 fun `preferences retain fcp interface active of true`() {
207 val events = mutableListOf<FcpInterfaceActivatedEvent>()
208 eventBus.register(object {
210 fun fcpInterfaceActivatedEvent(event: FcpInterfaceActivatedEvent) =
213 preferences.newFcpInterfaceActive = true
214 assertThat(preferences.fcpInterfaceActive, equalTo(true))
215 assertThat(events, hasItem<FcpInterfaceActivatedEvent>(instanceOf(FcpInterfaceActivatedEvent::class.java)))
219 fun `preferences retain fcp interface active of false`() {
220 val events = mutableListOf<FcpInterfaceDeactivatedEvent>()
221 eventBus.register(object {
223 fun fcpInterfaceDeactivatedEvent(event: FcpInterfaceDeactivatedEvent) =
226 preferences.newFcpInterfaceActive = false
227 assertThat(preferences.fcpInterfaceActive, equalTo(false))
228 assertThat(events, hasItem<FcpInterfaceDeactivatedEvent>(instanceOf(FcpInterfaceDeactivatedEvent::class.java)))
232 fun `preferences return default value when fcp interface active is set to null`() {
233 val events = mutableListOf<FcpInterfaceDeactivatedEvent>()
234 eventBus.register(object {
236 fun fcpInterfaceDeactivatedEvent(event: FcpInterfaceDeactivatedEvent) =
239 preferences.newFcpInterfaceActive = null
240 assertThat(preferences.fcpInterfaceActive, equalTo(false))
241 assertThat(events, hasItem<FcpInterfaceDeactivatedEvent>(instanceOf(FcpInterfaceDeactivatedEvent::class.java)))
245 fun `preferences start with fcp interface active default value`() {
246 assertThat(preferences.fcpInterfaceActive, equalTo(false))
250 fun `preferences retain fcp full access required of no`() {
251 verifyFullAccessRequiredChangedEvent(NO)
254 private fun verifyFullAccessRequiredChangedEvent(set: FullAccessRequired?, expected: FullAccessRequired = set!!) {
255 val events = mutableListOf<FullAccessRequiredChanged>()
256 eventBus.register(object {
258 fun fullAccessRequiredChanged(event: FullAccessRequiredChanged) =
261 preferences.newFcpFullAccessRequired = set
262 assertThat(preferences.fcpFullAccessRequired, equalTo(expected))
263 assertThat(events.single().fullAccessRequired, equalTo(expected))
267 fun `preferences retain fcp full access required of writing`() {
268 verifyFullAccessRequiredChangedEvent(WRITING)
272 fun `preferences retain fcp full access required of always`() {
273 verifyFullAccessRequiredChangedEvent(ALWAYS)
277 fun `preferences return default value when fcp full access required is set to null`() {
278 verifyFullAccessRequiredChangedEvent(null, ALWAYS)
282 fun `preferences start with fcp full access required default value`() {
283 assertThat(preferences.fcpFullAccessRequired, equalTo(ALWAYS))
287 fun `setting insertion delay to valid value sends change event`() {
288 testPreferencesChangedEvent("InsertionDelay", { preferences.newInsertionDelay = it }, 30)
292 fun `setting posts per page to valid value sends change event`() {
293 testPreferencesChangedEvent("PostsPerPage", { preferences.newPostsPerPage = it }, 31)
296 private fun <T : Any> testPreferencesChangedEvent(name: String, setter: (T) -> Unit, value: T) {
297 val events = mutableListOf<PreferenceChangedEvent>()
298 eventBus.register(object {
300 fun preferenceChanged(event: PreferenceChangedEvent) =
304 assertThat(events, hasItem(PreferenceChangedEvent(name, value)))