Skip to content

Commit

Permalink
test(analysis): improve merge filter cov #3483
Browse files Browse the repository at this point in the history
  • Loading branch information
BenediktMehl committed Feb 19, 2025
1 parent bf4ad53 commit dca5d4d
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import de.maibornwolff.codecharta.serialization.ProjectDeserializer
import de.maibornwolff.codecharta.serialization.ProjectSerializer
import de.maibornwolff.codecharta.tools.interactiveparser.InteractiveParser
import de.maibornwolff.codecharta.tools.interactiveparser.ParserDialogInterface
import de.maibornwolff.codecharta.tools.interactiveparser.startSession
import de.maibornwolff.codecharta.tools.interactiveparser.util.CodeChartaConstants
import de.maibornwolff.codecharta.util.InputHelper
import de.maibornwolff.codecharta.util.Logger
Expand Down Expand Up @@ -121,7 +122,7 @@ class MergeFilter(
if (!hasTopLevelOverlap(projects)) {
printOverlapError(projects)

val continueMerge = askForceMerge()
val continueMerge = startSession { askForceMerge(this) }

if (!continueMerge) {
Logger.info { "Merge cancelled by the user." }
Expand Down Expand Up @@ -159,7 +160,7 @@ class MergeFilter(
val confirmedFileList = if (exactMatch) {
files
} else {
requestMimoFileSelection(files)
startSession { requestMimoFileSelection(this, files) }
}
if (confirmedFileList.size <= 1) {
Logger.info { "Continue with next group, because one or less files were selected" }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import de.maibornwolff.codecharta.tools.inquirer.myPromptInputNumber
import de.maibornwolff.codecharta.tools.inquirer.myPromptList
import de.maibornwolff.codecharta.tools.inquirer.util.InputValidator
import de.maibornwolff.codecharta.tools.interactiveparser.ParserDialogInterface
import de.maibornwolff.codecharta.tools.interactiveparser.startSession
import java.io.File

class ParserDialog {
Expand Down Expand Up @@ -123,37 +122,31 @@ class ParserDialog {
return basicMergeConfig
}

fun askForceMerge(): Boolean {
return startSession {
myPromptConfirm(
message = "Do you still want to merge non-overlapping at the top-level nodes?",
onInputReady = testCallback()
)
}
fun askForceMerge(session: Session): Boolean {
return session.myPromptConfirm(
message = "Do you still want to merge non-overlapping at the top-level nodes?",
onInputReady = testCallback()
)
}

fun askForMimoPrefix(prefixOptions: Set<String>): String {
return startSession {
myPromptList(
message = "Which prefix should be used for the output file?",
choices = prefixOptions.toList(),
onInputReady = testCallback()
)
}
fun askForMimoPrefix(session: Session, prefixOptions: Set<String>): String {
return session.myPromptList(
message = "Which prefix should be used for the output file?",
choices = prefixOptions.toList(),
onInputReady = testCallback()
)
}

fun requestMimoFileSelection(files: List<File>): List<File> {
return startSession {
val fileNameList = files.map { it.name }
val choiceList: List<String> = myPromptCheckbox(
message = "",
choices = fileNameList,
hint = "Not selected files will not get merged",
allowEmptyInput = true,
onInputReady = testCallback()
)
files.filter { choiceList.contains(it.name) }
}
fun requestMimoFileSelection(session: Session, files: List<File>): List<File> {
val fileNameList = files.map { it.name }
val choiceList: List<String> = session.myPromptCheckbox(
message = "",
choices = fileNameList,
hint = "Not selected files will not get merged",
allowEmptyInput = true,
onInputReady = testCallback()
)
return files.filter { choiceList.contains(it.name) }
}

internal fun testCallback(): suspend RunScope.() -> Unit = {}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package de.maibornwolff.codecharta.filter.mergefilter.mimo

import de.maibornwolff.codecharta.filter.mergefilter.ParserDialog
import de.maibornwolff.codecharta.tools.interactiveparser.startSession
import de.maibornwolff.codecharta.util.Logger
import java.io.File

Expand Down Expand Up @@ -54,7 +55,7 @@ class Mimo {
fun retrieveGroupName(files: List<String>): String {
val filePrefixes = files.map { it.substringBefore(".") }.toSet()
if (filePrefixes.size == 1) return filePrefixes.first()
return ParserDialog.askForMimoPrefix(filePrefixes)
return startSession { ParserDialog.askForMimoPrefix(this, filePrefixes) }
}

private fun levenshteinDistance(lhs: CharSequence, rhs: CharSequence): Int {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
package de.maibornwolff.codecharta.filter.mergefilter

import com.varabyte.kotter.runtime.Session
import com.varabyte.kotterx.test.foundation.testSession
import de.maibornwolff.codecharta.filter.mergefilter.MergeFilter.Companion.main
import de.maibornwolff.codecharta.serialization.ProjectDeserializer
import de.maibornwolff.codecharta.tools.interactiveparser.startSession
import io.mockk.every
import io.mockk.mockkObject
import io.mockk.mockkStatic
import io.mockk.unmockkAll
import org.assertj.core.api.Assertions.assertThat
import org.junit.jupiter.api.AfterEach
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Nested
import org.junit.jupiter.api.Test
Expand All @@ -21,6 +26,11 @@ class MergeFilterTest {
val errContent = ByteArrayOutputStream()
val originalErr: PrintStream = System.err

@BeforeEach
fun beforeTest() {
mockStartSession()
}

@AfterEach
fun unmockEverything() {
unmockkAll()
Expand Down Expand Up @@ -133,7 +143,7 @@ class MergeFilterTest {
@Test
fun `should warn if no top-level overlap and ask user to force merge`() {
mockkObject(ParserDialog)
every { ParserDialog.askForceMerge() } returns true
every { ParserDialog.askForceMerge(any()) } returns true

setStreams()
CommandLine(MergeFilter()).execute(
Expand All @@ -154,7 +164,7 @@ class MergeFilterTest {
fun `should cancel merge if no top-level overlap and user declines force merge`() {
mockkObject(ParserDialog)
every {
ParserDialog.askForceMerge()
ParserDialog.askForceMerge(any())
} returns false

setStreams()
Expand Down Expand Up @@ -265,7 +275,7 @@ class MergeFilterTest {
val testFile2 = File(testProjectPathB)

mockkObject(ParserDialog)
every { ParserDialog.requestMimoFileSelection(any()) } returns listOf(testFile1, testFile2)
every { ParserDialog.requestMimoFileSelection(any(), any()) } returns listOf(testFile1, testFile2)

setStreams()
CommandLine(MergeFilter()).execute(
Expand Down Expand Up @@ -294,7 +304,7 @@ class MergeFilterTest {
val testFile1 = File(testProjectPathA)

mockkObject(ParserDialog)
every { ParserDialog.requestMimoFileSelection(any()) } returns listOf(testFile1)
every { ParserDialog.requestMimoFileSelection(any(), any()) } returns listOf(testFile1)

setStreams()
CommandLine(MergeFilter()).execute(
Expand Down Expand Up @@ -355,7 +365,7 @@ class MergeFilterTest {
@Test
fun `should warn if no top-level overlap for mimo merged files and skip merge`() {
mockkObject(ParserDialog)
every { ParserDialog.askForceMerge() } returns false
every { ParserDialog.askForceMerge(any()) } returns false

setStreams()
CommandLine(MergeFilter()).execute(
Expand All @@ -371,7 +381,7 @@ class MergeFilterTest {
@Test
fun `should not warn if no top-level overlap for mimo and merge`() {
mockkObject(ParserDialog)
every { ParserDialog.askForceMerge() } returns false
every { ParserDialog.askForceMerge(any()) } returns false

setStreams()
CommandLine(MergeFilter()).execute(
Expand Down Expand Up @@ -407,8 +417,8 @@ class MergeFilterTest {
val prefixTestFile3 = "testProjectX"

mockkObject(ParserDialog)
every { ParserDialog.askForMimoPrefix(any()) } returns prefixTestFile3
every { ParserDialog.requestMimoFileSelection(any()) } returns listOf(testFile1, testFile2, testFile3)
every { ParserDialog.askForMimoPrefix(any(), any()) } returns prefixTestFile3
every { ParserDialog.requestMimoFileSelection(any(), any()) } returns listOf(testFile1, testFile2, testFile3)

setStreams()
CommandLine(MergeFilter()).execute(
Expand Down Expand Up @@ -602,4 +612,19 @@ class MergeFilterTest {
).contains("Input project structure doesn't have '/root/' as a base folder. If that's intended open an issue.")
}
}

private fun mockStartSession() {
mockkStatic("de.maibornwolff.codecharta.tools.interactiveparser.ParserDialogInterfaceKt")
every { startSession(any<Session.() -> Any>()) } answers {
startTestSession { firstArg<Session.() -> Any>()(this) }
}
}

private fun <T> startTestSession(block: Session.() -> T): T {
var returnValue: T? = null
testSession {
returnValue = block()
}
return returnValue ?: throw IllegalStateException("Session did not return a value.")
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.varabyte.kotter.runtime.terminal.inmemory.press
import com.varabyte.kotter.runtime.terminal.inmemory.type
import com.varabyte.kotterx.test.foundation.testSession
import de.maibornwolff.codecharta.filter.mergefilter.ParserDialog.Companion.collectParserArgs
import de.maibornwolff.codecharta.filter.mergefilter.ParserDialog.Companion.testCallback
import io.mockk.every
import io.mockk.mockkObject
import io.mockk.unmockkAll
Expand Down Expand Up @@ -341,4 +342,55 @@ class ParserDialogTest {
assertThat(parseResult.matchedPositional(0).getValue<Array<File>>()[0].path).isEqualTo(inputFolderPath.toString())
assertThat(parseResult.matchedOption("output-file").getValue<String>()).isEqualTo(outputFileName)
}

@Test
fun `should prompt for force merge`() {
var result = false

testSession { terminal ->
every { testCallback() } returns {
terminal.press(Keys.ENTER)
}

result = ParserDialog.askForceMerge(this)
}

assertThat(result).isTrue()
}

@Test
fun `should prompt for Mimo prefix`() {
val prefixOptions = setOf("prefix1", "prefix2")
var result = ""

testSession { terminal ->
every { testCallback() } returns {
terminal.press(Keys.DOWN)
terminal.press(Keys.ENTER)
}

result = ParserDialog.askForMimoPrefix(this, prefixOptions)
}

assertThat(result).isEqualTo("prefix2")
}

@Test
fun `should prompt for Mimo file selection`() {
val files = listOf(File("file1"), File("file2"))

var result = emptyList<File>()

testSession { terminal ->
every { testCallback() } returns {
terminal.press(Keys.DOWN)
terminal.press(Keys.SPACE)
terminal.press(Keys.ENTER)
}

result = ParserDialog.requestMimoFileSelection(this, files)
}

assertThat(result).containsExactly(File("file2"))
}
}

0 comments on commit dca5d4d

Please sign in to comment.