1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("ObsoleteExperimentalCoroutines")
package test.coroutines
import java.util.concurrent.Semaphore
import kotlin.coroutines.*
import kotlin.coroutines.experimental.startCoroutine
import kotlin.test.*
/**
* Tests on coroutines standard library functions.
*/
class CoroutinesTest {
/**
* Makes sure that using [startCoroutine] with suspending references properly establishes intercepted context.
*/
@Test
fun testStartInterceptedSuspendReference() {
val done = Semaphore(0)
TestDispatcher("Result").use { resumeDispatcher ->
TestDispatcher("Context").use { contextDispatcher ->
val switcher = DispatcherSwitcher(contextDispatcher, resumeDispatcher)
val ref = switcher::run // callable reference
ref.startCoroutine(Continuation(contextDispatcher) { result ->
contextDispatcher.assertThread()
assertEquals(42, result.getOrThrow())
done.release()
})
done.acquire()
}
}
}
}
class DispatcherSwitcher(
private val contextDispatcher: TestDispatcher,
private val resumeDispatcher: TestDispatcher
) {
suspend fun run(): Int = suspendCoroutine { cont ->
contextDispatcher.assertThread()
resumeDispatcher.executor.execute {
resumeDispatcher.assertThread()
cont.resume(42)
}
}
}
|