Skip to content

Commit 1e18908

Browse files
committed
Moved extractCodeBlockLanguage to TextUtils and added test cases
1 parent 20237b1 commit 1e18908

File tree

3 files changed

+64
-18
lines changed
  • plugins
    • amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/messenger
    • core

3 files changed

+64
-18
lines changed

plugins/amazonq/chat/jetbrains-community/src/software/aws/toolkits/jetbrains/services/cwc/controller/chat/messenger/ChatPromptHandler.kt

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import kotlinx.coroutines.flow.onStart
1111
import software.amazon.awssdk.awscore.exception.AwsServiceException
1212
import software.amazon.awssdk.services.codewhispererstreaming.model.CodeWhispererStreamingException
1313
import software.aws.toolkits.core.utils.convertMarkdownToHTML
14+
import software.aws.toolkits.core.utils.extractCodeBlockLanguage
1415
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.exceptions.ChatApiException
1516
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatRequestData
1617
import software.aws.toolkits.jetbrains.services.cwc.clients.chat.model.ChatResponseEvent
@@ -145,24 +146,6 @@ class ChatPromptHandler(private val telemetryHelper: TelemetryHelper) {
145146
}
146147
}
147148

148-
private fun extractCodeBlockLanguage(message: String): String {
149-
// This fulfills both the cases of unit test generation(java, python) and general use case(Non java and Non python) languages.
150-
val codeBlockStart = message.indexOf("```")
151-
if (codeBlockStart == -1) {
152-
return defaultTestGenResponseLanguage
153-
}
154-
155-
val languageStart = codeBlockStart + 3
156-
val languageEnd = message.indexOf('\n', languageStart)
157-
158-
if (languageEnd == -1) {
159-
return defaultTestGenResponseLanguage
160-
}
161-
162-
val language = message.substring(languageStart, languageEnd).trim()
163-
return if (language.isNotEmpty()) language else defaultTestGenResponseLanguage
164-
}
165-
166149
private fun processChatEvent(
167150
tabId: String,
168151
triggerId: String,

plugins/core/core/src/software/aws/toolkits/core/utils/TextUtils.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,24 @@ fun convertMarkdownToHTML(markdown: String): String {
1717
return htmlRenderer.render(document)
1818
}
1919

20+
fun extractCodeBlockLanguage(message: String): String {
21+
// This fulfills both the cases of unit test generation(java, python) and general use case(Non java and Non python) languages.
22+
val defaultTestGenResponseLanguage: String = "plaintext"
23+
val codeBlockStart = message.indexOf("```")
24+
if (codeBlockStart == -1) {
25+
return defaultTestGenResponseLanguage
26+
}
27+
28+
val languageStart = codeBlockStart + 3
29+
val languageEnd = message.indexOf('\n', languageStart)
30+
31+
if (languageEnd == -1) {
32+
return defaultTestGenResponseLanguage
33+
}
34+
35+
return message.substring(languageStart, languageEnd).trim().ifEmpty { defaultTestGenResponseLanguage }
36+
}
37+
2038
class CodeBlockRenderer(private val html: HtmlWriter) : NodeRenderer {
2139
override fun getNodeTypes(): Set<Class<out Node>> = setOf(FencedCodeBlock::class.java)
2240
override fun render(node: Node?) {

plugins/core/jetbrains-community/tst/software/aws/toolkits/jetbrains/utils/TextUtilsTest.kt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@ import org.intellij.lang.annotations.Language
1111
import org.junit.Rule
1212
import org.junit.Test
1313
import software.aws.toolkits.core.utils.convertMarkdownToHTML
14+
import software.aws.toolkits.core.utils.extractCodeBlockLanguage
1415

1516
class TextUtilsTest {
1617
@Rule
1718
@JvmField
1819
val projectRule = ProjectRule()
1920

21+
private val defaultTestGenResponseLanguage = "plaintext"
22+
2023
@Test
2124
fun textGetsFormatted() {
2225
@Language("JSON")
@@ -155,4 +158,46 @@ class TextUtilsTest {
155158
val actual = applyPatch(inputPatch, fileContent, inputFilePath)
156159
assertThat(actual).isEqualTo("dummy\ndummy\ndummy\ndummy\nfirst line\nthird line\nforth line")
157160
}
161+
162+
@Test
163+
fun `extractCodeBlockLanguage returns default when no code block is present`() {
164+
val message = "This is a message without a code block"
165+
assertThat(defaultTestGenResponseLanguage).isEqualTo(extractCodeBlockLanguage(message))
166+
}
167+
168+
@Test
169+
fun `extractCodeBlockLanguage returns language when code block with language is present`() {
170+
val message = "Here's a code block:\n```kotlin\nval x = 5\n```"
171+
assertThat("kotlin").isEqualTo(extractCodeBlockLanguage(message))
172+
}
173+
174+
@Test
175+
fun `extractCodeBlockLanguage returns default when code block has no language specified`() {
176+
val message = "Here's a code block:\n```\nval x = 5\n```"
177+
assertThat(defaultTestGenResponseLanguage).isEqualTo(extractCodeBlockLanguage(message))
178+
}
179+
180+
@Test
181+
fun `extractCodeBlockLanguage returns language when multiple code blocks are present`() {
182+
val message = "First block:\n```java\nint x = 5;\n```\nSecond block:\n```python\nx = 5\n```"
183+
assertThat("java").isEqualTo(extractCodeBlockLanguage(message))
184+
}
185+
186+
@Test
187+
fun `extractCodeBlockLanguage returns default when code block is not closed`() {
188+
val message = "Incomplete code block:\n```kotlin\nval x = 5"
189+
assertThat("kotlin").isEqualTo(extractCodeBlockLanguage(message))
190+
}
191+
192+
@Test
193+
fun `extractCodeBlockLanguage trims whitespace from language`() {
194+
val message = "Code block with spaces:\n``` kotlin \nval x = 5\n```"
195+
assertThat("kotlin").isEqualTo(extractCodeBlockLanguage(message))
196+
}
197+
198+
@Test
199+
fun `extractCodeBlockLanguage handles empty message`() {
200+
val message = ""
201+
assertThat(defaultTestGenResponseLanguage).isEqualTo(extractCodeBlockLanguage(message))
202+
}
158203
}

0 commit comments

Comments
 (0)