blob: 260edf9dc89b2898d41ec640189b03ffb2780570 [file] [log] [blame]
/*
* Copyright 2016-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.coroutines.test
import kotlinx.coroutines.*
import org.junit.Test
import kotlin.test.*
class TestCoroutineDispatcherTest {
@Test
fun whenStringCalled_itReturnsString() {
val subject = TestCoroutineDispatcher()
assertEquals("TestCoroutineDispatcher[currentTime=0ms, queued=0]", subject.toString())
}
@Test
fun whenStringCalled_itReturnsCurrentTime() {
val subject = TestCoroutineDispatcher()
subject.advanceTimeBy(1000)
assertEquals("TestCoroutineDispatcher[currentTime=1000ms, queued=0]", subject.toString())
}
@Test
fun whenStringCalled_itShowsQueuedJobs() {
val subject = TestCoroutineDispatcher()
val scope = TestCoroutineScope(subject)
scope.pauseDispatcher()
scope.launch {
delay(1_000)
}
assertEquals("TestCoroutineDispatcher[currentTime=0ms, queued=1]", subject.toString())
scope.advanceTimeBy(50)
assertEquals("TestCoroutineDispatcher[currentTime=50ms, queued=1]", subject.toString())
scope.advanceUntilIdle()
assertEquals("TestCoroutineDispatcher[currentTime=1000ms, queued=0]", subject.toString())
}
@Test
fun whenDispatcherPaused_doesntAutoProgressCurrent() {
val subject = TestCoroutineDispatcher()
subject.pauseDispatcher()
val scope = CoroutineScope(subject)
var executed = 0
scope.launch {
executed++
}
assertEquals(0, executed)
}
@Test
fun whenDispatcherResumed_doesAutoProgressCurrent() {
val subject = TestCoroutineDispatcher()
val scope = CoroutineScope(subject)
var executed = 0
scope.launch {
executed++
}
assertEquals(1, executed)
}
@Test
fun whenDispatcherResumed_doesNotAutoProgressTime() {
val subject = TestCoroutineDispatcher()
val scope = CoroutineScope(subject)
var executed = 0
scope.launch {
delay(1_000)
executed++
}
assertEquals(0, executed)
subject.advanceUntilIdle()
assertEquals(1, executed)
}
@Test
fun whenDispatcherPaused_thenResume_itDoesDispatchCurrent() {
val subject = TestCoroutineDispatcher()
subject.pauseDispatcher()
val scope = CoroutineScope(subject)
var executed = 0
scope.launch {
executed++
}
assertEquals(0, executed)
subject.resumeDispatcher()
assertEquals(1, executed)
}
@Test(expected = UncompletedCoroutinesError::class)
fun whenDispatcherHasUncompletedCoroutines_itThrowsErrorInCleanup() {
val subject = TestCoroutineDispatcher()
subject.pauseDispatcher()
val scope = CoroutineScope(subject)
scope.launch {
delay(1_000)
}
subject.cleanupTestCoroutines()
}
@Test
fun whenDispatchCalled_runsOnCurrentThread() {
val currentThread = Thread.currentThread()
val subject = TestCoroutineDispatcher()
val scope = TestCoroutineScope(subject)
val deferred = scope.async(Dispatchers.Default) {
withContext(subject) {
assertNotSame(currentThread, Thread.currentThread())
3
}
}
runBlocking {
// just to ensure the above code terminates
assertEquals(3, deferred.await())
}
}
@Test
fun whenAllDispatchersMocked_runsOnSameThread() {
val currentThread = Thread.currentThread()
val subject = TestCoroutineDispatcher()
val scope = TestCoroutineScope(subject)
val deferred = scope.async(subject) {
withContext(subject) {
assertSame(currentThread, Thread.currentThread())
3
}
}
runBlocking {
// just to ensure the above code terminates
assertEquals(3, deferred.await())
}
}
}