TestMonotonicFrameClock

Class

Jvm
@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

coroutineScopeThe CoroutineScope used to simulate the main thread and schedule frames on. It must contain a TestCoroutineScheduler and a ContinuationInterceptor.
frameDelayNanosThe number of nanoseconds to delay between executing frames.
onPerformTraversalsCalled 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

Jvm
val hasAwaiters: Boolean

Returns whether there are any awaiters on this clock.

Jvm
@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.