Setup Compose compiler runtime tests

Enables runtime tests to run with latest Compose compiler version and snapshot runtime.
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index 186d0a0..42fc23c 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -253,6 +253,18 @@
             <sha256 value="00421ed4ed83f8b1ef2a22434a6c7102bb08e16b2cc4acfda503da9ddc213e91" origin="Generated by Gradle"/>
          </artifact>
       </component>
+      <component group="androidx.compose.runtime" name="runtime-test-utils" version="1.7.0-SNAPSHOT">
+         <artifact name="runtime-test-utils-1.7.0-SNAPSHOT.jar">
+            <md5 value="b49204b3c5e0b9db038e126467975dae" origin="Generated by Gradle"/>
+            <sha256 value="1d16976ceeb68559eff258b9aa613d7d6026b4e261a87b03c7eab89c64eef381" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
+      <component group="androidx.compose.runtime" name="runtime-test-utils-desktop" version="1.7.0-SNAPSHOT">
+         <artifact name="runtime-test-utils-desktop-1.7.0-SNAPSHOT.jar">
+            <md5 value="7a5e0b8a2eb6176e39db1f276665985b" origin="Generated by Gradle"/>
+            <sha256 value="b3af6dee150eee9f15d23f5bb4ab393fe6921504a930b3d3fee6c7b3e1f02819" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="androidx.compose.ui" name="ui-util-desktop" version="1.7.0-SNAPSHOT">
          <artifact name="ui-util-desktop-1.7.0-SNAPSHOT.jar">
             <md5 value="de4b87c5d6c765931df25d4668ce2a22" origin="Generated by Gradle"/>
@@ -4179,6 +4191,12 @@
             <sha256 value="a4c74d94d64ce1abe53760fe0389dd941f6fc558d0dab35e47c085a11ec80f28" origin="Generated by Gradle"/>
          </artifact>
       </component>
+      <component group="org.jetbrains.kotlin" name="kotlin-test-junit" version="1.8.22">
+         <artifact name="kotlin-test-junit-1.8.22.jar">
+            <md5 value="0d49b5a601a611e4f40dfae2e72c37d7" origin="Generated by Gradle"/>
+            <sha256 value="a1e337cffee01219c5d42783ea78844e95e68d346a9c586bfbb7eb767810f7ea" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="org.jetbrains.kotlin" name="kotlin-tooling-core" version="1.8.20-dev-4242">
          <artifact name="kotlin-tooling-core-1.8.20-dev-4242.jar">
             <md5 value="3762be9ba7cdfc5e9e63dee28bab3515" origin="Generated by Gradle"/>
@@ -4441,6 +4459,12 @@
             <sha256 value="3145fd68ad71ec6100924f74f1b6d52d22250dc2771a56b4f164c2a22fb50cac" origin="Generated by Gradle"/>
          </artifact>
       </component>
+      <component group="org.jetbrains.kotlinx" name="kotlinx-coroutines-test-jvm" version="1.7.3">
+         <artifact name="kotlinx-coroutines-test-jvm-1.7.3.jar">
+            <md5 value="b874ff6ea64c2f728a3721bcdd400267" origin="Generated by Gradle"/>
+            <sha256 value="d19742a65dbdabc9ffdcb9f84a15c776e511a14da602d54ea4e078d6f7227a26" origin="Generated by Gradle"/>
+         </artifact>
+      </component>
       <component group="org.jetbrains.kotlinx" name="kotlinx-datetime-jvm" version="0.3.1">
          <artifact name="kotlinx-datetime-jvm-0.3.1.jar">
             <md5 value="7fe856499ef7fcc60f4db75ccc753619" origin="Generated by Gradle"/>
diff --git a/plugins/compose/compiler-hosted/integration-tests/build.gradle.kts b/plugins/compose/compiler-hosted/integration-tests/build.gradle.kts
index 4926c8f..35fff39 100644
--- a/plugins/compose/compiler-hosted/integration-tests/build.gradle.kts
+++ b/plugins/compose/compiler-hosted/integration-tests/build.gradle.kts
@@ -1,29 +1,19 @@
-import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
-import org.jetbrains.kotlin.gradle.dsl.KotlinVersion
-
 plugins {
     kotlin("multiplatform")
 }
 
-val ComposeSnapshotId = "11751492"
-val ComposeVersion = "1.7.0-SNAPSHOT"
 repositories {
-    maven("https://androidx.dev/snapshots/builds/$ComposeSnapshotId/artifacts/repository")
+    androidxSnapshotRepo()
     google()
 }
 
 optInToObsoleteDescriptorBasedAPI()
 
 kotlin {
-    jvmToolchain(17)
+    jvmToolchain(11)
 
     jvm()
 
-    @OptIn(ExperimentalKotlinGradlePluginApi::class)
-    compilerOptions {
-        languageVersion.set(KotlinVersion.KOTLIN_1_9)
-    }
-
     sourceSets {
         commonTest.dependencies {
             implementation(project(":kotlin-stdlib-common"))
@@ -62,9 +52,9 @@
                 implementation(project(":plugins:compose-compiler-plugin:compiler-hosted:integration-tests:protobuf-test-classes"))
 
                 // external deps
-                implementation("androidx.compose.runtime:runtime:$ComposeVersion")
-                implementation("androidx.compose.foundation:foundation:$ComposeVersion")
-                implementation("androidx.compose.ui:ui:$ComposeVersion")
+                implementation(composeRuntime())
+                implementation(composeFoundation())
+                implementation(composeUi())
                 implementation("org.jetbrains.kotlinx:kotlinx-collections-immutable-jvm:0.3.4")
                 implementation("com.google.dagger:dagger:2.40.1")
             }
diff --git a/plugins/compose/compiler-hosted/runtime-tests/build.gradle b/plugins/compose/compiler-hosted/runtime-tests/build.gradle
deleted file mode 100644
index 095b280..0000000
--- a/plugins/compose/compiler-hosted/runtime-tests/build.gradle
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import androidx.build.Publish
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-    id("AndroidXPlugin")
-}
-
-androidXMultiplatform {
-    desktop()
-
-    sourceSets {
-        commonMain {
-        }
-
-        commonTest {
-            dependencies {
-                implementation(libs.kotlinStdlibCommon)
-                implementation(projectOrArtifact(":compose:runtime:runtime"))
-                implementation(projectOrArtifact(":compose:runtime:runtime-test-utils"))
-                implementation kotlin("test-junit")
-                implementation(libs.kotlinCoroutinesTest)
-                implementation(libs.kotlinReflect)
-            }
-        }
-
-        desktopMain {
-            dependsOn(commonMain)
-            dependencies {
-            }
-        }
-
-        desktopTest {
-            dependsOn(commonTest)
-            dependencies {
-            }
-        }
-    }
-}
-
-// Add current version of Compose compiler plugin, as AndroidXCompose plugin pins to releases.
-configurations {
-    composePlugin {
-        canBeConsumed = false
-    }
-}
-
-dependencies {
-    composePlugin(project(":compose:compiler:compiler"))
-}
-
-def composePluginFiles = configurations.getByName("composePlugin")
-    .incoming
-    .artifactView {}
-    .files
-
-tasks.withType(KotlinCompile).configureEach {
-    pluginClasspath.from(composePluginFiles)
-    kotlinOptions {
-        freeCompilerArgs += [
-            "-P",
-            "plugin:androidx.compose.compiler.plugins.kotlin:nonSkippingGroupOptimization=true"
-        ]
-    }
-}
-
-androidx {
-    name = "Compose compiler executable tests"
-    publish = Publish.NONE
-    inceptionYear = "2024"
-    description = "Contains executable Compose compiler tests that use Compose runtime."
-}
diff --git a/plugins/compose/compiler-hosted/runtime-tests/build.gradle.kts b/plugins/compose/compiler-hosted/runtime-tests/build.gradle.kts
new file mode 100644
index 0000000..f814d6b
--- /dev/null
+++ b/plugins/compose/compiler-hosted/runtime-tests/build.gradle.kts
@@ -0,0 +1,50 @@
+plugins {
+    kotlin("multiplatform")
+}
+
+repositories {
+    androidxSnapshotRepo()
+    google()
+}
+
+optInToObsoleteDescriptorBasedAPI()
+
+
+dependencies {
+    // run compilation with the current compiler to ensure that Compose plugin is binary compatible
+    kotlinCompilerClasspath(project(":kotlin-compiler-embeddable"))
+
+    kotlinCompilerPluginClasspath(project(":plugins:compose-compiler-plugin:compiler"))
+}
+
+kotlin {
+    jvm()
+
+    jvmToolchain(11)
+
+    sourceSets {
+        commonTest.dependencies {
+            implementation(project(":kotlin-stdlib-common"))
+            implementation(kotlinTest("junit"))
+        }
+
+        val jvmTest by getting {
+            dependsOn(commonTest.get())
+
+            dependencies {
+                // junit
+                implementation(libs.junit4)
+                implementation(project.dependencies.platform(libs.junit.bom))
+                implementation(libs.junit.jupiter.api)
+                runtimeOnly(libs.junit.jupiter.engine)
+
+                // kotlin deps
+                implementation(project(":kotlin-stdlib"))
+
+                // external deps
+                implementation(composeRuntime())
+                implementation(composeRuntimeTestUtils())
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/plugins/compose/compiler-hosted/runtime-tests/src/desktopTest/kotlin/androidx/compose/compiler/test/JvmCompositionTests.kt b/plugins/compose/compiler-hosted/runtime-tests/src/jvmTest/kotlin/androidx/compose/compiler/test/JvmCompositionTests.kt
similarity index 100%
rename from plugins/compose/compiler-hosted/runtime-tests/src/desktopTest/kotlin/androidx/compose/compiler/test/JvmCompositionTests.kt
rename to plugins/compose/compiler-hosted/runtime-tests/src/jvmTest/kotlin/androidx/compose/compiler/test/JvmCompositionTests.kt
diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/ComposeDependencies.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/ComposeDependencies.kt
new file mode 100644
index 0000000..3313bd4
--- /dev/null
+++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/ComposeDependencies.kt
@@ -0,0 +1,23 @@
+import org.gradle.api.Project
+import org.gradle.api.artifacts.dsl.RepositoryHandler
+import org.gradle.api.artifacts.repositories.MavenArtifactRepository
+import java.net.URI
+
+/*
+ * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+private const val composeSnapshotId = "11751492"
+private const val composeVersion = "1.7.0-SNAPSHOT"
+
+fun RepositoryHandler.androidxSnapshotRepo() {
+    maven {
+        url = URI("https://androidx.dev/snapshots/builds/$composeSnapshotId/artifacts/repository")
+    }
+}
+
+fun Project.composeRuntime() = "androidx.compose.runtime:runtime:${composeVersion}"
+fun Project.composeRuntimeTestUtils() = "androidx.compose.runtime:runtime-test-utils:${composeVersion}"
+fun Project.composeUi() = "androidx.compose.ui:ui:${composeVersion}"
+fun Project.composeFoundation() = "androidx.compose.foundation:foundation:${composeVersion}"
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index 0a294bb..5181c6f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -425,7 +425,8 @@
             ":plugins:compose-compiler-plugin:compiler:integration-tests",
             ":plugins:compose-compiler-plugin:compiler-hosted",
             ":plugins:compose-compiler-plugin:compiler-hosted:integration-tests",
-            ":plugins:compose-compiler-plugin:compiler-hosted:integration-tests:protobuf-test-classes"
+            ":plugins:compose-compiler-plugin:compiler-hosted:integration-tests:protobuf-test-classes",
+            ":plugins:compose-compiler-plugin:compiler-hosted:runtime-tests"
 }
 
 // Swift Export modules
@@ -874,6 +875,7 @@
     project(':plugins:compose-compiler-plugin:compiler-hosted:integration-tests').projectDir = file("$rootDir/plugins/compose/compiler-hosted/integration-tests")
     project(':plugins:compose-compiler-plugin:compiler-hosted:integration-tests:protobuf-test-classes').projectDir =
             file("$rootDir/plugins/compose/compiler-hosted/integration-tests/protobuf-test-classes")
+    project(':plugins:compose-compiler-plugin:compiler-hosted:runtime-tests').projectDir = file("$rootDir/plugins/compose/compiler-hosted/runtime-tests")
 }
 
 project(':kotlin-scripting-ide-services-unshaded').projectDir = "$rootDir/plugins/scripting/scripting-ide-services" as File