TestMonotonicFrameClock
@ExperimentalCoroutinesApi
@ExperimentalTestApi
class TestMonotonicFrameClock(
private val coroutineScope: CoroutineScope,
@get:Suppress("MethodNameUnits") // Nanos for high-precision animation clocks
val frameDelayNanos: Long = DefaultFrameDelay,
private val onPerformTraversals: (Long) -> Unit = {},
) : MonotonicFrameClock
A MonotonicFrameClock
with a time source controlled by a kotlinx-coroutines-test
TestCoroutineScheduler
. This frame clock may be used to consistently drive time under
controlled tests.
Calls to withFrameNanos
will schedule an upcoming frame frameDelayNanos
nanoseconds in the
future by launching into coroutineScope
if such a frame has not yet been scheduled. The current
frame time for withFrameNanos
is provided by delayController
. It is strongly suggested that
coroutineScope
contain the test dispatcher controlled by delayController
.
Parameters
coroutineScope | The CoroutineScope used to simulate the main thread and schedule frames on. It must contain a TestCoroutineScheduler and a ContinuationInterceptor . |
frameDelayNanos | The number of nanoseconds to delay between executing frames. |
onPerformTraversals | Called with the frame time of the frame that was just executed, after running all withFrameNanos callbacks, but before resuming their callers' continuations. Any continuations resumed while running frame callbacks or onPerformTraversals will not be dispatched until after onPerformTraversals finishes. If onPerformTraversals throws, all withFrameNanos callers will be cancelled. |
Properties
val hasAwaiters: Boolean
Returns whether there are any awaiters on this clock.
@ExperimentalTestApi
val continuationInterceptor: ContinuationInterceptor
A CoroutineDispatcher
that will defer continuation resumptions requested within
withFrameNanos
calls to until after the frame callbacks have finished running. Resumptions
will then be dispatched before resuming the continuations from the withFrameNanos
calls
themselves.