@@ -70,7 +70,7 @@ class TestCoroutineSchedulerTest {
70
70
71
71
/* * Tests the basic functionality of [TestCoroutineScheduler.advanceTimeBy]. */
72
72
@Test
73
- fun testAdvanceTimeBy () {
73
+ fun testAdvanceTimeBy () = assertRunsFast {
74
74
val scheduler = TestCoroutineScheduler ()
75
75
val scope = TestCoroutineScope (scheduler)
76
76
var stage = 1
@@ -96,26 +96,89 @@ class TestCoroutineSchedulerTest {
96
96
scope.cleanupTestCoroutines()
97
97
}
98
98
99
+ /* * Tests the basic functionality of [TestCoroutineScheduler.runCurrent]. */
100
+ @Test
101
+ fun testRunCurrent () = runBlockingTest {
102
+ var stage = 0
103
+ launch {
104
+ delay(1 )
105
+ ++ stage
106
+ delay(1 )
107
+ stage + = 10
108
+ }
109
+ launch {
110
+ delay(1 )
111
+ ++ stage
112
+ delay(1 )
113
+ stage + = 10
114
+ }
115
+ testScheduler.advanceTimeBy(1 )
116
+ assertEquals(0 , stage)
117
+ runCurrent()
118
+ assertEquals(2 , stage)
119
+ testScheduler.advanceTimeBy(1 )
120
+ assertEquals(2 , stage)
121
+ runCurrent()
122
+ assertEquals(22 , stage)
123
+ }
124
+
99
125
/* * Tests that [TestCoroutineScheduler.runCurrent] will not run new tasks after the current time has advanced. */
100
126
@Test
101
- fun testRunCurrentNotDrainingQueue () {
127
+ fun testRunCurrentNotDrainingQueue () = assertRunsFast {
102
128
val scheduler = TestCoroutineScheduler ()
103
129
val scope = TestCoroutineScope (scheduler)
104
130
var stage = 1
105
131
scope.launch {
106
- delay(1 )
132
+ delay(SLOW )
107
133
launch {
108
- delay(1 )
134
+ delay(SLOW )
109
135
stage = 3
110
136
}
111
- scheduler.advanceTimeBy(1 )
137
+ scheduler.advanceTimeBy(SLOW )
112
138
stage = 2
113
139
}
114
- scheduler.advanceTimeBy(1 )
140
+ scheduler.advanceTimeBy(SLOW )
115
141
assertEquals(1 , stage)
116
142
scheduler.runCurrent()
117
143
assertEquals(2 , stage)
118
144
scheduler.runCurrent()
119
145
assertEquals(3 , stage)
120
146
}
147
+
148
+ /* * Tests that [TestCoroutineScheduler.advanceUntilIdle] doesn't hang when itself running in a scheduler task. */
149
+ @Test
150
+ fun testNestedAdvanceUntilIdle () = assertRunsFast {
151
+ val scheduler = TestCoroutineScheduler ()
152
+ val scope = TestCoroutineScope (scheduler)
153
+ var executed = false
154
+ scope.launch {
155
+ launch {
156
+ delay(SLOW )
157
+ executed = true
158
+ }
159
+ scheduler.advanceUntilIdle()
160
+ }
161
+ scheduler.advanceUntilIdle()
162
+ assertTrue(executed)
163
+ }
164
+
165
+ /* * Tests [yield] scheduling tasks for future execution and not executing immediately. */
166
+ @Test
167
+ fun testYield () {
168
+ val scope = TestCoroutineScope ()
169
+ var stage = 0
170
+ scope.launch {
171
+ yield ()
172
+ assertEquals(1 , stage)
173
+ stage = 2
174
+ }
175
+ scope.launch {
176
+ yield ()
177
+ assertEquals(2 , stage)
178
+ stage = 3
179
+ }
180
+ assertEquals(0 , stage)
181
+ stage = 1
182
+ scope.runCurrent()
183
+ }
121
184
}
0 commit comments