From 09286504b735e2280fc4a7f95b5b8c4ca4af6dc4 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Tue, 15 Dec 2020 17:38:33 +0300 Subject: [PATCH] Add a bunch of tests on corner-cases in Gradle MPP Import For most of those the behaviour isn't set in stone, though at the moment of making that commit we're more or less sure that it's reasonable. Behaviour in some cases might be more strictly enforces (as much as you can enforce something in esoteric cases with misconfigured project sturcture). Those are marked with comments with '!'. --- ...chicalMultiplatformProjectImportingTest.kt | 147 ++++++++++++++++++ .../build.gradle.kts | 32 ++++ .../gradle.properties | 1 + .../settings.gradle.kts | 9 ++ .../build.gradle.kts | 37 +++++ .../gradle.properties | 1 + .../settings.gradle.kts | 9 ++ .../build.gradle.kts | 27 ++++ .../gradle.properties | 1 + .../settings.gradle.kts | 9 ++ .../orphanSourceSet/build.gradle.kts | 25 +++ .../orphanSourceSet/gradle.properties | 1 + .../orphanSourceSet/settings.gradle.kts | 9 ++ .../build.gradle.kts | 31 ++++ .../gradle.properties | 1 + .../settings.gradle.kts | 9 ++ .../build.gradle.kts | 40 +++++ .../gradle.properties | 1 + .../settings.gradle.kts | 9 ++ 19 files changed, 399 insertions(+) create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties create mode 100644 idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts diff --git a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt index a20b10700e3..f24962e85aa 100644 --- a/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt +++ b/idea/idea-gradle/tests/org/jetbrains/kotlin/gradle/HierarchicalMultiplatformProjectImportingTest.kt @@ -420,6 +420,153 @@ class HierarchicalMultiplatformProjectImportingTest : MultiplePluginVersionGradl module("my-app.submodule.jsTest") { targetPlatform(js) } } } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testOrphanSourceSet() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + // must not be (jvm, js, native) + targetPlatform(jvm, js) + } + + module("my-app.orphan") { + targetPlatform(jvm, js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testSourceSetIncludedIntoCompilationDirectly() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.includedIntoJvm") { + targetPlatform(jvm) // ! + } + + module("my-app.includedIntoJvmAndJs") { + targetPlatform(jvm, js) // ! + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testDefaultSourceSetDependsOnDefaultSourceSet() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.commonMain") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.intermediateBetweenJsAndCommon") { + targetPlatform(jvm, js) // must not be (jvm, js, native) + } + + module("my-app.jsMain") { + targetPlatform(js) // must not be (jvm, js) + } + + module("my-app.jvmMain") { + targetPlatform(jvm) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testDefaultSourceSetIncludedIntoAnotherCompilationDirectly() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.jvmMain") { + targetPlatform(jvm) // must not be (jvm, js) + } + + module("my-app.jsMain") { + targetPlatform(js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testSourceSetsWithDependsOnButNotIncludedIntoCompilation() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + val js = JsPlatforms.defaultJsPlatform + val native = NativePlatforms.unspecifiedNativePlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + + // (jvm, js, native) is highly undesirable + module("my-app.danglingOnJvm") { + targetPlatform(jvm, js) + } + + module("my-app.commonMain") { + targetPlatform(jvm, js) + } + + module("my-app.danglingOnCommon") { + targetPlatform(jvm, js) + } + + module("my-app.danglingOnJvmAndJs") { + targetPlatform(jvm, js) + } + } + } + + @Test + @PluginTargetVersions(gradleVersionForLatestPlugin = mppImportTestMinVersionForMaster) + fun testCustomAddToCompilationPlusDependsOn() { + configureByFiles() + importProject() + + val jvm = JvmPlatforms.defaultJvmPlatform + + checkProjectStructure(exhaustiveModuleList = false, exhaustiveSourceSourceRootList = false, exhaustiveDependencyList = false) { + module("my-app.includedIntoJvm") { + targetPlatform(jvm) // ! + } + + module("my-app.pseudoOrphan") { + targetPlatform(jvm) // ! + } + } + } + private fun checkProjectStructure( exhaustiveModuleList: Boolean = true, exhaustiveSourceSourceRootList: Boolean = true, diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts new file mode 100644 index 00000000000..2cebce79ba2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/build.gradle.kts @@ -0,0 +1,32 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val pseudoOrphan by creating { + } + + val includedIntoJvm by creating { + dependsOn(pseudoOrphan) + } + + jvm().compilations["main"].source(includedIntoJvm) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/customAddToCompilationPlusDependsOn/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts new file mode 100644 index 00000000000..e01f85d5474 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/build.gradle.kts @@ -0,0 +1,37 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val commonMain by getting {} + + val intermediateBetweenJsAndCommon by creating { + dependsOn(commonMain) + } + + val jsMain by getting { + dependsOn(intermediateBetweenJsAndCommon) + } + + val jvmMain by getting { + dependsOn(jsMain) + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetDependsOnDefaultSourceSet/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts new file mode 100644 index 00000000000..f452654fefc --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/build.gradle.kts @@ -0,0 +1,27 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val jvmMain by getting { } + + js().compilations["main"].source(jvmMain) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/defaultSourceSetIncludedIntoAnotherCompilationDirectly/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts new file mode 100644 index 00000000000..8f5506d42fe --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/build.gradle.kts @@ -0,0 +1,25 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val orphan by creating { } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/orphanSourceSet/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts new file mode 100644 index 00000000000..27d155e7460 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/build.gradle.kts @@ -0,0 +1,31 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val includedIntoJvm by creating { } + val includedIntoJvmAndJs by creating { } + + jvm().compilations["main"].source(includedIntoJvm) + + jvm().compilations["main"].source(includedIntoJvmAndJs) + js().compilations["main"].source(includedIntoJvmAndJs) + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetIncludedIntoCompilationDirectly/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts new file mode 100644 index 00000000000..1c7a16755bc --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/build.gradle.kts @@ -0,0 +1,40 @@ +buildscript { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +repositories { + {{kts_kotlin_plugin_repositories}} +} + +plugins { + kotlin("multiplatform").version("{{kotlin_plugin_version}}") +} + +group = "project" +version = "1.0" + +kotlin { + jvm() + js() + + sourceSets { + val commonMain by getting { } + val jvmMain by getting { } + val jsMain by getting { } + + val danglingOnJvm by creating { + dependsOn(jvmMain) + } + + val danglingOnCommon by creating { + dependsOn(commonMain) + } + + val danglingOnJvmAndJs by creating { + dependsOn(jvmMain) + dependsOn(jsMain) + } + } +} \ No newline at end of file diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties new file mode 100644 index 00000000000..5947cb440c4 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/gradle.properties @@ -0,0 +1 @@ +kotlin.mpp.enableGranularSourceSetsMetadata=true diff --git a/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts new file mode 100644 index 00000000000..176c45caae2 --- /dev/null +++ b/idea/testData/gradle/hierarchicalMultiplatformImport/sourceSetsWithDependsOnButNotIncludedIntoCompilation/settings.gradle.kts @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + {{kts_kotlin_plugin_repositories}} + } +} + +rootProject.name = "my-app" + +enableFeaturePreview("GRADLE_METADATA") \ No newline at end of file