blob: 0398b1d4999af0b81e55d6ff5e510e701f07f6b7 [file] [log] [blame]
/*
* Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.coroutines.experimental
import kotlin.coroutines.experimental.*
import kotlin.js.*
import kotlin.test.*
class PromiseTest : TestBase() {
@Test
fun testPromiseResolvedAsDeferred() = promise {
val promise = Promise<String> { resolve, _ ->
resolve("OK")
}
val deferred = promise.asDeferred()
assertEquals("OK", deferred.await())
}
@Test
fun testPromiseRejectedAsDeferred() = promise {
lateinit var promiseReject: (Throwable) -> Unit
val promise = Promise<String> { _, reject ->
promiseReject = reject
}
val deferred = promise.asDeferred()
// reject after converting to deferred to avoid "Unhandled promise rejection" warnings
promiseReject(TestException("Rejected"))
try {
deferred.await()
expectUnreached()
} catch (e: Throwable) {
assertTrue(e is TestException)
assertEquals("Rejected", e.message)
}
}
@Test
fun testCompletedDeferredAsPromise() = promise {
val deferred = async(coroutineContext, CoroutineStart.UNDISPATCHED) {
// completed right away
"OK"
}
val promise = deferred.asPromise()
assertEquals("OK", promise.await())
}
@Test
fun testWaitForDeferredAsPromise() = promise {
val deferred = async(coroutineContext) {
// will complete later
"OK"
}
val promise = deferred.asPromise()
assertEquals("OK", promise.await()) // await yields main thread to deferred coroutine
}
@Test
fun testCancellableAwaitPromise() = promise {
lateinit var r: (String) -> Unit
val toAwait = Promise<String> { resolve, _ -> r = resolve }
val job = launch(coroutineContext, CoroutineStart.UNDISPATCHED) {
toAwait.await() // suspends
}
job.cancel() // cancel the job
r("fail") // too late, the waiting job was already cancelled
}
@Test
fun testAsPromiseAsDeferred() = promise {
val deferred = async { "OK" }
val promise = deferred.asPromise()
val d2 = promise.asDeferred()
assertTrue(d2 === deferred)
assertEquals("OK", d2.await())
}
private class TestException(message: String) : Exception(message)
}