<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