From 5ffe0e1a67c428dd508ac586d04cf12b9c2bb111 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 19 Mar 2026 12:17:15 -0700 Subject: [PATCH 1/3] providing toolchain compatiblity --- .../generator/rootproject/SettingsGradle.kt | 1 + .../rootproject/SettingsGradleTest.kt | 25 ++++++++--- .../writer/ConventionPluginWriterTest.kt | 45 +++++++++++++++++++ .../writer/ProjectWriterTest.kt | 4 ++ 4 files changed, 69 insertions(+), 6 deletions(-) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt index a9fcdb56..89d61897 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt @@ -6,6 +6,7 @@ class SettingsGradle { fun get(versions: Versions, develocity: Boolean, projectName: String): String { val pluginLines = buildList { + add("""id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"""") if (develocity) { add("""id("com.gradle.develocity") version "${versions.project.develocity}"""") add("""id("com.gradle.common-custom-user-data-gradle-plugin") version "${versions.project.ccud}"""") diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt index 62f34d41..a647e4f2 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt @@ -9,17 +9,17 @@ import org.junit.jupiter.api.Test class SettingsGradleTest { @Test - fun `does not include plugins block when additionalSettingsPlugins is empty and develocity is false`() { + fun `includes toolchain resolver plugin when additionalSettingsPlugins is empty and develocity is false`() { val versions = Versions(additionalSettingsPlugins = emptyList()) val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject") - assertFalse( + assertTrue( result.contains("plugins {"), - "settings.gradle.kts should not contain plugins block when additionalSettingsPlugins is empty and develocity is false" + "settings.gradle.kts should contain a plugins block for toolchain provisioning" ) - assertFalse( - result.contains("spotlight") || result.contains("com.fueledbycaffeine.spotlight"), - "settings.gradle.kts should not contain Spotlight when additionalSettingsPlugins is empty" + assertTrue( + result.contains("org.gradle.toolchains.foojay-resolver-convention"), + "settings.gradle.kts should include the Foojay toolchain resolver plugin" ) } @@ -33,7 +33,20 @@ class SettingsGradleTest { val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject") assertTrue(result.contains("plugins {")) + assertTrue(result.contains("org.gradle.toolchains.foojay-resolver-convention")) assertTrue(result.contains("com.fueledbycaffeine.spotlight")) assertTrue(result.contains("1.4.1")) } + + @Test + fun `does not include spotlight when additionalSettingsPlugins is empty`() { + val versions = Versions(additionalSettingsPlugins = emptyList()) + + val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject") + + assertFalse( + result.contains("spotlight") || result.contains("com.fueledbycaffeine.spotlight"), + "settings.gradle.kts should not contain Spotlight when additionalSettingsPlugins is empty" + ) + } } diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt index 55a30eff..14b40296 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ConventionPluginWriterTest.kt @@ -8,6 +8,7 @@ import io.github.cdsap.projectgenerator.generator.plugins.android.CompositeBuild import io.github.cdsap.projectgenerator.generator.plugins.jvm.CompositeBuildJvmLib import io.github.cdsap.projectgenerator.model.Android import io.github.cdsap.projectgenerator.model.LanguageAttributes +import io.github.cdsap.projectgenerator.model.Project import io.github.cdsap.projectgenerator.model.TypeProjectRequested import io.github.cdsap.projectgenerator.model.Versions import org.junit.jupiter.api.Assertions.assertEquals @@ -74,6 +75,50 @@ class ConventionPluginWriterTest { } } + + @Test + fun `android convention plugins configure kotlin and java toolchains for requested jdk`() { + val versions = Versions(project = Project(jdk = "23")) + val projectName = "androidJdk23" + val language = LanguageAttributes(projectName = "${tempDir.path}/$projectName", extension = "gradle.kts") + val writer = ConventionPluginWriter( + languages = listOf(language), + versions = versions, + requested = TypeProjectRequested.ANDROID + ) + + writer.write() + + val appPluginFile = File("${language.projectName}/build-logic/convention/src/main/kotlin/com/logic/CompositeBuildPluginAndroidApp.kt") + val libPluginFile = File("${language.projectName}/build-logic/convention/src/main/kotlin/com/logic/CompositeBuildPluginAndroidLib.kt") + + val appContent = appPluginFile.readText() + assertTrue(appContent.contains("jvmToolchain(23)")) + assertTrue(appContent.contains("JavaLanguageVersion.of(23)")) + + val libContent = libPluginFile.readText() + assertTrue(libContent.contains("jvmToolchain(23)")) + assertTrue(libContent.contains("JavaLanguageVersion.of(23)")) + } + + @Test + fun `jvm convention plugin configures kotlin and java toolchains for requested jdk`() { + val versions = Versions(project = Project(jdk = "23")) + val projectName = "jvmJdk23" + val language = LanguageAttributes(projectName = "${tempDir.path}/$projectName", extension = "gradle.kts") + val writer = ConventionPluginWriter( + languages = listOf(language), + versions = versions, + requested = TypeProjectRequested.JVM + ) + + writer.write() + + val jvmLibPluginFile = File("${language.projectName}/build-logic/convention/src/main/kotlin/com/logic/PluginJvmLib.kt") + val jvmContent = jvmLibPluginFile.readText() + assertTrue(jvmContent.contains("jvmToolchain(23)")) + assertTrue(jvmContent.contains("JavaLanguageVersion.of(23)")) + } @Test fun `write should create convention plugins for multiple JVM projects`() { val projectNames = listOf("multiJvm1", "multiJvm2") diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt index 3ddb10ff..d4a801ba 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt @@ -228,6 +228,10 @@ class ProjectWriterTest { !settingsContent.contains("spotlight") && !settingsContent.contains("com.fueledbycaffeine.spotlight"), "settings.gradle.kts should not contain Spotlight plugin when additionalSettingsPlugins is empty, but contained: $settingsContent" ) + assertTrue( + settingsContent.contains("org.gradle.toolchains.foojay-resolver-convention"), + "settings.gradle.kts should contain the Foojay toolchain resolver plugin, but contained: $settingsContent" + ) val buildFile = File("${language.projectName}/build.gradle.kts") assertTrue(buildFile.exists(), "Expected build.gradle.kts to exist") From 83df0ebec972b64ac8dabc749d48236efe812beb Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 19 Mar 2026 13:54:14 -0700 Subject: [PATCH 2/3] org.gradle.toolchains.foojay-resolver-convention is now part of the default additionalSettingsPlugins --- .../rootproject/SettingsGradleTest.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt index a647e4f2..8ea01176 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradleTest.kt @@ -9,17 +9,20 @@ import org.junit.jupiter.api.Test class SettingsGradleTest { @Test - fun `includes toolchain resolver plugin when additionalSettingsPlugins is empty and develocity is false`() { - val versions = Versions(additionalSettingsPlugins = emptyList()) - val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject") + fun `includes default settings plugins when using default versions`() { + val result = SettingsGradle().get(Versions(), develocity = false, projectName = "testProject") assertTrue( result.contains("plugins {"), - "settings.gradle.kts should contain a plugins block for toolchain provisioning" + "settings.gradle.kts should contain a plugins block when default settings plugins are configured" ) assertTrue( result.contains("org.gradle.toolchains.foojay-resolver-convention"), - "settings.gradle.kts should include the Foojay toolchain resolver plugin" + "settings.gradle.kts should include the Foojay toolchain resolver plugin by default" + ) + assertTrue( + result.contains("com.fueledbycaffeine.spotlight"), + "settings.gradle.kts should include Spotlight by default" ) } @@ -27,6 +30,7 @@ class SettingsGradleTest { fun `includes settings plugins when additionalSettingsPlugins is provided`() { val versions = Versions( additionalSettingsPlugins = listOf( + AdditionalPlugin("org.gradle.toolchains.foojay-resolver-convention", "1.0.0"), AdditionalPlugin("com.fueledbycaffeine.spotlight", "1.4.1") ) ) @@ -39,11 +43,15 @@ class SettingsGradleTest { } @Test - fun `does not include spotlight when additionalSettingsPlugins is empty`() { + fun `does not include foojay or spotlight when additionalSettingsPlugins is empty`() { val versions = Versions(additionalSettingsPlugins = emptyList()) val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject") + assertFalse( + result.contains("org.gradle.toolchains.foojay-resolver-convention"), + "settings.gradle.kts should not contain Foojay when additionalSettingsPlugins is empty" + ) assertFalse( result.contains("spotlight") || result.contains("com.fueledbycaffeine.spotlight"), "settings.gradle.kts should not contain Spotlight when additionalSettingsPlugins is empty" From 4b2c10f6aaf7bfd5a0cbb1cd9ebb78ad6d56d062 Mon Sep 17 00:00:00 2001 From: Inaki Villar Date: Thu, 19 Mar 2026 13:58:23 -0700 Subject: [PATCH 3/3] in Versions.kt, and SettingsGradle.kt now just renders whatever is in versions.additionalSettingsPlugins --- .../generator/rootproject/SettingsGradle.kt | 1 - .../cdsap/projectgenerator/model/Versions.kt | 4 ++ .../writer/ProjectWriterTest.kt | 37 ++++++++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt index 89d61897..a9fcdb56 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/rootproject/SettingsGradle.kt @@ -6,7 +6,6 @@ class SettingsGradle { fun get(versions: Versions, develocity: Boolean, projectName: String): String { val pluginLines = buildList { - add("""id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"""") if (develocity) { add("""id("com.gradle.develocity") version "${versions.project.develocity}"""") add("""id("com.gradle.common-custom-user-data-gradle-plugin") version "${versions.project.ccud}"""") diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt index 249e9a63..35af8598 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/Versions.kt @@ -15,6 +15,10 @@ data class Versions( ) ), val additionalSettingsPlugins: List = listOf( + AdditionalPlugin( + "org.gradle.toolchains.foojay-resolver-convention", + "1.0.0" + ), AdditionalPlugin( "com.fueledbycaffeine.spotlight", "1.4.1" diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt index d4a801ba..7ef8ec33 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/writer/ProjectWriterTest.kt @@ -197,6 +197,39 @@ class ProjectWriterTest { } } + @Test + fun `includes default settings plugins in generated project`() { + val nodes = listOf( + ProjectGraph("module_1_1", 1, emptyList(), TypeProject.ANDROID_APP, 10), + ) + val language = LanguageAttributes("gradle.kts", "${tempDir}/project_default_settings_plugins") + val projectWriter = ProjectWriter( + nodes, + listOf(language), + Versions(), + TypeProjectRequested.ANDROID, + TypeOfStringResources.NORMAL, + false, + GradleWrapper(LATEST_GRADLE), + false, + "default_settings_plugins_project" + ) + + projectWriter.write() + + val settingsFile = File("${language.projectName}/settings.gradle.kts") + assertTrue(settingsFile.exists(), "Expected settings.gradle.kts to exist") + val settingsContent = settingsFile.readText() + assertTrue( + settingsContent.contains("org.gradle.toolchains.foojay-resolver-convention"), + "settings.gradle.kts should contain the Foojay toolchain resolver plugin by default, but contained: $settingsContent" + ) + assertTrue( + settingsContent.contains("com.fueledbycaffeine.spotlight"), + "settings.gradle.kts should contain Spotlight by default, but contained: $settingsContent" + ) + } + @Test fun `does not include settings or build plugins when additionalSettingsPlugins and additionalBuildGradleRootPlugins are empty`() { val nodes = listOf( @@ -229,8 +262,8 @@ class ProjectWriterTest { "settings.gradle.kts should not contain Spotlight plugin when additionalSettingsPlugins is empty, but contained: $settingsContent" ) assertTrue( - settingsContent.contains("org.gradle.toolchains.foojay-resolver-convention"), - "settings.gradle.kts should contain the Foojay toolchain resolver plugin, but contained: $settingsContent" + !settingsContent.contains("org.gradle.toolchains.foojay-resolver-convention"), + "settings.gradle.kts should not contain the Foojay toolchain resolver plugin when additionalSettingsPlugins is empty, but contained: $settingsContent" ) val buildFile = File("${language.projectName}/build.gradle.kts")