-
Notifications
You must be signed in to change notification settings - Fork 1.9k
/
Copy pathPromiseTest.kt
89 lines (80 loc) · 2.61 KB
/
PromiseTest.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* Copyright 2016-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
*/
package kotlinx.coroutines
import kotlin.js.*
import kotlin.test.*
class PromiseTest : TestBase() {
@Test
fun testPromiseResolvedAsDeferred() = GlobalScope.promise {
val promise = Promise<String> { resolve, _ ->
resolve("OK")
}
val deferred = promise.asDeferred()
assertEquals("OK", deferred.await())
}
@Test
fun testPromiseRejectedAsDeferred() = GlobalScope.promise {
lateinit var promiseReject: (Throwable) -> Unit
val promise = Promise<String> { _, reject ->
promiseReject = reject
}
val deferred = promise.asDeferred()
// reject after converting to deferred to avoid "Unhandled promise rejection" warnings
promiseReject(TestException("Rejected"))
try {
deferred.await()
expectUnreached()
} catch (e: Throwable) {
assertTrue(e is TestException)
assertEquals("Rejected", e.message)
}
}
@Test
fun testCompletedDeferredAsPromise() = GlobalScope.promise {
val deferred = async(start = CoroutineStart.UNDISPATCHED) {
// completed right away
"OK"
}
val promise = deferred.asPromise()
assertEquals("OK", promise.await())
}
@Test
fun testWaitForDeferredAsPromise() = GlobalScope.promise {
val deferred = async {
// will complete later
"OK"
}
val promise = deferred.asPromise()
assertEquals("OK", promise.await()) // await yields main thread to deferred coroutine
}
@Test
fun testCancellableAwaitPromise() = GlobalScope.promise {
lateinit var r: (String) -> Unit
val toAwait = Promise<String> { resolve, _ -> r = resolve }
val job = launch(start = CoroutineStart.UNDISPATCHED) {
toAwait.await() // suspends
}
job.cancel() // cancel the job
r("fail") // too late, the waiting job was already cancelled
}
@Test
fun testAsPromiseAsDeferred() = GlobalScope.promise {
val deferred = async { "OK" }
val promise = deferred.asPromise()
val d2 = promise.asDeferred()
assertSame(d2, deferred)
assertEquals("OK", d2.await())
}
@Test
fun testLeverageTestResult(): TestResult {
// Cannot use expect(..) here
var seq = 0
val result = runTest {
++seq
}
return result.then {
if (seq != 1) error("Unexpected result: $seq")
}
}
}