Skip to content

Commit 7caa6bf

Browse files
authored
Adopt ComposeUiTest API changes (#2066)
The corresponding CL - https://android-review.googlesource.com/c/platform/frameworks/support/+/3509670 Note: API changes here only in the experimental API. Fixes https://youtrack.jetbrains.com/issue/CMP-7994/ ## Testing Added a copy of relevant tests from AOSP. ## Release Notes ### Features - Multiple Platforms - Adopted a change in ComposeUiTest API. The `block` in `runComposeUiTest` is suspend now. It allows to call `awaitIdle` and other suspend functions. It ensures a correct execution of a test on all platforms. See the web specifics in kotlinx.coroutines.test.runTest [documentation](https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-test/kotlinx.coroutines.test/run-test.html).
1 parent 3d04288 commit 7caa6bf

File tree

17 files changed

+631
-76
lines changed

17 files changed

+631
-76
lines changed

compose/ui/ui-test-junit4/src/desktopTest/kotlin/androidx/compose/ui/test/ComposeUiTestTest.kt

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,16 @@ import androidx.compose.ui.MotionDurationScale
2626
import androidx.compose.ui.test.junit4.createComposeRule
2727
import com.google.common.truth.Truth.assertThat
2828
import kotlin.coroutines.CoroutineContext
29+
import kotlin.test.assertEquals
30+
import kotlin.test.assertFailsWith
31+
import kotlin.test.assertTrue
2932
import kotlin.test.fail
33+
import kotlin.time.Duration.Companion.milliseconds
3034
import kotlinx.coroutines.CoroutineScope
35+
import kotlinx.coroutines.Dispatchers
36+
import kotlinx.coroutines.delay
37+
import kotlinx.coroutines.withContext
38+
import org.junit.ComparisonFailure
3139
import org.junit.Ignore
3240
import org.junit.Rule
3341
import org.junit.Test
@@ -158,6 +166,34 @@ class ComposeUiTestTest {
158166
}
159167
}
160168

169+
@Test
170+
fun testTimeout() {
171+
val timeout = 100.milliseconds
172+
val error = assertFailsWith<AssertionError> {
173+
runComposeUiTest(testTimeout = timeout) {
174+
// switch a dispatcher to not skip the delay
175+
withContext(Dispatchers.Default) { delay(1000) }
176+
}
177+
}
178+
// Here our assert relies on the implementation details of kotlinx.coroutines.test library,
179+
// It's purpose is to be sure that the AssertionError is of particular type
180+
assertEquals(
181+
"kotlinx.coroutines.test.UncompletedCoroutinesError",
182+
error::class.qualifiedName
183+
)
184+
}
185+
186+
@Test
187+
fun testFailedAssertion() {
188+
val error = assertFailsWith<ComparisonFailure> {
189+
runComposeUiTest {
190+
assertThat(1.0).isEqualTo(2.0)
191+
}
192+
}
193+
assertEquals("1.0", error.actual)
194+
assertEquals("2.0", error.expected)
195+
}
196+
161197
private class TestCoroutineContextElement : CoroutineContext.Element {
162198
override val key: CoroutineContext.Key<*> get() = Key
163199

compose/ui/ui-test/api/desktop/ui-test.api

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -113,27 +113,24 @@ public final class androidx/compose/ui/test/ComposeUiTestKt {
113113
}
114114

115115
public final class androidx/compose/ui/test/ComposeUiTest_desktopKt {
116-
public static final fun runDesktopComposeUiTest (IILkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;)V
117-
public static synthetic fun runDesktopComposeUiTest$default (IILkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
116+
public static final fun runDesktopComposeUiTest-myKFqkg (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V
117+
public static synthetic fun runDesktopComposeUiTest-myKFqkg$default (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
118118
}
119119

120120
public final class androidx/compose/ui/test/ComposeUiTest_skikoKt {
121121
public static final fun defaultTestDispatcher ()Lkotlinx/coroutines/test/TestDispatcher;
122-
public static final fun runComposeUiTest (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;)V
123-
public static synthetic fun runComposeUiTest$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
124-
public static final synthetic fun runComposeUiTest-exY8QGI (Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V
122+
public static final fun runComposeUiTest-exY8QGI (Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V
125123
public static synthetic fun runComposeUiTest-exY8QGI$default (Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
126-
public static final fun runInternalSkikoComposeUiTest (IILandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;Lkotlin/jvm/functions/Function1;)V
127-
public static synthetic fun runInternalSkikoComposeUiTest$default (IILandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
128-
public static final fun runSkikoComposeUiTest-Cqks5Fs (JLandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;)V
129-
public static synthetic fun runSkikoComposeUiTest-Cqks5Fs$default (JLandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
124+
public static final fun runInternalSkikoComposeUiTest-Tu6dINM (IILandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;Lkotlin/jvm/functions/Function2;)V
125+
public static synthetic fun runInternalSkikoComposeUiTest-Tu6dINM$default (IILandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
126+
public static final fun runSkikoComposeUiTest-uV_hrag (JLandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;)V
127+
public static synthetic fun runSkikoComposeUiTest-uV_hrag$default (JLandroidx/compose/ui/unit/Density;Lkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLkotlin/jvm/functions/Function2;ILjava/lang/Object;)V
130128
}
131129

132130
public final class androidx/compose/ui/test/DesktopComposeUiTest : androidx/compose/ui/test/SkikoComposeUiTest {
133131
public static final field $stable I
134-
public fun <init> ()V
135-
public fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;)V
136-
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
132+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
133+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
137134
public final fun registerIdlingResource (Landroidx/compose/ui/test/IdlingResource;)V
138135
public final fun unregisterIdlingResource (Landroidx/compose/ui/test/IdlingResource;)V
139136
}
@@ -654,8 +651,10 @@ public class androidx/compose/ui/test/SkikoComposeUiTest : androidx/compose/ui/t
654651
public field scene Landroidx/compose/ui/scene/ComposeScene;
655652
public fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;)V
656653
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
657-
public fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;)V
658-
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Landroidx/compose/ui/unit/Density;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
654+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
655+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
656+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;Landroidx/compose/ui/platform/PlatformContext$SemanticsOwnerListener;Lkotlinx/coroutines/test/TestDispatcher;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
657+
public synthetic fun <init> (IILkotlin/coroutines/CoroutineContext;Lkotlin/coroutines/CoroutineContext;JLandroidx/compose/ui/unit/Density;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
659658
protected fun areAllResourcesIdle ()Z
660659
public fun awaitIdle (Lkotlin/coroutines/Continuation;)Ljava/lang/Object;
661660
public final fun captureToImage ()Landroidx/compose/ui/graphics/ImageBitmap;
@@ -668,7 +667,7 @@ public class androidx/compose/ui/test/SkikoComposeUiTest : androidx/compose/ui/t
668667
public fun onNode (Landroidx/compose/ui/test/SemanticsMatcher;Z)Landroidx/compose/ui/test/SemanticsNodeInteraction;
669668
public fun runOnIdle (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
670669
public fun runOnUiThread (Lkotlin/jvm/functions/Function0;)Ljava/lang/Object;
671-
public final fun runTest (Lkotlin/jvm/functions/Function1;)Ljava/lang/Object;
670+
public final fun runTest (Lkotlin/jvm/functions/Function2;)V
672671
public fun setContent (Lkotlin/jvm/functions/Function2;)V
673672
public final fun setScene (Landroidx/compose/ui/scene/ComposeScene;)V
674673
public fun waitForIdle ()V

0 commit comments

Comments
 (0)