Browse Source

[gradle] Add publish and consume Compose KMP library with resources test

pull/4454/head
Konstantin Tskhovrebov 3 months ago
parent
commit
02767de119
  1. 48
      gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt
  2. 89
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/build.gradle.kts
  3. 4
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/androidMain/AndroidManifest.xml
  4. 3
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonMain/composeResources/values/strings.xml
  5. 21
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonMain/kotlin/me/sample/app/App.kt
  6. 38
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonTest/kotlin/ComposeAppTest.kt
  7. 1
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/build.gradle.kts
  8. 10
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/build.gradle.kts
  9. 3
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/src/commonMain/composeResources/values-en-rNL/strings.xml
  10. 4
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/src/commonMain/kotlin/me/sample/library/Lib.kt
  11. 46
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/build.gradle.kts
  12. 3
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/src/commonMain/composeResources/values/strings.xml
  13. 12
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/src/commonMain/kotlin/me/sample/app/Feature.kt
  14. 11
      gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/settings.gradle.kts

48
gradle-plugins/compose/src/test/kotlin/org/jetbrains/compose/test/tests/integration/ResourcesTest.kt

@ -1,5 +1,6 @@
package org.jetbrains.compose.test.tests.integration
import org.jetbrains.compose.internal.utils.*
import org.jetbrains.compose.test.utils.*
import org.junit.jupiter.api.Test
import java.io.File
@ -133,11 +134,11 @@ class ResourcesTest : GradlePluginTestBase() {
}
@Test
fun testComposeResourcesPublication(): Unit = with(
fun testMultiModuleResources(): Unit = with(
testProject(
"misc/kmpResourcePublication",
defaultTestEnvironment.copy(
kotlinVersion = "2.0.0-titan-98",
kotlinVersion = "2.0.0-titan-105",
composeCompilerPlugin = "2.0.0-Beta4"
)
)
@ -189,11 +190,38 @@ class ResourcesTest : GradlePluginTestBase() {
checkResourcesZip(iosarm64ResZip, resourcesFiles, subdir)
val iossimulatorarm64ResZip = file(libpath("iossimulatorarm64", "-kotlin_resources.kotlin_resources.zip"))
checkResourcesZip(iossimulatorarm64ResZip, resourcesFiles, subdir)
//todo
// val jsResZip = file(libpath("js", "-kotlin_resources.kotlin_resources.zip"))
// checkResourcesZip(jsResZip, resourcesFiles, subdir)
// val wasmjsResZip = file(libpath("wasmjs", "-kotlin_resources.kotlin_resources.zip"))
// checkResourcesZip(wasmjsResZip, resourcesFiles, subdir)
val jsResZip = file(libpath("js", "-kotlin_resources.kotlin_resources.zip"))
checkResourcesZip(jsResZip, resourcesFiles, subdir)
val wasmjsResZip = file(libpath("wasm-js", "-kotlin_resources.kotlin_resources.zip"))
checkResourcesZip(wasmjsResZip, resourcesFiles, subdir)
}
file("settings.gradle.kts").modify { content ->
content.replace("//include(\":appModule\")", "include(\":appModule\")")
}
gradle(":appModule:jvmTest", "-i")
gradle(":appModule:pixel5Check")
if (currentOS == OS.MacOS) {
val iosTask = if (currentArch == Arch.X64) {
":appModule:iosX64Test"
} else {
":appModule:iosSimulatorArm64Test"
}
gradle(iosTask)
}
file("featureModule/src/commonMain/kotlin/me/sample/app/Feature.kt").modify { content ->
content.replace(
"Text(txt + stringResource(Res.string.str_1), modifier)",
"Text(stringResource(Res.string.str_1), modifier)"
)
}
gradleFailure(":appModule:jvmTest").checks {
check.logContains("java.lang.AssertionError: Failed to assert the following: (Text + EditableText = [test text: Feature text str_1])")
check.logContains("Text = '[Feature text str_1]'")
}
}
@ -212,7 +240,8 @@ class ResourcesTest : GradlePluginTestBase() {
@Test
fun testFinalArtefacts(): Unit = with(testProject("misc/commonResources")) {
//https://developer.android.com/build/build-variants?utm_source=android-studio#product-flavors
file("build.gradle.kts").appendText("""
file("build.gradle.kts").appendText(
"""
kotlin {
js {
@ -232,7 +261,8 @@ class ResourcesTest : GradlePluginTestBase() {
create("full")
}
}
""".trimIndent())
""".trimIndent()
)
file("src/androidDemoDebug/composeResources/files/platform.txt").writeNewFile("android demo-debug")
file("src/androidDemoRelease/composeResources/files/platform.txt").writeNewFile("android demo-release")
file("src/androidFullDebug/composeResources/files/platform.txt").writeNewFile("android full-debug")

89
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/build.gradle.kts

@ -0,0 +1,89 @@
import org.jetbrains.compose.ExperimentalComposeLibrary
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree
plugins {
id("org.jetbrains.compose")
kotlin("multiplatform")
id("com.android.application")
}
kotlin {
androidTarget {
@OptIn(ExperimentalKotlinGradlePluginApi::class)
instrumentedTestVariant {
sourceSetTree.set(KotlinSourceSetTree.test)
dependencies {
implementation("androidx.compose.ui:ui-test-junit4-android:1.6.2")
debugImplementation("androidx.compose.ui:ui-test-manifest:1.6.2")
}
}
}
jvm()
iosX64()
iosArm64()
iosSimulatorArm64()
js { browser() }
wasmJs { browser() }
sourceSets {
all {
languageSettings {
optIn("org.jetbrains.compose.resources.ExperimentalResourceApi")
}
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.material3)
implementation(compose.components.resources)
implementation("me.sample.library:cmplib:1.0")
implementation(project(":featureModule"))
}
jvmMain.dependencies {
implementation(compose.desktop.currentOs)
}
commonTest.dependencies {
implementation(kotlin("test"))
@OptIn(ExperimentalComposeLibrary::class)
implementation(compose.uiTest)
}
}
}
android {
namespace = "me.sample.app"
compileSdk = 34
sourceSets["main"].manifest.srcFile("src/androidMain/AndroidManifest.xml")
defaultConfig {
applicationId = "org.example.project"
minSdk = 24
targetSdk = 34
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
@Suppress("UnstableApiUsage")
testOptions {
managedDevices {
devices {
maybeCreate<com.android.build.api.dsl.ManagedVirtualDevice>("pixel5").apply {
device = "Pixel 5"
apiLevel = 34
systemImageSource = "aosp"
}
}
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
compose {
kotlinCompilerPlugin.set(dependencies.compiler.forKotlin("COMPOSE_COMPILER_PLUGIN_PLACEHOLDER"))
kotlinCompilerPluginArgs.add("suppressKotlinVersionCompatibilityCheck=KOTLIN_VERSION_PLACEHOLDER")
}

4
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/androidMain/AndroidManifest.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest>
<application/>
</manifest>

3
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonMain/composeResources/values/strings.xml

@ -0,0 +1,3 @@
<resources>
<string name="str_1">App text str_1</string>
</resources>

21
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonMain/kotlin/me/sample/app/App.kt

@ -0,0 +1,21 @@
package me.sample.app
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import me.sample.library.MyLibraryIcon
import me.sample.library.MyLibraryText
import kmpresourcepublication.appmodule.generated.resources.*
import org.jetbrains.compose.resources.stringResource
@Composable
fun App() {
Column {
val txt = "text: "
Text(txt + stringResource(Res.string.str_1))
MyFeatureText(txt = txt)
MyLibraryText(txt = txt)
MyLibraryIcon(Modifier)
}
}

38
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/appModule/src/commonTest/kotlin/ComposeAppTest.kt

@ -0,0 +1,38 @@
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.runComposeUiTest
import me.sample.app.App
import me.sample.app.MyFeatureText
import me.sample.library.MyLibraryText
import org.jetbrains.compose.resources.stringResource
import kmpresourcepublication.appmodule.generated.resources.*
import kotlin.test.Test
@OptIn(ExperimentalTestApi::class)
class ComposeAppTest {
@Test
fun checkApp() = runComposeUiTest {
val txt = "test text: "
setContent {
Column {
App()
Text(
modifier = Modifier.testTag("app-text"),
text = txt + stringResource(Res.string.str_1)
)
MyFeatureText(Modifier.testTag("feature-text"), txt)
MyLibraryText(Modifier.testTag("library-text"), txt)
}
}
onNodeWithTag("app-text").assertTextEquals("test text: App text str_1")
onNodeWithTag("feature-text").assertTextEquals("test text: Feature text str_1")
onNodeWithTag("library-text").assertTextEquals("test text: Library text str_1")
}
}

1
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/build.gradle.kts

@ -2,4 +2,5 @@ plugins {
id("org.jetbrains.compose").apply(false)
kotlin("multiplatform").apply(false)
id("com.android.library").apply(false)
id("com.android.application").apply(false)
}

10
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/build.gradle.kts

@ -10,7 +10,7 @@ version = "1.0"
publishing {
repositories {
maven {
url = uri(project.rootDir.resolve("my-mvn"))
url = uri(rootProject.projectDir.resolve("my-mvn"))
}
}
}
@ -22,7 +22,7 @@ kotlin {
iosArm64()
iosSimulatorArm64()
js { browser() }
// wasmJs { browser() }
wasmJs { browser() }
sourceSets {
all {
@ -30,23 +30,17 @@ kotlin {
optIn("org.jetbrains.compose.resources.ExperimentalResourceApi")
}
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.material3)
implementation(compose.components.resources)
}
commonTest.dependencies {
implementation(kotlin("test"))
}
}
}
android {
namespace = "me.sample.library"
compileSdk = 34
defaultConfig {
minSdk = 24
}

3
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/src/commonMain/composeResources/values-en-rNL/strings.xml

@ -1,3 +0,0 @@
<resources>
<string name="str_1">NL Library text str_1</string>
</resources>

4
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/cmplib/src/commonMain/kotlin/me/sample/library/Lib.kt

@ -12,9 +12,9 @@ import org.jetbrains.compose.resources.painterResource
import org.jetbrains.compose.resources.stringResource
@Composable
fun MyLibraryText(txt: String) {
fun MyLibraryText(modifier: Modifier = Modifier, txt: String) {
Column {
Text(text = txt + stringResource(Res.string.str_1))
Text(text = txt + stringResource(Res.string.str_1), modifier)
Text(
text = "\uF055\uF056\uF057\uF058\uF059\uF05A",
fontFamily = FontFamily(Font(Res.font.font_awesome))

46
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/build.gradle.kts

@ -0,0 +1,46 @@
plugins {
id("org.jetbrains.compose")
kotlin("multiplatform")
id("com.android.library")
}
kotlin {
androidTarget()
jvm()
iosX64()
iosArm64()
iosSimulatorArm64()
js { browser() }
wasmJs { browser() }
sourceSets {
all {
languageSettings {
optIn("org.jetbrains.compose.resources.ExperimentalResourceApi")
}
}
commonMain.dependencies {
implementation(compose.runtime)
implementation(compose.material3)
implementation(compose.components.resources)
}
}
}
android {
namespace = "me.sample.feature"
compileSdk = 34
defaultConfig {
minSdk = 24
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
compose {
kotlinCompilerPlugin.set(dependencies.compiler.forKotlin("COMPOSE_COMPILER_PLUGIN_PLACEHOLDER"))
kotlinCompilerPluginArgs.add("suppressKotlinVersionCompatibilityCheck=KOTLIN_VERSION_PLACEHOLDER")
}

3
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/src/commonMain/composeResources/values/strings.xml

@ -0,0 +1,3 @@
<resources>
<string name="str_1">Feature text str_1</string>
</resources>

12
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/featureModule/src/commonMain/kotlin/me/sample/app/Feature.kt

@ -0,0 +1,12 @@
package me.sample.app
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import org.jetbrains.compose.resources.stringResource
import kmpresourcepublication.featuremodule.generated.resources.*
@Composable
fun MyFeatureText(modifier: Modifier = Modifier, txt: String) {
Text(txt + stringResource(Res.string.str_1), modifier)
}

11
gradle-plugins/compose/src/test/test-projects/misc/kmpResourcePublication/settings.gradle.kts

@ -1,27 +1,36 @@
rootProject.name = "kmpResourcePublication"
include(":cmplib")
include(":featureModule")
//include(":appModule")
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral()
google()
mavenLocal()
//todo temporary repo for custom KGP plugin
maven("https://packages.jetbrains.team/files/p/mpp/kgp-for-compose2")
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev/")
mavenLocal()
}
plugins {
id("org.jetbrains.kotlin.multiplatform").version("KOTLIN_VERSION_PLACEHOLDER")
id("org.jetbrains.compose").version("COMPOSE_GRADLE_PLUGIN_VERSION_PLACEHOLDER")
id("com.android.library").version("AGP_VERSION_PLACEHOLDER")
id("com.android.application").version("AGP_VERSION_PLACEHOLDER")
}
}
dependencyResolutionManagement {
repositories {
mavenCentral()
google()
//todo temporary repo for custom KGP plugin
maven("https://packages.jetbrains.team/files/p/mpp/kgp-for-compose2")
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
maven("https://maven.pkg.jetbrains.space/kotlin/p/kotlin/dev/")
mavenLocal()
maven {
url = uri(rootProject.projectDir.resolve("my-mvn"))
}
}
}
Loading…
Cancel
Save