blob: da2f3e5f3f7a0957b9cb3e2aa2ad194928257cc4 [file] [log] [blame]
/*
* Copyright 2016-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.coroutines.flow
import kotlinx.coroutines.*
import kotlin.test.*
import kotlin.time.*
import kotlin.time.Duration.Companion.milliseconds
import kotlin.time.Duration.Companion.seconds
class SharingStartedWhileSubscribedTest : TestBase() {
@Test // make sure equals works properly, or otherwise other tests don't make sense
fun testEqualsAndHashcode() {
val params = listOf(0L, 1L, 10L, 100L, 213L, Long.MAX_VALUE)
// HashMap will simultaneously test equals, hashcode and their consistency
val map = HashMap<SharingStarted, Pair<Long, Long>>()
for (i in params) {
for (j in params) {
map[SharingStarted.WhileSubscribed(i, j)] = i to j
}
}
for (i in params) {
for (j in params) {
assertEquals(i to j, map[SharingStarted.WhileSubscribed(i, j)])
}
}
}
@Test
fun testDurationParams() {
assertEquals(SharingStarted.WhileSubscribed(0), SharingStarted.WhileSubscribed(Duration.ZERO))
assertEquals(SharingStarted.WhileSubscribed(10), SharingStarted.WhileSubscribed(10.milliseconds))
assertEquals(SharingStarted.WhileSubscribed(1000), SharingStarted.WhileSubscribed(1.seconds))
assertEquals(SharingStarted.WhileSubscribed(Long.MAX_VALUE), SharingStarted.WhileSubscribed(Duration.INFINITE))
assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 0), SharingStarted.WhileSubscribed(replayExpiration = Duration.ZERO))
assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 3), SharingStarted.WhileSubscribed(
replayExpiration = 3.milliseconds
))
assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = 7000),
SharingStarted.WhileSubscribed(replayExpiration = 7.seconds))
assertEquals(SharingStarted.WhileSubscribed(replayExpirationMillis = Long.MAX_VALUE), SharingStarted.WhileSubscribed(replayExpiration = Duration.INFINITE))
}
@Test
fun testShouldRestart() = runTest {
var started = 0
val flow = flow {
expect(1 + ++started)
emit(1)
hang { }
}.shareIn(this, SharingStarted.WhileSubscribed(100 /* ms */))
expect(1)
flow.first()
delay(200)
flow.first()
finish(4)
coroutineContext.job.cancelChildren()
}
@Test
fun testImmediateUnsubscribe() = runTest {
val flow = flow {
expect(2)
emit(1)
hang { finish(4) }
}.shareIn(this, SharingStarted.WhileSubscribed(400, 0 /* ms */), 1)
expect(1)
repeat(5) {
flow.first()
delay(100)
}
expect(3)
coroutineContext.job.cancelChildren()
}
}