blob: d0f6b2b71499c776fa3628bfe6541a178f300346 [file] [log] [blame]
Roman Elizarovb1708192017-12-22 12:14:05 +03001/*
Roman Elizarov1f74a2d2018-06-29 19:19:45 +03002 * Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
Roman Elizarovb1708192017-12-22 12:14:05 +03003 */
4
Roman Elizarov0950dfa2018-07-13 10:33:25 +03005package kotlinx.coroutines
Roman Elizarovb1708192017-12-22 12:14:05 +03006
Roman Elizarov9fe5f462018-02-21 19:05:52 +03007import kotlin.js.*
Roman Elizarovb1708192017-12-22 12:14:05 +03008import kotlin.test.*
9
Roman Elizarovb1708192017-12-22 12:14:05 +030010class PromiseTest : TestBase() {
11 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030012 fun testPromiseResolvedAsDeferred() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030013 val promise = Promise<String> { resolve, _ ->
14 resolve("OK")
15 }
16 val deferred = promise.asDeferred()
17 assertEquals("OK", deferred.await())
18 }
19
20 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030021 fun testPromiseRejectedAsDeferred() = GlobalScope.promise {
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030022 lateinit var promiseReject: (Throwable) -> Unit
Roman Elizarovb1708192017-12-22 12:14:05 +030023 val promise = Promise<String> { _, reject ->
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030024 promiseReject = reject
Roman Elizarovb1708192017-12-22 12:14:05 +030025 }
26 val deferred = promise.asDeferred()
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030027 // reject after converting to deferred to avoid "Unhandled promise rejection" warnings
28 promiseReject(TestException("Rejected"))
Roman Elizarovb1708192017-12-22 12:14:05 +030029 try {
30 deferred.await()
31 expectUnreached()
32 } catch (e: Throwable) {
33 assertTrue(e is TestException)
34 assertEquals("Rejected", e.message)
35 }
36 }
37
38 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030039 fun testCompletedDeferredAsPromise() = GlobalScope.promise {
Roman Elizarov6e3ffb12018-09-14 13:46:58 +030040 val deferred = async(start = CoroutineStart.UNDISPATCHED) {
Roman Elizarovb1708192017-12-22 12:14:05 +030041 // completed right away
42 "OK"
43 }
44 val promise = deferred.asPromise()
45 assertEquals("OK", promise.await())
46 }
47
48 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030049 fun testWaitForDeferredAsPromise() = GlobalScope.promise {
Roman Elizarov6e3ffb12018-09-14 13:46:58 +030050 val deferred = async {
Roman Elizarovb1708192017-12-22 12:14:05 +030051 // will complete later
52 "OK"
53 }
54 val promise = deferred.asPromise()
55 assertEquals("OK", promise.await()) // await yields main thread to deferred coroutine
56 }
57
58 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030059 fun testCancellableAwaitPromise() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030060 lateinit var r: (String) -> Unit
61 val toAwait = Promise<String> { resolve, _ -> r = resolve }
Roman Elizarov6e3ffb12018-09-14 13:46:58 +030062 val job = launch(start = CoroutineStart.UNDISPATCHED) {
Roman Elizarovb1708192017-12-22 12:14:05 +030063 toAwait.await() // suspends
64 }
65 job.cancel() // cancel the job
66 r("fail") // too late, the waiting job was already cancelled
67 }
68
69 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030070 fun testAsPromiseAsDeferred() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030071 val deferred = async { "OK" }
72 val promise = deferred.asPromise()
73 val d2 = promise.asDeferred()
Vsevolod Tolstopyatov0b886a32018-10-25 13:52:38 +030074 assertSame(d2, deferred)
Roman Elizarovb1708192017-12-22 12:14:05 +030075 assertEquals("OK", d2.await())
76 }
Roman Elizarovb1708192017-12-22 12:14:05 +030077}