blob: 0398b1d4999af0b81e55d6ff5e510e701f07f6b7 [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
5package kotlinx.coroutines.experimental
6
Roman Elizarov9fe5f462018-02-21 19:05:52 +03007import kotlin.coroutines.experimental.*
8import kotlin.js.*
Roman Elizarovb1708192017-12-22 12:14:05 +03009import kotlin.test.*
10
Roman Elizarovb1708192017-12-22 12:14:05 +030011class PromiseTest : TestBase() {
12 @Test
13 fun testPromiseResolvedAsDeferred() = promise {
14 val promise = Promise<String> { resolve, _ ->
15 resolve("OK")
16 }
17 val deferred = promise.asDeferred()
18 assertEquals("OK", deferred.await())
19 }
20
21 @Test
22 fun testPromiseRejectedAsDeferred() = promise {
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030023 lateinit var promiseReject: (Throwable) -> Unit
Roman Elizarovb1708192017-12-22 12:14:05 +030024 val promise = Promise<String> { _, reject ->
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030025 promiseReject = reject
Roman Elizarovb1708192017-12-22 12:14:05 +030026 }
27 val deferred = promise.asDeferred()
Roman Elizarov1bb8c1c2018-01-11 10:39:46 +030028 // reject after converting to deferred to avoid "Unhandled promise rejection" warnings
29 promiseReject(TestException("Rejected"))
Roman Elizarovb1708192017-12-22 12:14:05 +030030 try {
31 deferred.await()
32 expectUnreached()
33 } catch (e: Throwable) {
34 assertTrue(e is TestException)
35 assertEquals("Rejected", e.message)
36 }
37 }
38
39 @Test
40 fun testCompletedDeferredAsPromise() = promise {
41 val deferred = async(coroutineContext, CoroutineStart.UNDISPATCHED) {
42 // completed right away
43 "OK"
44 }
45 val promise = deferred.asPromise()
46 assertEquals("OK", promise.await())
47 }
48
49 @Test
50 fun testWaitForDeferredAsPromise() = promise {
51 val deferred = async(coroutineContext) {
52 // will complete later
53 "OK"
54 }
55 val promise = deferred.asPromise()
56 assertEquals("OK", promise.await()) // await yields main thread to deferred coroutine
57 }
58
59 @Test
60 fun testCancellableAwaitPromise() = promise {
61 lateinit var r: (String) -> Unit
62 val toAwait = Promise<String> { resolve, _ -> r = resolve }
63 val job = launch(coroutineContext, CoroutineStart.UNDISPATCHED) {
64 toAwait.await() // suspends
65 }
66 job.cancel() // cancel the job
67 r("fail") // too late, the waiting job was already cancelled
68 }
69
70 @Test
71 fun testAsPromiseAsDeferred() = promise {
72 val deferred = async { "OK" }
73 val promise = deferred.asPromise()
74 val d2 = promise.asDeferred()
75 assertTrue(d2 === deferred)
76 assertEquals("OK", d2.await())
77 }
78
79 private class TestException(message: String) : Exception(message)
80}