From 613428440fe95bc4a3c65f4d467c6650e664b09a Mon Sep 17 00:00:00 2001 From: Konstantin Date: Wed, 17 Apr 2024 14:35:35 +0200 Subject: [PATCH] [gradle] Add integration test for compose resources with cocoapods (#4631) --- .../tests/integration/GradlePluginTest.kt | 73 -------------- .../test/tests/integration/ResourcesTest.kt | 97 +++++++++++++++++++ .../compose/test/utils/assertUtils.kt | 4 + .../misc/iosResources/build.gradle | 48 --------- .../misc/iosResources/build.gradle.kts | 31 ++++++ .../misc/iosResources/gradle.properties | 1 + .../misc/iosResources/settings.gradle | 26 ----- .../misc/iosResources/settings.gradle.kts | 23 +++++ .../drawable}/compose-multiplatform.xml | 0 .../iosResources/src/commonMain/kotlin/App.kt | 3 +- .../composeResources/drawable/icon.xml | 36 +++++++ 11 files changed, 194 insertions(+), 148 deletions(-) delete mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle.kts delete mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle.kts rename gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/{resources => composeResources/drawable}/compose-multiplatform.xml (100%) create mode 100644 gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/iosMain/composeResources/drawable/icon.xml diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt index e0d6c12e2f..959135780e 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/GradlePluginTest.kt @@ -29,79 +29,6 @@ import org.junit.jupiter.params.provider.MethodSource import java.io.File class GradlePluginTest : GradlePluginTestBase() { - private data class IosTestEnv( - val targetBuildDir: File, - val appDir: File, - val envVars: Map - ) - - enum class IosPlatform(val id: String) { - SIMULATOR("iphonesimulator"), IOS("iphoneos") - } - enum class IosArch(val id: String) { - X64("x86_64"), ARM64("arm64") - } - - enum class IosBuildConfiguration(val id: String) { - DEBUG("Debug"), RELEASE("Release") - } - - private fun iosTestEnv( - platform: IosPlatform = IosPlatform.SIMULATOR, - arch: IosArch = IosArch.X64, - configuration: IosBuildConfiguration = IosBuildConfiguration.DEBUG - ): IosTestEnv { - val targetBuildDir = testWorkDir.resolve("build/ios/${configuration.id}-${platform.id}").apply { mkdirs() } - val appDir = targetBuildDir.resolve("App.app").apply { mkdirs() } - val envVars = mapOf( - "PLATFORM_NAME" to platform.id, - "ARCHS" to arch.id, - "BUILT_PRODUCTS_DIR" to targetBuildDir.canonicalPath, - "CONTENTS_FOLDER_PATH" to appDir.name, - ) - return IosTestEnv( - targetBuildDir = targetBuildDir, - appDir = appDir, - envVars = envVars - ) - } - - @Test - fun iosResources() { - Assumptions.assumeTrue(currentOS == OS.MacOS) - val iosTestEnv = iosTestEnv() - val testEnv = defaultTestEnvironment.copy( - additionalEnvVars = iosTestEnv.envVars - ) - - with(TestProject(TestProjects.iosResources, testEnv)) { - gradle(":embedAndSignAppleFrameworkForXcode", "--dry-run").checks { - // This test is not intended to actually run embedAndSignAppleFrameworkForXcode. - // Instead, it should check that embedAndSign depends on syncComposeResources using dry run - check.taskSkipped(":syncComposeResourcesForIos") - check.taskSkipped(":embedAndSignAppleFrameworkForXcode") - } - gradle(":syncComposeResourcesForIos").checks { - check.taskSuccessful(":syncComposeResourcesForIos") - iosTestEnv.appDir.resolve("compose-resources/compose-multiplatform.xml").checkExists() - } - } - } - - @Test - fun iosTestResources() { - Assumptions.assumeTrue(currentOS == OS.MacOS) - with(testProject(TestProjects.iosResources)) { - gradle(":linkDebugTestIosX64", "--dry-run").checks { - check.taskSkipped(":copyTestComposeResourcesForIosX64") - check.taskSkipped(":linkDebugTestIosX64") - } - gradle(":copyTestComposeResourcesForIosX64").checks { - check.taskSuccessful(":copyTestComposeResourcesForIosX64") - file("build/bin/iosX64/debugTest/compose-resources/compose-multiplatform.xml").checkExists() - } - } - } @Test fun nativeCacheKind() { diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt index 9253faca18..0628ff6ea3 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt @@ -4,6 +4,7 @@ import org.gradle.util.GradleVersion import org.jetbrains.compose.internal.utils.* import org.jetbrains.compose.resources.XmlValuesConverterTask import org.jetbrains.compose.test.utils.* +import org.junit.jupiter.api.Assumptions import org.junit.jupiter.api.Test import java.io.File import java.util.zip.ZipFile @@ -532,4 +533,100 @@ class ResourcesTest : GradlePluginTestBase() { check.logContains("Generation Res class is disabled") } } + + @Test + fun iosResources() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + val iosEnv = mapOf( + "PLATFORM_NAME" to "iphonesimulator", + "ARCHS" to "arm64", + "CONFIGURATION" to "Debug", + ) + val testEnv = defaultTestEnvironment.copy( + additionalEnvVars = iosEnv + ) + + with(TestProject("misc/iosResources", testEnv)) { + gradle( + ":syncFramework", + "-Pkotlin.native.cocoapods.platform=${iosEnv["PLATFORM_NAME"]}", + "-Pkotlin.native.cocoapods.archs=${iosEnv["ARCHS"]}", + "-Pkotlin.native.cocoapods.configuration=${iosEnv["CONFIGURATION"]}", + "--dry-run" + ).checks { + check.taskSkipped(":generateComposeResClass") + + check.taskSkipped(":convertXmlValueResourcesForCommonMain") + check.taskSkipped(":copyNonXmlValueResourcesForCommonMain") + check.taskSkipped(":prepareComposeResourcesTaskForCommonMain") + check.taskSkipped(":generateResourceAccessorsForCommonMain") + + check.taskSkipped(":convertXmlValueResourcesForNativeMain") + check.taskSkipped(":copyNonXmlValueResourcesForNativeMain") + check.taskSkipped(":prepareComposeResourcesTaskForNativeMain") + check.taskSkipped(":generateResourceAccessorsForNativeMain") + + check.taskSkipped(":convertXmlValueResourcesForAppleMain") + check.taskSkipped(":copyNonXmlValueResourcesForAppleMain") + check.taskSkipped(":prepareComposeResourcesTaskForAppleMain") + check.taskSkipped(":generateResourceAccessorsForAppleMain") + + check.taskSkipped(":convertXmlValueResourcesForIosMain") + check.taskSkipped(":copyNonXmlValueResourcesForIosMain") + check.taskSkipped(":prepareComposeResourcesTaskForIosMain") + check.taskSkipped(":generateResourceAccessorsForIosMain") + + check.taskSkipped(":convertXmlValueResourcesForIosX64Main") + check.taskSkipped(":copyNonXmlValueResourcesForIosX64Main") + check.taskSkipped(":prepareComposeResourcesTaskForIosX64Main") + check.taskSkipped(":generateResourceAccessorsForIosX64Main") + + check.taskSkipped(":syncPodComposeResourcesForIos") + } + gradle(":syncPodComposeResourcesForIos").checks { + check.taskSuccessful(":convertXmlValueResourcesForCommonMain") + check.taskSuccessful(":copyNonXmlValueResourcesForCommonMain") + check.taskSuccessful(":prepareComposeResourcesTaskForCommonMain") + check.taskSkipped(":generateResourceAccessorsForCommonMain") + + check.taskNoSource(":convertXmlValueResourcesForNativeMain") + check.taskNoSource(":copyNonXmlValueResourcesForNativeMain") + check.taskNoSource(":prepareComposeResourcesTaskForNativeMain") + check.taskSkipped(":generateResourceAccessorsForNativeMain") + + check.taskNoSource(":convertXmlValueResourcesForAppleMain") + check.taskNoSource(":copyNonXmlValueResourcesForAppleMain") + check.taskNoSource(":prepareComposeResourcesTaskForAppleMain") + check.taskSkipped(":generateResourceAccessorsForAppleMain") + + check.taskSuccessful(":convertXmlValueResourcesForIosMain") + check.taskSuccessful(":copyNonXmlValueResourcesForIosMain") + check.taskSuccessful(":prepareComposeResourcesTaskForIosMain") + check.taskSkipped(":generateResourceAccessorsForIosMain") + + check.taskNoSource(":convertXmlValueResourcesForIosX64Main") + check.taskNoSource(":copyNonXmlValueResourcesForIosX64Main") + check.taskNoSource(":prepareComposeResourcesTaskForIosX64Main") + check.taskSkipped(":generateResourceAccessorsForIosX64Main") + + file("build/compose/ios/shared/compose-resources/drawable/compose-multiplatform.xml").checkExists() + file("build/compose/ios/shared/compose-resources/drawable/icon.xml").checkExists() + } + } + } + + @Test + fun iosTestResources() { + Assumptions.assumeTrue(currentOS == OS.MacOS) + with(testProject("misc/iosResources")) { + gradle(":linkDebugTestIosX64", "--dry-run").checks { + check.taskSkipped(":copyTestComposeResourcesForIosX64") + check.taskSkipped(":linkDebugTestIosX64") + } + gradle(":copyTestComposeResourcesForIosX64").checks { + file("build/bin/iosX64/debugTest/compose-resources/drawable/compose-multiplatform.xml").checkExists() + file("build/bin/iosX64/debugTest/compose-resources/drawable/icon.xml").checkExists() + } + } + } } \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt index 1503c8f083..16a5c1fecf 100644 --- a/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt +++ b/gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/utils/assertUtils.kt @@ -72,6 +72,10 @@ internal class BuildResultChecks(private val result: BuildResult) { } } + fun taskNoSource(task: String) { + taskOutcome(task, TaskOutcome.NO_SOURCE) + } + private fun taskOutcome(task: String, expectedOutcome: TaskOutcome) { val actualOutcome = result.task(task)?.outcome if (actualOutcome != expectedOutcome) { diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle deleted file mode 100644 index df4dca6b00..0000000000 --- a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -plugins { - id "org.jetbrains.kotlin.multiplatform" - id "org.jetbrains.compose" -} - -kotlin { - iosX64 { - binaries.framework { - baseName = "shared" - isStatic = true - } - } - iosArm64 { - binaries.framework { - baseName = "shared" - isStatic = true - } - } - iosSimulatorArm64 { - binaries.framework { - baseName = "shared" - isStatic = true - } - } - - sourceSets { - def commonMain = named("commonMain") { - dependencies { - implementation(compose.runtime) - implementation(compose.foundation) - implementation(compose.material) - implementation(compose.components.resources) - } - } - def iosMain = create("iosMain") { - dependsOn(commonMain.get()) - } - named("iosX64Main") { - dependsOn(iosMain) - } - named("iosArm64Main") { - dependsOn(iosMain) - } - named("iosSimulatorArm64Main") { - dependsOn(iosMain) - } - } -} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle.kts b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle.kts new file mode 100644 index 0000000000..c2a2b0c400 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + kotlin("multiplatform") + kotlin("native.cocoapods") + id("org.jetbrains.compose") +} + +kotlin { + iosX64() + iosArm64() + iosSimulatorArm64() + + cocoapods { + version = "1.0" + summary = "Some description for a Kotlin/Native module" + homepage = "Link to a Kotlin/Native module homepage" + framework { + baseName = "shared" + isStatic = true + } + } + + sourceSets { + commonMain { + dependencies { + implementation(compose.runtime) + implementation(compose.material) + implementation(compose.components.resources) + } + } + } +} diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties index 689880ee3f..695204ddbf 100644 --- a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/gradle.properties @@ -1 +1,2 @@ +org.gradle.jvmargs=-Xmx8096M org.jetbrains.compose.experimental.uikit.enabled=true \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle deleted file mode 100644 index d1c65ad19c..0000000000 --- a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle +++ /dev/null @@ -1,26 +0,0 @@ -pluginManagement { - plugins { - id 'org.jetbrains.kotlin.multiplatform' version 'KOTLIN_VERSION_PLACEHOLDER' - id 'org.jetbrains.compose' version 'COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER' - } - repositories { - mavenLocal() - gradlePluginPortal() - mavenCentral() - google() - maven { - url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' - } - } -} -dependencyResolutionManagement { - repositories { - mavenLocal() - mavenCentral() - google() - maven { - url 'https://maven.pkg.jetbrains.space/public/p/compose/dev' - } - } -} -rootProject.name = "iosResources" \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle.kts b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle.kts new file mode 100644 index 0000000000..5efe902b20 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/settings.gradle.kts @@ -0,0 +1,23 @@ +rootProject.name = "iosResources" +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + google() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + } + plugins { + id("org.jetbrains.kotlin.multiplatform").version("KOTLIN_VERSION_PLACEHOLDER") + id("org.jetbrains.kotlin.native.cocoapods").version("KOTLIN_VERSION_PLACEHOLDER") + id("org.jetbrains.compose").version("COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER") + } +} +dependencyResolutionManagement { + repositories { + mavenLocal() + maven("https://maven.pkg.jetbrains.space/public/p/compose/dev") + mavenCentral() + gradlePluginPortal() + google() + } +} \ No newline at end of file diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/composeResources/drawable/compose-multiplatform.xml similarity index 100% rename from gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/resources/compose-multiplatform.xml rename to gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/composeResources/drawable/compose-multiplatform.xml diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt index 4b856546d9..17641ca754 100644 --- a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/commonMain/kotlin/App.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import org.jetbrains.compose.resources.ExperimentalResourceApi import org.jetbrains.compose.resources.painterResource +import iosResources.generated.resources.* @OptIn(ExperimentalResourceApi::class) @Composable @@ -29,7 +30,7 @@ fun App() { } AnimatedVisibility(showImage) { Image( - painterResource("compose-multiplatform.xml"), + painterResource(Res.drawable.compose_multiplatform), null ) } diff --git a/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/iosMain/composeResources/drawable/icon.xml b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/iosMain/composeResources/drawable/icon.xml new file mode 100644 index 0000000000..d7bf7955f4 --- /dev/null +++ b/gradle-plugins/compose/src/test/test-projects/misc/iosResources/src/iosMain/composeResources/drawable/icon.xml @@ -0,0 +1,36 @@ + + + + + + + +