Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ data class Versions(
)
),
val additionalSettingsPlugins: List<AdditionalPlugin> = listOf(
AdditionalPlugin(
"org.gradle.toolchains.foojay-resolver-convention",
"1.0.0"
),
AdditionalPlugin(
"com.fueledbycaffeine.spotlight",
"1.4.1"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,52 @@ import org.junit.jupiter.api.Test
class SettingsGradleTest {

@Test
fun `does not include plugins block 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")

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 when default settings plugins are configured"
)
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 by default"
)
assertTrue(
result.contains("com.fueledbycaffeine.spotlight"),
"settings.gradle.kts should include Spotlight by default"
)
}

@Test
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")
)
)
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"))
}
Comment on lines 30 to 43
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Foojay plugin will appear twice in the generated output

Because SettingsGradle.kt now hardcodes foojay unconditionally (line 9), and this test also adds foojay to additionalSettingsPlugins, the generated plugins {} block will contain two declarations for the same plugin:

plugins {
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
    id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"  // duplicate
    id("com.fueledbycaffeine.spotlight") version "1.4.1"
}

Gradle does not allow duplicate plugin declarations in a plugins {} block and will throw a build error. The foojay entry should be removed from additionalSettingsPlugins here since it is already injected by the implementation:

Suggested change
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")
)
)
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 `includes settings plugins when additionalSettingsPlugins is provided`() {
val versions = Versions(
additionalSettingsPlugins = listOf(
AdditionalPlugin("com.fueledbycaffeine.spotlight", "1.4.1")
)
)
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 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"
)
}
Comment on lines +46 to +59
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P0 Test will always fail — contradicts the production implementation

SettingsGradle.kt unconditionally adds the foojay plugin on line 9 (before any conditional logic), so result.contains("org.gradle.toolchains.foojay-resolver-convention") will always be true regardless of additionalSettingsPlugins. The assertFalse on line 51 will therefore always fail.

This is also directly contradicted by the new assertion added in ProjectWriterTest.kt (lines 231–234), which asserts foojay is present even when additionalSettingsPlugins = emptyList().

The test name and assertions need to be reconciled with the actual production behavior. The test should either:

  • Be updated to assert that foojay is always present (aligning with the implementation), or
  • The production code should be updated to only add foojay when it is explicitly included in additionalSettingsPlugins.
Suggested change
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"
)
}
@Test
fun `does not include spotlight when additionalSettingsPlugins is empty`() {
val versions = Versions(additionalSettingsPlugins = emptyList())
val result = SettingsGradle().get(versions, develocity = false, projectName = "testProject")
assertTrue(
result.contains("org.gradle.toolchains.foojay-resolver-convention"),
"settings.gradle.kts should always contain Foojay toolchain resolver"
)
assertFalse(
result.contains("spotlight") || result.contains("com.fueledbycaffeine.spotlight"),
"settings.gradle.kts should not contain Spotlight when additionalSettingsPlugins is empty"
)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -228,6 +261,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 not contain the Foojay toolchain resolver plugin when additionalSettingsPlugins is empty, but contained: $settingsContent"
)

val buildFile = File("${language.projectName}/build.gradle.kts")
assertTrue(buildFile.exists(), "Expected build.gradle.kts to exist")
Expand Down
Loading