Christophe Dongieux
03/02/2023, 8:18 PM@Test
fun `Foobar is foo`() = runTest {
val job = launch {
println("Coroutine 1: Going to sleep for 3000. currentTime = $currentTime")
delay(3000)
println("Coroutine 1: Delay is over. currentTime = $currentTime")
}
launch {
println("Coroutine 2: Going to sleep for 1000. currentTime = $currentTime")
delay(1000)
println("Coroutine 2: Delay is over, cancelling other Coroutine. currentTime = $currentTime")
job.cancel()
}
advanceTimeBy(500)
println("advance 500: currentTime 1 = $currentTime")
advanceTimeBy(500)
println("advance 500: currentTime 2 = $currentTime")
advanceUntilIdle()
println("advanceUntilIdle: currentTime 3 = $currentTime")
assertEquals(1000, currentTime)
}
The output is:
Coroutine 1: Going to sleep for 3000. currentTime = 0
Coroutine 2: Going to sleep for 1000. currentTime = 0
advance 500: currentTime 1 = 500
advance 500: currentTime 2 = 1000
Coroutine 2: Delay is over, cancelling other Coroutine. currentTime = 1000
advanceUntilIdle: currentTime 3 = 3000
expected:<1000> but was:<3000>
Expected :1000
Actual :3000
As Coroutine 1 is canceled I don’t understand why currentTime 3
is 3000 instead of 1000.mkrussel
03/02/2023, 8:29 PMadvanceUntilIdle
will advance the clock until all the current delays
are completed, including the one for 3000
in the first launch.Christophe Dongieux
03/02/2023, 8:31 PMmkrussel
03/02/2023, 8:33 PMdelay
, but instead I need to do runCurrent
(not sure the name) after I do the advanceTime
call.Christophe Dongieux
03/02/2023, 8:40 PMdelay(1000)
.
And I can see Coroutine 1 is cancelled if I put a try/catch block around its delay(3000)
.mkrussel
03/02/2023, 8:41 PMadvanceUntilIdle
function where it is still waiting for canceled delays.Christophe Dongieux
03/02/2023, 8:48 PM