diff --git a/cocoa-core/src/main/kotlin/cc/unitmesh/cf/core/parser/MarkdownCode.kt b/cocoa-core/src/main/kotlin/cc/unitmesh/cf/core/parser/MarkdownCode.kt index 2cddb688..4e9f601b 100644 --- a/cocoa-core/src/main/kotlin/cc/unitmesh/cf/core/parser/MarkdownCode.kt +++ b/cocoa-core/src/main/kotlin/cc/unitmesh/cf/core/parser/MarkdownCode.kt @@ -1,6 +1,6 @@ package cc.unitmesh.cf.core.parser -class MarkdownCode(val language: String, val text: String, isComplete: Boolean = true) { +class MarkdownCode(val language: String, val text: String, val isComplete: Boolean = true) { companion object { fun parse(content: String): MarkdownCode { val regex = Regex("```([\\w#+]*)") @@ -45,7 +45,12 @@ class MarkdownCode(val language: String, val text: String, isComplete: Boolean = } if (!codeClosed) { - return MarkdownCode(languageId ?: "", codeBuilder.toString(), false) + val text = codeBuilder.toString() + if (text.isBlank()) { + return MarkdownCode(languageId ?: "", content, true) + } + + return MarkdownCode(languageId ?: "", text, false) } val trimmedCode = codeBuilder.substring(startIndex, endIndex + 1).toString() diff --git a/cocoa-core/src/test/kotlin/cc/unitmesh/cf/core/parser/MarkdownCodeTest.kt b/cocoa-core/src/test/kotlin/cc/unitmesh/cf/core/parser/MarkdownCodeTest.kt new file mode 100644 index 00000000..1d9f6fec --- /dev/null +++ b/cocoa-core/src/test/kotlin/cc/unitmesh/cf/core/parser/MarkdownCodeTest.kt @@ -0,0 +1,95 @@ +package cc.unitmesh.cf.core.parser; + +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +class MarkdownCodeTest { + + @Test + fun should_parseMarkdownCode_when_validContentProvided() { + // given + val content = """ + ```kotlin + val message = "Hello, World!" + println(message) + ``` + """.trimIndent() + + // when + val markdownCode = MarkdownCode.parse(content) + + // then + assertEquals("kotlin", markdownCode.language) + assertEquals("val message = \"Hello, World!\"\nprintln(message)", markdownCode.text) + } + + @Test + fun should_parseMarkdownCode_withEmptyLanguage_when_noLanguageSpecified() { + // given + val content = """ + ``` + val message = "Hello, World!" + println(message) + ``` + """.trimIndent() + + // when + val markdownCode = MarkdownCode.parse(content) + + // then + assertEquals("", markdownCode.language) + assertEquals("val message = \"Hello, World!\"\nprintln(message)", markdownCode.text) + } + + @Test + fun should_parseMarkdownCode_withIncompleteCode_when_codeNotClosed() { + // given + val content = """ + ```kotlin + val message = "Hello, World!" + println(message) + """.trimIndent() + + // when + val markdownCode = MarkdownCode.parse(content) + + // then + assertEquals("kotlin", markdownCode.language) + assertEquals("val message = \"Hello, World!\"\nprintln(message)\n", markdownCode.text) + assertEquals(false, markdownCode.isComplete) + } + + @Test + fun should_parseMarkdownCode_withTrimmedCode_when_codeHasLeadingAndTrailingWhitespace() { + // given + val content = """ + ```kotlin + val message = "Hello, World!" + println(message) + ``` + """.trimIndent() + + // when + val markdownCode = MarkdownCode.parse(content) + + // then + assertEquals("kotlin", markdownCode.language) + assertEquals("val message = \"Hello, World!\"\nprintln(message)", markdownCode.text) + } + + @Test + fun should_parseMarkdownCode_withTrimmedCode_when_codeHasLeadingAndTrailingWhitespaceAndNewLine() { + // given + val content = """ + val message = "Hello, World!" + println(message) + """.trimIndent() + + // when + val markdownCode = MarkdownCode.parse(content) + + // then + assertEquals("", markdownCode.language) + assertEquals("val message = \"Hello, World!\"\nprintln(message)", markdownCode.text) + } +} diff --git a/llm-modules/prompt-script/src/main/kotlin/cc/unitmesh/prompt/validate/CodeCompletionValidator.kt b/llm-modules/prompt-script/src/main/kotlin/cc/unitmesh/prompt/validate/CodeCompletionValidator.kt index 8a91961b..a314b800 100644 --- a/llm-modules/prompt-script/src/main/kotlin/cc/unitmesh/prompt/validate/CodeCompletionValidator.kt +++ b/llm-modules/prompt-script/src/main/kotlin/cc/unitmesh/prompt/validate/CodeCompletionValidator.kt @@ -34,6 +34,8 @@ class CodeCompletionValidator( val beforeCursorCode: String = JsonPath.parse(dataItem.toString()).read(selection) val fullCode = "$beforeCursorCode\n$afterCursorCode" + logger.info("code completion: $fullCode") + when (language) { "java" -> { val datastructures = try {