xref: /aosp_15_r20/external/kotlinx.coroutines/kotlinx-coroutines-core/js/test/PromiseTest.kt (revision 7a7160fed73afa6648ef8aa100d4a336fe921d9a)

<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<String> { resolve, _ ->
11             resolve("OK")
12         }
13         val deferred = promise.asDeferred()
14         assertEquals("OK", deferred.await())
15     }
16 
17     @Test
18     fun testPromiseRejectedAsDeferred() = GlobalScope.promise {
19         lateinit var promiseReject: (Throwable) -> Unit
20         val promise = Promise<String> { _, reject ->
21             promiseReject = reject
22         }
23         val deferred = promise.asDeferred()
24         // reject after converting to deferred to avoid "Unhandled promise rejection" warnings
25         promiseReject(TestException("Rejected"))
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: (String) -> Unit
58         val toAwait = Promise<String> { resolve, _ -> r = resolve }
59         val job = launch(start = CoroutineStart.UNDISPATCHED) {
60             toAwait.await() // suspends
61         }
62         job.cancel() // cancel the job
63         r("fail") // 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()
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         }
85     }
86 }
87