diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/Manifest.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/Manifest.kt index 3619d7aa..36a89221 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/Manifest.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/android/Manifest.kt @@ -26,7 +26,7 @@ class Manifest { } else { "" } - val composeActivityName = ".$name" + val composeActivityName = if (name.isBlank()) "android.app.Activity" else ".$name" val applicationName = ".MainApplication" """ diff --git a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroid.kt b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroid.kt index f9c73ab1..b2151ce3 100644 --- a/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroid.kt +++ b/project-generator/src/main/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroid.kt @@ -13,6 +13,12 @@ class ModuleClassPlannerAndroid : ModuleClassPlanner() var currentIndex = 1 @@ -20,7 +26,7 @@ class ModuleClassPlannerAndroid : ModuleClassPlanner -> - if (classes.size < maxClasses) { + if (classes.size < effectiveMaxClasses) { classes.add(ClassDefinitionAndroid(type = type, index = currentIndex++, dependencies = deps)) } } @@ -53,7 +59,7 @@ class ModuleClassPlannerAndroid : ModuleClassPlanner 0) { for (i in 1..remainingClasses) { val classType = when (i % 2) { diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/RoomManifestGenerationTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/RoomManifestGenerationTest.kt new file mode 100644 index 00000000..7bcbd3e8 --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/RoomManifestGenerationTest.kt @@ -0,0 +1,57 @@ +package io.github.cdsap.projectgenerator + +import io.github.cdsap.projectgenerator.model.Android +import io.github.cdsap.projectgenerator.model.ClassesPerModule +import io.github.cdsap.projectgenerator.model.ClassesPerModuleType +import io.github.cdsap.projectgenerator.model.Language +import io.github.cdsap.projectgenerator.model.Project +import io.github.cdsap.projectgenerator.model.Shape +import io.github.cdsap.projectgenerator.model.TypeOfStringResources +import io.github.cdsap.projectgenerator.model.TypeProjectRequested +import io.github.cdsap.projectgenerator.model.Versions +import io.github.cdsap.projectgenerator.writer.GradleWrapper +import org.junit.jupiter.api.Assertions.assertFalse +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path + +class RoomManifestGenerationTest { + @TempDir + lateinit var tempDir: Path + + @Test + fun `room project with default class count generates valid launcher activity name`() { + val projectName = "room_manifest_low_classes" + ProjectGenerator( + modules = 20, + shape = Shape.FLAT, + language = Language.KTS, + typeOfProjectRequested = TypeProjectRequested.ANDROID, + classesPerModule = ClassesPerModule(ClassesPerModuleType.FIXED, 5), + versions = Versions( + project = Project(jdk = "17"), + android = Android(roomDatabase = true) + ), + typeOfStringResources = TypeOfStringResources.NORMAL, + layers = 3, + generateUnitTest = false, + gradle = GradleWrapper(DefaultTestVersions.LATEST_GRADLE), + path = tempDir.toString(), + projectName = projectName + ).write() + + val projectDir = tempDir.resolve("$projectName/project_kts").toFile() + val manifest = projectDir.walkTopDown() + .firstOrNull { file -> + file.isFile && + file.name == "AndroidManifest.xml" && + file.readText().contains("android.intent.category.LAUNCHER") + } + ?: error("Could not find launcher manifest under ${projectDir.path}") + val manifestText = manifest.readText() + + assertFalse(manifestText.contains("android:name=\".\"")) + assertTrue(manifestText.contains("android:name=\".Activity")) + } +} diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/android/ManifestTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/android/ManifestTest.kt new file mode 100644 index 00000000..19a0aa5f --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/android/ManifestTest.kt @@ -0,0 +1,33 @@ +package io.github.cdsap.projectgenerator.generator.android + +import io.github.cdsap.projectgenerator.generator.classes.GenerateDictionaryAndroid +import io.github.cdsap.projectgenerator.model.TypeProject +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.CopyOnWriteArrayList + +class ManifestTest { + + @TempDir + lateinit var tempDir: Path + + @Test + fun `android app manifest falls back to valid activity name when dictionary has no activity`() { + val manifestDir = tempDir.resolve("feature").toFile() + val dictionary = ConcurrentHashMap>() + + Manifest().createManifest( + moduleFolder = manifestDir, + layer = 0, + module = "account", + moduleType = TypeProject.ANDROID_APP, + a = dictionary + ) + + val manifestText = manifestDir.resolve("AndroidManifest.xml").readText() + assertTrue(manifestText.contains("android:name=\"android.app.Activity\"")) + } +} diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidLegacyTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidLegacyTest.kt index bdd39577..49cccd4c 100644 --- a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidLegacyTest.kt +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidLegacyTest.kt @@ -1,16 +1,24 @@ package io.github.cdsap.projectgenerator.generator.planner +import io.github.cdsap.projectgenerator.NameMappings import io.github.cdsap.projectgenerator.model.ClassTypeAndroid import io.github.cdsap.projectgenerator.model.ProjectGraph import io.github.cdsap.projectgenerator.model.TypeProject import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test class ModuleClassPlannerAndroidLegacyTest { private val planner = ModuleClassPlannerAndroidLegacy() + @BeforeEach + fun resetNameMappings() { + NameMappings.layerNames = emptyMap() + NameMappings.moduleNames = emptyMap() + } + @Test fun `viewmodel dependency stays in same module when repository exists`() { val module = projectGraph(id = "module_0_20", classes = 12, nodes = listOf(projectGraph(id = "module_0_4", classes = 12))) diff --git a/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidTest.kt b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidTest.kt new file mode 100644 index 00000000..51fc0d52 --- /dev/null +++ b/project-generator/src/test/kotlin/io/github/cdsap/projectgenerator/generator/planner/ModuleClassPlannerAndroidTest.kt @@ -0,0 +1,31 @@ +package io.github.cdsap.projectgenerator.generator.planner + +import io.github.cdsap.projectgenerator.model.ClassTypeAndroid +import io.github.cdsap.projectgenerator.model.ProjectGraph +import io.github.cdsap.projectgenerator.model.TypeProject +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Test + +class ModuleClassPlannerAndroidTest { + + @Test + fun `app module with low class count still includes activity and baseline classes`() { + val planner = ModuleClassPlannerAndroid() + val module = ProjectGraph( + id = "module_2_9", + layer = 2, + nodes = emptyList(), + type = TypeProject.ANDROID_APP, + classes = 5 + ) + + val result = planner.planModuleClasses(module) + val types = result.classes.map { it.type } + + assertTrue(types.contains(ClassTypeAndroid.ACTIVITY)) + assertTrue(types.contains(ClassTypeAndroid.SCREEN)) + assertTrue(types.contains(ClassTypeAndroid.VIEWMODEL)) + assertEquals(10, result.classes.size) + } +}