• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download

<lambda>null1 package kotlinx.coroutines
2 
3 import kotlinx.coroutines.testing.*
4 import kotlin.js.*
5 import kotlin.test.*
6 
7 class PromiseTest : TestBase() {
8     @Test
9     fun testPromiseResolvedAsDeferred() = GlobalScope.promise {
10         val promise = Promise<JsReference<String>> { resolve, _ ->
11             resolve("OK".toJsReference())
12         }
13         val deferred = promise.asDeferred<JsReference<String>>()
14         assertEquals("OK", deferred.await().get())
15     }
16 
17     @Test
18     fun testPromiseRejectedAsDeferred() = GlobalScope.promise {
19         lateinit var promiseReject: (JsAny) -> Unit
20         val promise = Promise<JsAny?> { _, reject ->
21             promiseReject = reject
22         }
23         val deferred = promise.asDeferred<JsReference<String>>()
24         // reject after converting to deferred to avoid "Unhandled promise rejection" warnings
25         promiseReject(TestException("Rejected").toJsReference())
26         try {
27             deferred.await()
28             expectUnreached()
29         } catch (e: Throwable) {
30             assertIs<TestException>(e)
31             assertEquals("Rejected", e.message)
32         }
33     }
34 
35     @Test
36     fun testCompletedDeferredAsPromise() = GlobalScope.promise {
37         val deferred = async(start = CoroutineStart.UNDISPATCHED) {
38             // completed right away
39             "OK"
40         }
41         val promise = deferred.asPromise()
42         assertEquals("OK", promise.await())
43     }
44 
45     @Test
46     fun testWaitForDeferredAsPromise() = GlobalScope.promise {
47         val deferred = async {
48             // will complete later
49             "OK"
50         }
51         val promise = deferred.asPromise()
52         assertEquals("OK", promise.await()) // await yields main thread to deferred coroutine
53     }
54 
55     @Test
56     fun testCancellableAwaitPromise() = GlobalScope.promise {
57         lateinit var r: (JsAny) -> Unit
58         val toAwait = Promise<JsAny?> { resolve, _ -> r = resolve }
59         val job = launch(start = CoroutineStart.UNDISPATCHED) {
60             toAwait.await() // suspends
61         }
62         job.cancel() // cancel the job
63         r("fail".toJsString()) // too late, the waiting job was already cancelled
64     }
65 
66     @Test
67     fun testAsPromiseAsDeferred() = GlobalScope.promise {
68         val deferred = async { "OK" }
69         val promise = deferred.asPromise()
70         val d2 = promise.asDeferred<String>()
71         assertSame(d2, deferred)
72         assertEquals("OK", d2.await())
73     }
74 
75     @Test
76     fun testLeverageTestResult(): TestResult {
77         // Cannot use expect(..) here
78         var seq = 0
79         val result = runTest {
80             ++seq
81         }
82         return result.then {
83             if (seq != 1) error("Unexpected result: $seq")
84             null
85         }
86     }
87 
88     @Test
89     fun testAwaitPromiseRejectedWithNonKotlinException() = GlobalScope.promise {
90         lateinit var r: (JsAny) -> Unit
91         val toAwait = Promise<JsAny?> { _, reject -> r = reject }
92         val throwable = async(start = CoroutineStart.UNDISPATCHED) {
93             assertFails { toAwait.await<JsAny?>() }
94         }
95         r("Rejected".toJsString())
96         assertIs<JsException>(throwable.await())
97     }
98 
99     @Test
100     fun testAwaitPromiseRejectedWithKotlinException() = GlobalScope.promise {
101         lateinit var r: (JsAny) -> Unit
102         val toAwait = Promise<JsAny?> { _, reject -> r = reject }
103         val throwable = async(start = CoroutineStart.UNDISPATCHED) {
104             assertFails { toAwait.await<JsAny?>() }
105         }
106         r(RuntimeException("Rejected").toJsReference())
107         assertIs<RuntimeException>(throwable.await())
108         assertEquals("Rejected", throwable.await().message)
109     }
110 }
111