package cc.unitmesh.devins.ui.compose.sketch
import cc.unitmesh.agent.parser.ToolCallParser
import kotlin.test.Test
import kotlin.test.assertEquals
import kotlin.test.assertTrue
class DevInBlockRendererTest {
private val parser = ToolCallParser()
@Test
fun `should parse simple read-file tool call from devin block`() {
val devinContent = """
/read-file
```json
{
"path": "mpp-viewer-web/src/commonMain/kotlin/cc/unitmesh/viewer/web/MermaidRenderer.kt"
}
```
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertEquals(1, toolCalls.size)
assertEquals("read-file", toolCalls[0].toolName)
assertEquals("mpp-viewer-web/src/commonMain/kotlin/cc/unitmesh/viewer/web/MermaidRenderer.kt",
toolCalls[0].params["path"])
}
@Test
fun `should parse read-file with key-value parameter`() {
val devinContent = """
/read-file path="config.yaml"
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertEquals(1, toolCalls.size)
assertEquals("read-file", toolCalls[0].toolName)
assertEquals("config.yaml", toolCalls[0].params["path"])
}
@Test
fun `should parse write-file with JSON parameters`() {
val devinContent = """
/write-file
```json
{
"path": "test.txt",
"content": "Hello, World!"
}
```
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertEquals(1, toolCalls.size)
assertEquals("write-file", toolCalls[0].toolName)
assertEquals("test.txt", toolCalls[0].params["path"])
assertEquals("Hello, World!", toolCalls[0].params["content"])
}
@Test
fun `should parse shell command`() {
val devinContent = """
/shell command="./gradlew build"
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertEquals(1, toolCalls.size)
assertEquals("shell", toolCalls[0].toolName)
assertEquals("./gradlew build", toolCalls[0].params["command"])
}
@Test
fun `should parse grep with multiple parameters`() {
val devinContent = """
/grep pattern="ToolCall" path="mpp-core/"
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertEquals(1, toolCalls.size)
assertEquals("grep", toolCalls[0].toolName)
assertEquals("ToolCall", toolCalls[0].params["pattern"])
assertEquals("mpp-core/", toolCalls[0].params["path"])
}
@Test
fun `should return empty list for empty devin block`() {
val devinContent = ""
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertTrue(toolCalls.isEmpty())
}
@Test
fun `should return empty list for devin block without tool calls`() {
val devinContent = """
This is just some text
without any tool calls
""".trimIndent()
val wrappedContent = "\n$devinContent\n"
val toolCalls = parser.parseToolCalls(wrappedContent)
assertTrue(toolCalls.isEmpty())
}
}