blob: 2e165c1fa7b37d53017fc2318f7b9fa67708eaf9 [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
Roman Elizarov592de522018-09-10 20:06:38 +030013 fun testPromiseResolvedAsDeferred() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030014 val promise = Promise<String> { resolve, _ ->
15 resolve("OK")
16 }
17 val deferred = promise.asDeferred()
18 assertEquals("OK", deferred.await())
19 }
20
21 @Test
Roman Elizarov592de522018-09-10 20:06:38 +030022 fun testPromiseRejectedAsDeferred() = GlobalScope.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
Roman Elizarov592de522018-09-10 20:06:38 +030040 fun testCompletedDeferredAsPromise() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030041 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
Roman Elizarov592de522018-09-10 20:06:38 +030050 fun testWaitForDeferredAsPromise() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030051 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
Roman Elizarov592de522018-09-10 20:06:38 +030060 fun testCancellableAwaitPromise() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030061 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
Roman Elizarov592de522018-09-10 20:06:38 +030071 fun testAsPromiseAsDeferred() = GlobalScope.promise {
Roman Elizarovb1708192017-12-22 12:14:05 +030072 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}