blob: 1f1fc6ec2794d53d55e76b4cf7aac88a4f1a2d0a [file] [log] [blame]
package com.airbnb.lottie.compose
import androidx.compose.runtime.mutableStateOf
import com.airbnb.lottie.LottieComposition
import com.airbnb.lottie.LottieCompositionFactory
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.runBlockingTest
import kotlinx.coroutines.withContext
import org.junit.Assert.assertEquals
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
@RunWith(RobolectricTestRunner::class)
@ExperimentalCoroutinesApi
class AnimateLottieCompositionSuspendKtTest {
private lateinit var composition: LottieComposition
@Before
fun setup() {
composition = LottieCompositionFactory.fromJsonStringSync(CompositionFixtures.Rect, null).value!!
}
@Test
fun testFrames() = runBlockingTest {
val progress = mutableStateOf(0f)
withContext(TestMonotonicFrameClock(this)) {
val job = launch {
animateLottieComposition(composition, progress)
}
assertEquals(0f, progress.value)
advanceTimeBy(32)
assertEquals(0.027f, progress.value, 0.001f)
advanceTimeBy(64)
assertEquals(0.134f, progress.value, 0.001f)
advanceTimeBy(128)
assertEquals(0.347f, progress.value, 0.001f)
advanceTimeBy(256)
assertEquals(0.775f, progress.value, 0.001f)
advanceTimeBy(127)
assertEquals(0.962f, progress.value, 0.001f)
advanceTimeBy(1)
assertEquals(0.988f, progress.value, 0.001f)
advanceTimeBy(15)
assertEquals(0.988f, progress.value, 0.001f)
advanceTimeBy(1)
assertEquals(1f, progress.value, 0.001f)
advanceTimeBy(1000)
assertEquals(1f, progress.value, 0.001f)
job.cancel()
}
}
@Test
fun testFrames2x() = runBlockingTest {
val progress = mutableStateOf(0f)
withContext(TestMonotonicFrameClock(this)) {
val job = launch {
animateLottieComposition(
composition,
progress,
speed = 2f,
)
}
assertEquals(0f, progress.value)
advanceTimeBy(32)
assertEquals(0.053f, progress.value, 0.001f)
advanceTimeBy(64)
assertEquals(0.267f, progress.value, 0.001f)
advanceTimeBy(128)
assertEquals(0.694f, progress.value, 0.001f)
advanceTimeBy(95)
assertEquals(0.961f, progress.value, 0.001f)
advanceTimeBy(1)
assertEquals(1f, progress.value, 0.001f)
advanceTimeBy(1000)
assertEquals(1f, progress.value, 0.001f)
job.cancel()
}
}
@Test
fun testFramesReverse() = runBlockingTest {
val progress = mutableStateOf(0f)
withContext(TestMonotonicFrameClock(this)) {
val job = launch {
animateLottieComposition(
composition,
progress,
speed = -1f,
)
}
assertEquals(1f - 0f, progress.value)
advanceTimeBy(32)
assertEquals(1f - 0.027f, progress.value, 0.001f)
advanceTimeBy(64)
assertEquals(1f - 0.134f, progress.value, 0.001f)
advanceTimeBy(128)
assertEquals(1f - 0.347f, progress.value, 0.001f)
advanceTimeBy(256)
assertEquals(1f - 0.775f, progress.value, 0.001f)
advanceTimeBy(127)
assertEquals(1f - 0.962f, progress.value, 0.001f)
advanceTimeBy(1)
assertEquals(1f - 0.988f, progress.value, 0.001f)
advanceTimeBy(15)
assertEquals(1f - 0.988f, progress.value, 0.001f)
advanceTimeBy(1)
assertEquals(1f - 1f, progress.value, 0.001f)
advanceTimeBy(1000)
assertEquals(1f - 1f, progress.value, 0.001f)
job.cancel()
}
}
@Test
fun testFramesWithClipSpec() = runBlockingTest {
val progress = mutableStateOf(0f)
withContext(TestMonotonicFrameClock(this)) {
val job = launch {
animateLottieComposition(
composition,
progress,
clipSpec = LottieClipSpec.MinAndMaxProgress(0.25f, 0.5f)
)
}
assertEquals(0.25f, progress.value)
advanceTimeBy(32)
assertEquals(0.277f, progress.value, 0.001f)
advanceTimeBy(64)
assertEquals(0.384f, progress.value, 0.001f)
advanceTimeBy(128)
assertEquals(0.5f, progress.value, 0.001f)
job.cancel()
}
}
}