[MPP] Validate that a project with an explicit stdlib-js dependency assembles

^KT-60901
^KT-61126
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibJsDependencyIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibJsDependencyIT.kt
new file mode 100644
index 0000000..2b35e56
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibJsDependencyIT.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2010-2023 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.
+ */
+
+package org.jetbrains.kotlin.gradle
+
+import org.gradle.util.GradleVersion
+import org.jetbrains.kotlin.gradle.testbase.*
+import org.jetbrains.kotlin.gradle.util.replaceText
+import org.junit.jupiter.api.DisplayName
+
+@MppGradlePluginTests
+@DisplayName("Multiplatform stdlib-js explicit dependency test")
+class StdlibJsDependencyIT : KGPBaseTest() {
+
+    @DisplayName("Js and jvm targets with stdlib-js dependency in jsMain assembles")
+    @GradleTest
+    fun testJsAndJvmTargetWithDependencyInJsMain(gradleVersion: GradleVersion) {
+        projectWithJsTargetAndStdlibJsDependency(
+            otherTarget = "jvm()",
+            sourceSetWithStdlibJsDependency = "jsMain",
+            gradleVersion
+        ) {
+            build("assemble")
+        }
+    }
+
+    @DisplayName("Only js target with stdlib-js dependency in jsMain assembles")
+    @GradleTest
+    fun testOnlyJsTargetWithDependencyInJsMain(gradleVersion: GradleVersion) {
+        projectWithJsTargetAndStdlibJsDependency(
+            otherTarget = "",
+            sourceSetWithStdlibJsDependency = "jsMain",
+            gradleVersion
+        ) {
+            build("assemble")
+        }
+    }
+
+    @DisplayName("Js and jvm target with stdlib-js dependency in commonMain fails with an ambiguity error")
+    @GradleTest
+    fun testJsAndJvmTargetWithDependencyInCommonMain(gradleVersion: GradleVersion) {
+        projectWithJsTargetAndStdlibJsDependency(
+            otherTarget = "jvm()",
+            sourceSetWithStdlibJsDependency = "commonMain",
+            gradleVersion
+        ) {
+            buildAndFail("assemble") {
+                assertOutputContains(
+                    "cannot choose between the following variants of org.jetbrains.kotlin:kotlin-stdlib-js"
+                )
+            }
+        }
+    }
+
+    @DisplayName("Only js target with stdlib-js dependency in commonMain assembles")
+    @GradleTest
+    fun testOnlyJsTargetWithDependencyInCommonMain(gradleVersion: GradleVersion) {
+        projectWithJsTargetAndStdlibJsDependency(
+            otherTarget = "",
+            sourceSetWithStdlibJsDependency = "commonMain",
+            gradleVersion
+        ) {
+            build("assemble")
+        }
+    }
+
+    private fun projectWithJsTargetAndStdlibJsDependency(
+        otherTarget: String,
+        sourceSetWithStdlibJsDependency: String,
+        gradleVersion: GradleVersion,
+        perform: TestProject.() -> Unit
+    ) {
+        project(
+            "stdlib-js-dependency",
+            gradleVersion,
+        ) {
+            buildGradleKts.replaceText("<otherTarget>", otherTarget)
+            buildGradleKts.replaceText("<sourceSetWithStdlibJsDependency>", sourceSetWithStdlibJsDependency)
+
+            perform()
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/build.gradle.kts
new file mode 100644
index 0000000..ddde1fa
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/build.gradle.kts
@@ -0,0 +1,22 @@
+plugins {
+    kotlin("multiplatform")
+}
+
+group = "com.example"
+version = "1.0"
+
+repositories {
+    mavenLocal()
+    mavenCentral()
+}
+
+kotlin {
+    js()
+    <otherTarget>
+
+    sourceSets.getByName("<sourceSetWithStdlibJsDependency>") {
+        dependencies {
+            implementation(kotlin("stdlib-js"))
+        }
+    }
+}
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/settings.gradle.kts
new file mode 100644
index 0000000..26d5444
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/settings.gradle.kts
@@ -0,0 +1 @@
+rootProject.name = "stdlib-js-dependency"
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonMain/kotlin/CommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonMain/kotlin/CommonMain.kt
new file mode 100644
index 0000000..a62c3f4
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonMain/kotlin/CommonMain.kt
@@ -0,0 +1 @@
+val a = 1
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonTest/kotlin/CommonTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonTest/kotlin/CommonTest.kt
new file mode 100644
index 0000000..331fdd4
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/commonTest/kotlin/CommonTest.kt
@@ -0,0 +1 @@
+val b = 1
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsMain/kotlin/JsMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsMain/kotlin/JsMain.kt
new file mode 100644
index 0000000..aaf7d9c
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsMain/kotlin/JsMain.kt
@@ -0,0 +1 @@
+val c = 1
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsTest/kotlin/JsTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsTest/kotlin/JsTest.kt
new file mode 100644
index 0000000..59946dc
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jsTest/kotlin/JsTest.kt
@@ -0,0 +1 @@
+val d = 1
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmMain/kotlin/JvmMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmMain/kotlin/JvmMain.kt
new file mode 100644
index 0000000..3e76be5
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmMain/kotlin/JvmMain.kt
@@ -0,0 +1 @@
+val e = 1
\ No newline at end of file
diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmTest/kotlin/JvmTest.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmTest/kotlin/JvmTest.kt
new file mode 100644
index 0000000..2042701
--- /dev/null
+++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/stdlib-js-dependency/src/jvmTest/kotlin/JvmTest.kt
@@ -0,0 +1 @@
+val f = 1
\ No newline at end of file