diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt index da8ecd55..26ca223b 100644 --- a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectRequest.kt @@ -4,7 +4,6 @@ import io.github.cdsap.projectgenerator.ProjectGenerator import io.github.cdsap.projectgenerator.model.ClassesPerModule import io.github.cdsap.projectgenerator.model.Gradle import io.github.cdsap.projectgenerator.model.Language -import io.github.cdsap.projectgenerator.model.ProjectLayout import io.github.cdsap.projectgenerator.model.Shape import io.github.cdsap.projectgenerator.model.TypeOfStringResources import io.github.cdsap.projectgenerator.model.TypeProjectRequested @@ -85,7 +84,11 @@ data class GenerateProjectRequest( layers = layers, generateUnitTest = generateUnitTest, gradle = VersionsResolver.resolveGradle(cliGradle, versionsFile), - projectRootPath = ProjectLayout.defaultRootPath(outputDir, language, resolvedProjectName), + projectRootPath = ProjectOutputPathResolver.defaultRootPath( + outputDir, + language, + resolvedProjectName + ), develocity = resolveDevelocityEnabled(develocityFlag, versionsOverrides.develocityUrl), projectName = resolvedProjectName ) diff --git a/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/ProjectOutputPathResolver.kt b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/ProjectOutputPathResolver.kt new file mode 100644 index 00000000..2ffc86d9 --- /dev/null +++ b/cli/src/main/kotlin/io/github/cdsap/projectgenerator/cli/ProjectOutputPathResolver.kt @@ -0,0 +1,17 @@ +package io.github.cdsap.projectgenerator.cli + +import io.github.cdsap.projectgenerator.model.Language + +object ProjectOutputPathResolver { + fun defaultRootPath(outputDir: String?, language: Language, projectName: String): String { + return if (outputDir != null) { + outputDir + } else { + when (language) { + Language.KTS -> "projects_generated/$projectName/project_kts" + Language.GROOVY -> "projects_generated/$projectName/project_groovy" + Language.BOTH -> "projects_generated/$projectName" + } + } + } +} diff --git a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt index e6c3eae7..c52c38de 100644 --- a/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt +++ b/cli/src/test/kotlin/io/github/cdsap/projectgenerator/cli/GenerateProjectsCliTest.kt @@ -7,7 +7,6 @@ import io.github.cdsap.projectgenerator.model.ClassesPerModuleType import io.github.cdsap.projectgenerator.model.DependencyInjection import io.github.cdsap.projectgenerator.model.Gradle import io.github.cdsap.projectgenerator.model.Language -import io.github.cdsap.projectgenerator.model.ProjectLayout import io.github.cdsap.projectgenerator.model.Shape import io.github.cdsap.projectgenerator.model.TypeOfStringResources import io.github.cdsap.projectgenerator.model.TypeProjectRequested @@ -137,25 +136,46 @@ class GenerateProjectsCliTest { @Test fun `default output path for kts nests project name and project_kts`() { - val resolved = ProjectLayout.defaultRootPath(null, Language.KTS, "sample") + val resolved = ProjectOutputPathResolver.defaultRootPath(null, Language.KTS, "sample") assertEquals("projects_generated/sample/project_kts", resolved) } @Test - fun `output dir is used directly for single language projects`() { - val resolved = ProjectLayout.defaultRootPath(".", Language.KTS, "sample") + fun `default output path for groovy nests project name and project_groovy`() { + val resolved = ProjectOutputPathResolver.defaultRootPath(null, Language.GROOVY, "sample") - assertEquals(".", resolved) + assertEquals("projects_generated/sample/project_groovy", resolved) } @Test fun `default output path for both languages nests project name only`() { - val resolved = ProjectLayout.defaultRootPath(null, Language.BOTH, "sample") + val resolved = ProjectOutputPathResolver.defaultRootPath(null, Language.BOTH, "sample") assertEquals("projects_generated/sample", resolved) } + @Test + fun `output dir is used directly for kts`() { + val resolved = ProjectOutputPathResolver.defaultRootPath(".", Language.KTS, "sample") + + assertEquals(".", resolved) + } + + @Test + fun `output dir is used directly for groovy`() { + val resolved = ProjectOutputPathResolver.defaultRootPath("/tmp/out", Language.GROOVY, "sample") + + assertEquals("/tmp/out", resolved) + } + + @Test + fun `output dir is used directly for both languages`() { + val resolved = ProjectOutputPathResolver.defaultRootPath("/tmp/out", Language.BOTH, "sample") + + assertEquals("/tmp/out", resolved) + } + @Test fun `develocity url enables develocity when develocity flag is absent`() { val request = GenerateProjectRequest.resolve( @@ -216,4 +236,53 @@ class GenerateProjectsCliTest { assertEquals("jvmTriangle12modules", request.projectName) assertEquals("projects_generated/jvmTriangle12modules/project_kts", request.projectRootPath) } + + @Test + fun `resolve nests groovy default root path under project_groovy`() { + val request = resolveRequest(language = Language.GROOVY, outputDir = null, projectName = "sample") + + assertEquals("projects_generated/sample/project_groovy", request.projectRootPath) + } + + @Test + fun `resolve nests both-languages default root path under project name only`() { + val request = resolveRequest(language = Language.BOTH, outputDir = null, projectName = "sample") + + assertEquals("projects_generated/sample", request.projectRootPath) + } + + @Test + fun `resolve uses explicit output dir for any language`() { + val request = resolveRequest(language = Language.BOTH, outputDir = "/tmp/out", projectName = "sample") + + assertEquals("/tmp/out", request.projectRootPath) + } + + private fun resolveRequest( + language: Language, + outputDir: String?, + projectName: String? + ): GenerateProjectRequest { + return GenerateProjectRequest.resolve( + modules = 6, + shape = Shape.RECTANGLE, + language = language, + typeOfProjectRequested = TypeProjectRequested.JVM, + classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 10), + typeOfStringResources = TypeOfStringResources.NORMAL, + layers = 5, + generateUnitTest = false, + cliGradle = null, + develocityFlag = false, + versionsFile = null, + outputDir = outputDir, + projectName = projectName, + versionsOverrides = VersionsOverrides( + dependencyInjection = DependencyInjection.HILT, + develocityUrl = null, + roomDatabase = false, + kotlinMultiplatformLibrary = false + ) + ) + } } diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayout.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayout.kt index 272f1e17..3baf32c8 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayout.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayout.kt @@ -1,18 +1,6 @@ package io.github.cdsap.projectgenerator.model object ProjectLayout { - fun defaultRootPath(outputDir: String?, language: Language, projectName: String): String { - return if (outputDir != null) { - outputDir - } else { - when (language) { - Language.KTS -> "projects_generated/$projectName/project_kts" - Language.GROOVY -> "projects_generated/$projectName/project_groovy" - Language.BOTH -> "projects_generated/$projectName" - } - } - } - fun languageAttributes(rootPath: String, language: Language): List { return when (language) { Language.KTS -> listOf( diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayoutTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayoutTest.kt index e4c86930..4b0d378c 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayoutTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/model/ProjectLayoutTest.kt @@ -5,48 +5,6 @@ import org.junit.jupiter.api.Test class ProjectLayoutTest { - @Test - fun `default root path for kts nests project name and project_kts`() { - val resolved = ProjectLayout.defaultRootPath(null, Language.KTS, "sample") - - assertEquals("projects_generated/sample/project_kts", resolved) - } - - @Test - fun `default root path for groovy nests project name and project_groovy`() { - val resolved = ProjectLayout.defaultRootPath(null, Language.GROOVY, "sample") - - assertEquals("projects_generated/sample/project_groovy", resolved) - } - - @Test - fun `default root path for both languages nests project name only`() { - val resolved = ProjectLayout.defaultRootPath(null, Language.BOTH, "sample") - - assertEquals("projects_generated/sample", resolved) - } - - @Test - fun `output dir is used directly for kts`() { - val resolved = ProjectLayout.defaultRootPath(".", Language.KTS, "sample") - - assertEquals(".", resolved) - } - - @Test - fun `output dir is used directly for groovy`() { - val resolved = ProjectLayout.defaultRootPath("/tmp/out", Language.GROOVY, "sample") - - assertEquals("/tmp/out", resolved) - } - - @Test - fun `output dir is used directly for both languages`() { - val resolved = ProjectLayout.defaultRootPath("/tmp/out", Language.BOTH, "sample") - - assertEquals("/tmp/out", resolved) - } - @Test fun `language attributes for kts use root path directly`() { val attributes = ProjectLayout.languageAttributes("/tmp/project", Language.KTS)