---
title: "TestMonotonicFrameClock"
description: "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]."
type: "class"
---

<div class='type'>Class</div>


<a id='references'></a>

<div class='sourceset sourceset-jvmAndAndroid'>JvmAndAndroid</div>


```kotlin
@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

<div class='sourceset sourceset-jvmAndAndroid'>JvmAndAndroid</div>


```kotlin
val hasAwaiters: Boolean
```


Returns whether there are any awaiters on this clock.



<div class='sourceset sourceset-jvmAndAndroid'>JvmAndAndroid</div>


```kotlin
@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.




