| /* |
| * 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()) |
| } |
| } |
| } |