From 8c724096fd83ea405bbd7161b0a745c7f3c23350 Mon Sep 17 00:00:00 2001 From: Alexander Maryanovsky Date: Fri, 18 Aug 2023 13:55:04 +0300 Subject: [PATCH] Add a unit test to the imageviewer example. (#3527) * Add a unit test to the imageviewer example. * Fix android build of imageviewer --- .../imageviewer/androidApp/build.gradle.kts | 6 +-- examples/imageviewer/gradle.properties | 2 +- examples/imageviewer/shared/build.gradle.kts | 13 +++++-- .../view/ScrollableColumn.android.kt | 3 +- .../example/imageviewer/view/GalleryScreen.kt | 11 ++++-- .../view/ScrollableColumn.common.kt | 5 ++- .../view/ScrollableColumn.desktop.kt | 11 ++---- .../src/desktopTest/kotlin/ImageViewerTest.kt | 39 +++++++++++++++++++ .../imageviewer/view/ScrollableColumn.ios.kt | 3 +- 9 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 examples/imageviewer/shared/src/desktopTest/kotlin/ImageViewerTest.kt diff --git a/examples/imageviewer/androidApp/build.gradle.kts b/examples/imageviewer/androidApp/build.gradle.kts index 0ada471c5c..198282a13d 100755 --- a/examples/imageviewer/androidApp/build.gradle.kts +++ b/examples/imageviewer/androidApp/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } kotlin { - android() + androidTarget() sourceSets { val androidMain by getting { dependencies { @@ -17,11 +17,11 @@ kotlin { } android { - compileSdk = 33 + compileSdk = 34 defaultConfig { applicationId = "org.jetbrains.Imageviewer" minSdk = 26 - targetSdk = 33 + targetSdk = 34 versionCode = 1 versionName = "1.0" } diff --git a/examples/imageviewer/gradle.properties b/examples/imageviewer/gradle.properties index efa38e2e33..cf36d1b33a 100644 --- a/examples/imageviewer/gradle.properties +++ b/examples/imageviewer/gradle.properties @@ -12,4 +12,4 @@ kotlin.native.useEmbeddableCompilerJar=true kotlin.native.binary.memoryModel=experimental kotlin.version=1.9.0 agp.version=7.1.3 -compose.version=1.5.0-beta02 +compose.version=1.5.0-rc01 diff --git a/examples/imageviewer/shared/build.gradle.kts b/examples/imageviewer/shared/build.gradle.kts index 5a3e685b83..5b52a765af 100755 --- a/examples/imageviewer/shared/build.gradle.kts +++ b/examples/imageviewer/shared/build.gradle.kts @@ -12,7 +12,7 @@ plugins { version = "1.0-SNAPSHOT" kotlin { - android() + androidTarget() jvm("desktop") ios() iosSimulatorArm64() @@ -71,18 +71,25 @@ kotlin { implementation(project(":mapview-desktop")) } } + + val desktopTest by getting { + dependencies { + implementation(compose.desktop.currentOs) + implementation(compose.desktop.uiTestJUnit4) + } + } } } android { - compileSdk = 33 + compileSdk = 34 sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml") sourceSets["main"].res.srcDirs("src/androidMain/res") sourceSets["main"].resources.srcDirs("src/commonMain/resources") defaultConfig { minSdk = 26 - targetSdk = 33 + targetSdk = 34 } compileOptions { sourceCompatibility = JavaVersion.VERSION_11 diff --git a/examples/imageviewer/shared/src/androidMain/kotlin/example/imageviewer/view/ScrollableColumn.android.kt b/examples/imageviewer/shared/src/androidMain/kotlin/example/imageviewer/view/ScrollableColumn.android.kt index 7ef544a39d..c3f65d7ea5 100644 --- a/examples/imageviewer/shared/src/androidMain/kotlin/example/imageviewer/view/ScrollableColumn.android.kt +++ b/examples/imageviewer/shared/src/androidMain/kotlin/example/imageviewer/view/ScrollableColumn.android.kt @@ -1,8 +1,9 @@ package example.imageviewer.view +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @Composable -actual fun ScrollableColumn(modifier: Modifier, content: @Composable () -> Unit) = +actual fun ScrollableColumn(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) = TouchScrollableColumn(modifier, content) diff --git a/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/GalleryScreen.kt b/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/GalleryScreen.kt index 07302cd279..ff105f00bd 100755 --- a/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/GalleryScreen.kt +++ b/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/GalleryScreen.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import example.imageviewer.* import example.imageviewer.icon.IconMenu @@ -143,7 +144,10 @@ fun GalleryScreen( TopLayout( alignLeftContent = {}, alignRightContent = { - CircularButton(imageVector = IconMenu) { + CircularButton( + imageVector = IconMenu, + modifier = Modifier.testTag("toggleGalleryStyleButton") + ) { galleryStyle = when (galleryStyle) { GalleryStyle.SQUARES -> GalleryStyle.LIST GalleryStyle.LIST -> GalleryStyle.SQUARES @@ -159,7 +163,6 @@ fun GalleryScreen( pagerState = pagerState, onSelect = { selectPicture(it) }, ) - GalleryStyle.LIST -> ListGalleryView( pictures = pictures, onSelect = { selectPicture(it) }, @@ -183,7 +186,7 @@ private fun SquaresGalleryView( onSelect: (index: Int) -> Unit, ) { LazyVerticalGrid( - modifier = Modifier.padding(top = 4.dp), + modifier = Modifier.padding(top = 4.dp).testTag("squaresGalleryView"), columns = GridCells.Adaptive(minSize = 130.dp), verticalArrangement = Arrangement.spacedBy(1.dp), horizontalArrangement = Arrangement.spacedBy(1.dp) @@ -253,7 +256,7 @@ private fun ListGalleryView( ) { val notification = LocalNotification.current ScrollableColumn( - modifier = Modifier.fillMaxSize() + modifier = Modifier.fillMaxSize().testTag("listGalleryView") ) { Spacer(modifier = Modifier.height(10.dp)) for (p in pictures.withIndex()) { diff --git a/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/ScrollableColumn.common.kt b/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/ScrollableColumn.common.kt index 58efdf94f5..c8e6427dda 100644 --- a/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/ScrollableColumn.common.kt +++ b/examples/imageviewer/shared/src/commonMain/kotlin/example/imageviewer/view/ScrollableColumn.common.kt @@ -1,16 +1,17 @@ package example.imageviewer.view import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @Composable -expect fun ScrollableColumn(modifier: Modifier, content: @Composable () -> Unit) +expect fun ScrollableColumn(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) @Composable -fun TouchScrollableColumn(modifier: Modifier, content: @Composable () -> Unit) { +fun TouchScrollableColumn(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) { val scrollState = rememberScrollState() Column(modifier.verticalScroll(scrollState)) { content() diff --git a/examples/imageviewer/shared/src/desktopMain/kotlin/example/imageviewer/view/ScrollableColumn.desktop.kt b/examples/imageviewer/shared/src/desktopMain/kotlin/example/imageviewer/view/ScrollableColumn.desktop.kt index e064c8fea7..b7b648bbd0 100644 --- a/examples/imageviewer/shared/src/desktopMain/kotlin/example/imageviewer/view/ScrollableColumn.desktop.kt +++ b/examples/imageviewer/shared/src/desktopMain/kotlin/example/imageviewer/view/ScrollableColumn.desktop.kt @@ -1,10 +1,7 @@ package example.imageviewer.view import androidx.compose.foundation.VerticalScrollbar -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.fillMaxHeight -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollbarAdapter import androidx.compose.foundation.verticalScroll @@ -14,12 +11,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @Composable -actual fun ScrollableColumn(modifier: Modifier, content: @Composable () -> Unit) { +actual fun ScrollableColumn(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) { val scrollState = rememberScrollState() - Modifier.verticalScroll(scrollState) - Box(modifier) { - Column(modifier.verticalScroll(scrollState)) { + Column(Modifier.verticalScroll(scrollState)) { content() } VerticalScrollbar( diff --git a/examples/imageviewer/shared/src/desktopTest/kotlin/ImageViewerTest.kt b/examples/imageviewer/shared/src/desktopTest/kotlin/ImageViewerTest.kt new file mode 100644 index 0000000000..e0ebfc53b4 --- /dev/null +++ b/examples/imageviewer/shared/src/desktopTest/kotlin/ImageViewerTest.kt @@ -0,0 +1,39 @@ +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import example.imageviewer.* +import example.imageviewer.filter.PlatformContext +import example.imageviewer.model.PictureData +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import org.junit.Rule +import org.junit.Test + +class ImageViewerTest { + @get:Rule + val rule = createComposeRule() + + private val dependencies = object : Dependencies() { + override val notification: Notification = object : PopupNotification(localization) { + override fun showPopUpMessage(text: String) { + } + } + override val imageStorage: DesktopImageStorage = DesktopImageStorage(pictures, CoroutineScope(Dispatchers.Main)) + override val sharePicture: SharePicture = object : SharePicture { + override fun share(context: PlatformContext, picture: PictureData) { } + } + } + + @Test + fun testToggleGalleryStyleButton() { + rule.setContent { + ImageViewerCommon(dependencies) + } + + rule.onNodeWithTag("squaresGalleryView").assertExists() + rule.onNodeWithTag("listGalleryView").assertDoesNotExist() + rule.onNodeWithTag("toggleGalleryStyleButton").performClick() + rule.onNodeWithTag("squaresGalleryView").assertDoesNotExist() + rule.onNodeWithTag("listGalleryView").assertExists() + } +} \ No newline at end of file diff --git a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/ScrollableColumn.ios.kt b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/ScrollableColumn.ios.kt index 7ef544a39d..c3f65d7ea5 100644 --- a/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/ScrollableColumn.ios.kt +++ b/examples/imageviewer/shared/src/iosMain/kotlin/example/imageviewer/view/ScrollableColumn.ios.kt @@ -1,8 +1,9 @@ package example.imageviewer.view +import androidx.compose.foundation.layout.ColumnScope import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier @Composable -actual fun ScrollableColumn(modifier: Modifier, content: @Composable () -> Unit) = +actual fun ScrollableColumn(modifier: Modifier, content: @Composable ColumnScope.() -> Unit) = TouchScrollableColumn(modifier, content)