-
Notifications
You must be signed in to change notification settings - Fork 1
/
PauseDispatcher.kt
83 lines (68 loc) · 2.03 KB
/
PauseDispatcher.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
import coroutines.AtomicInt
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.DelayController
import kotlinx.coroutines.test.TestCoroutineDispatcher
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.yield
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test
/**
* The [DelayController] interface implemented by the [TestCoroutineDispatcher]
* also provides for pausing and resuming the dispatcher. Effectively this switches
* the eager execution into a lazy one under your control.
*/
class PauseDispatcher {
@Test
fun `paused dispatcher does not execute eager`() = runBlockingTest {
var state by AtomicInt(0)
pauseDispatcher()
launch {
state = 1
yield()
state = 2
delay(1000)
state = 3
}
// not started yet
assertEquals(0, state)
// runCurrent() advances all actions until current (virtual) time.
runCurrent()
assertEquals(2, state)
advanceUntilIdle()
assertEquals(3, state)
}
@Test
fun `resumeDispatcher() advances until idle`() = runBlockingTest {
var state by AtomicInt(0)
pauseDispatcher()
launch {
state = 1
yield()
state = 2
delay(1000)
state = 3
}
// not started yet
assertEquals(0, state)
resumeDispatcher()
// advance until idle after resumeDispatcher()
assertEquals(3, state)
}
@Test
fun `pauseDispatcher {} resumes after executing block`() = runBlockingTest {
var state by AtomicInt(0)
pauseDispatcher {
launch {
state = 1
yield()
state = 2
delay(1000)
state = 3
}
assertEquals(0, state)
}
// advance until idle after pauseDispatcher() block
assertEquals(3, state)
}
}