Skip to content

Commit 318cc2d

Browse files
committed
Adding Test cases
1 parent ecd046d commit 318cc2d

File tree

3 files changed

+113
-14
lines changed

3 files changed

+113
-14
lines changed

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/services/codewhisperer/codescan/listeners/CodeWhispererCodeScanEditorMouseMotionListener.kt

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager
2020
import com.intellij.openapi.project.Project
2121
import com.intellij.openapi.ui.popup.JBPopup
2222
import com.intellij.openapi.ui.popup.JBPopupFactory
23-
import com.intellij.psi.PsiDocumentManager
2423
import com.intellij.ui.JBColor
2524
import com.intellij.ui.awt.RelativePoint
2625
import com.intellij.ui.components.JBScrollPane
@@ -43,6 +42,7 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhisperer
4342
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererConstants.CODE_SCAN_ISSUE_TITLE_MAX_LENGTH
4443
import software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled
4544
import software.aws.toolkits.jetbrains.utils.notifyError
45+
import software.aws.toolkits.jetbrains.utils.updateEditorDocument
4646
import software.aws.toolkits.resources.message
4747
import software.aws.toolkits.telemetry.Result
4848
import java.awt.Dimension
@@ -391,24 +391,12 @@ class CodeWhispererCodeScanEditorMouseMotionListener(private val project: Projec
391391
private val LOG = getLogger<CodeWhispererCodeScanEditorMouseMotionListener>()
392392
}
393393

394-
private fun extractChanges(issue: CodeWhispererCodeScanIssue): Pair<Int, List<String>> {
395-
val codeLines = issue.suggestedFixes[0].code.split("\n")
396-
val linesToDelete = codeLines.count { it.startsWith("-") }
397-
val linesToInsert = codeLines.filter { it.startsWith("+") }.map { it.removePrefix("+") }
398-
return Pair(linesToDelete, linesToInsert)
399-
}
400-
401394
private fun handleApplyFix(issue: CodeWhispererCodeScanIssue) {
402395
try {
403396
WriteCommandAction.runWriteCommandAction(issue.project) {
404397
val document = FileDocumentManager.getInstance().getDocument(issue.file) ?: return@runWriteCommandAction
405-
406-
val (linesToDelete, linesToInsert) = extractChanges(issue)
407398
if (document != null) {
408-
val startLineOffset = document.getLineStartOffset(issue.startLine - 1)
409-
val endLineOffset = document.getLineEndOffset(issue.startLine + linesToDelete - 2)
410-
document.replaceString(startLineOffset, endLineOffset, linesToInsert.joinToString("\n"))
411-
PsiDocumentManager.getInstance(project).commitDocument(document)
399+
updateEditorDocument(document, issue, project)
412400
}
413401
FileDocumentManager.getInstance().saveDocument(document)
414402

plugins/toolkit/jetbrains-core/src/software/aws/toolkits/jetbrains/utils/TextUtils.kt

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@ package software.aws.toolkits.jetbrains.utils
55

66
import com.intellij.lang.Language
77
import com.intellij.openapi.command.CommandProcessor
8+
import com.intellij.openapi.editor.Document
89
import com.intellij.openapi.project.Project
910
import com.intellij.openapi.util.text.StringUtil
11+
import com.intellij.psi.PsiDocumentManager
1012
import com.intellij.psi.PsiFileFactory
1113
import com.intellij.psi.codeStyle.CodeStyleManager
14+
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanIssue
1215

1316
fun formatText(project: Project, language: Language, content: String): String {
1417
var result = content
@@ -22,6 +25,23 @@ fun formatText(project: Project, language: Language, content: String): String {
2225
return result
2326
}
2427

28+
fun extractChanges(issue: CodeWhispererCodeScanIssue): Pair<Int, List<String>> {
29+
val codeLines = issue.suggestedFixes.firstOrNull()?.code?.split("\n").orEmpty()
30+
val linesToDelete = codeLines.count { it.startsWith("-") }
31+
val linesToInsert = codeLines.mapNotNull { line ->
32+
if (line.startsWith("+")) line.removePrefix("+") else null
33+
}
34+
return linesToDelete to linesToInsert
35+
}
36+
37+
fun updateEditorDocument(document: Document, issue: CodeWhispererCodeScanIssue, project: Project) {
38+
val (linesToDelete, linesToInsert) = extractChanges(issue)
39+
val startLineOffset = document.getLineStartOffset(issue.startLine - 1)
40+
val endLineOffset = document.getLineEndOffset(issue.startLine + linesToDelete - 2)
41+
document.replaceString(startLineOffset, endLineOffset, linesToInsert.joinToString("\n"))
42+
PsiDocumentManager.getInstance(project).commitDocument(document)
43+
}
44+
2545
/**
2646
* Designed to convert underscore separated words (e.g. UPDATE_COMPLETE) into title cased human readable text
2747
* (e.g. Update Complete)

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

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,24 @@
44
package software.aws.toolkits.jetbrains.utils
55

66
import com.intellij.json.JsonLanguage
7+
import com.intellij.openapi.editor.Document
8+
import com.intellij.openapi.project.Project
9+
import com.intellij.psi.PsiDocumentManager
710
import com.intellij.testFramework.ProjectRule
811
import com.intellij.testFramework.runInEdtAndWait
912
import org.assertj.core.api.Assertions.assertThat
1013
import org.intellij.lang.annotations.Language
1114
import org.junit.Rule
1215
import org.junit.Test
16+
import org.mockito.Mockito
17+
import org.mockito.Mockito.mock
18+
import org.mockito.Mockito.times
19+
import org.mockito.Mockito.`when`
20+
import org.mockito.kotlin.doNothing
21+
import org.mockito.kotlin.verify
1322
import software.aws.toolkits.core.utils.convertMarkdownToHTML
23+
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.CodeWhispererCodeScanIssue
24+
import software.aws.toolkits.jetbrains.services.codewhisperer.codescan.SuggestedFix
1425

1526
class TextUtilsTest {
1627
@Rule
@@ -94,4 +105,84 @@ class TextUtilsTest {
94105
val actual = convertMarkdownToHTML(input)
95106
assertThat(actual).isEqualTo(expected)
96107
}
108+
109+
@Test
110+
fun extractChangesWithSingleLineDeletion() {
111+
val suggestedFixes = listOf(SuggestedFix(description = "MockDescription", code = "-oldLine\n+newLine"))
112+
val issue = mock(CodeWhispererCodeScanIssue::class.java)
113+
`when`(issue.suggestedFixes).thenReturn(suggestedFixes)
114+
115+
val (linesToDelete, linesToInsert) = extractChanges(issue)
116+
117+
assertThat(linesToDelete).isEqualTo(1)
118+
assertThat(linesToInsert).isEqualTo(listOf("newLine"))
119+
}
120+
121+
@Test
122+
fun extractChangesWithMultipleLineDeletionAndInsertion() {
123+
val suggestedFixes = listOf(SuggestedFix(description = "MockDescription", code = "-oldLine1\n-oldLine2\n+newLine1\n+newLine2"))
124+
val issue = mock(CodeWhispererCodeScanIssue::class.java)
125+
`when`(issue.suggestedFixes).thenReturn(suggestedFixes)
126+
127+
val (linesToDelete, linesToInsert) = extractChanges(issue)
128+
129+
assertThat(linesToDelete).isEqualTo(2)
130+
assertThat(linesToInsert).isEqualTo(listOf("newLine1", "newLine2"))
131+
}
132+
133+
@Test
134+
fun extractChangesWithEmptySuggestedFixes() {
135+
val emptyStringList: List<String> = emptyList()
136+
val issue = mock(CodeWhispererCodeScanIssue::class.java)
137+
`when`(issue.suggestedFixes).thenReturn(emptyList())
138+
139+
val (linesToDelete, linesToInsert) = extractChanges(issue)
140+
141+
assertThat(linesToDelete).isEqualTo(0)
142+
assertThat(linesToInsert).isEqualTo(emptyStringList)
143+
}
144+
145+
@Test
146+
fun updateEditorDocumentWithSingleLineDeletionAndInsertion() {
147+
val document = mock(Document::class.java)
148+
val project = mock(Project::class.java)
149+
val issue = mock(CodeWhispererCodeScanIssue::class.java)
150+
val suggestedFixes = listOf(SuggestedFix(description = "MockDescription", code = "-oldLine\n+newLine"))
151+
`when`(issue.startLine).thenReturn(1)
152+
`when`(issue.suggestedFixes).thenReturn(suggestedFixes)
153+
`when`(document.getLineStartOffset(0)).thenReturn(0)
154+
`when`(document.getLineEndOffset(0)).thenReturn(10)
155+
156+
val psiDocumentManager = mock(PsiDocumentManager::class.java)
157+
doNothing().`when`(psiDocumentManager).commitDocument(document)
158+
Mockito.`when`(PsiDocumentManager.getInstance(project)).thenReturn(psiDocumentManager)
159+
160+
runInEdtAndWait {
161+
updateEditorDocument(document, issue, project)
162+
}
163+
164+
verify(document).replaceString(0, 10, "newLine")
165+
}
166+
167+
@Test
168+
fun updateEditorDocumentWithMultipleLineDeletionAndInsertion() {
169+
val document = mock(Document::class.java)
170+
val project = mock(Project::class.java)
171+
val issue = mock(CodeWhispererCodeScanIssue::class.java)
172+
val suggestedFixes = listOf(SuggestedFix(description = "MockDescription", code = "-oldLine1\n-oldLine2\n+newLine1\n+newLine2"))
173+
`when`(issue.startLine).thenReturn(1)
174+
`when`(issue.suggestedFixes).thenReturn(suggestedFixes)
175+
`when`(document.getLineStartOffset(0)).thenReturn(20)
176+
`when`(document.getLineEndOffset(1)).thenReturn(40)
177+
178+
val psiDocumentManager = mock(PsiDocumentManager::class.java)
179+
doNothing().`when`(psiDocumentManager).commitDocument(document)
180+
Mockito.`when`(PsiDocumentManager.getInstance(project)).thenReturn(psiDocumentManager)
181+
182+
runInEdtAndWait {
183+
updateEditorDocument(document, issue, project)
184+
}
185+
186+
verify(document).replaceString(20, 40, "newLine1\nnewLine2")
187+
}
97188
}

0 commit comments

Comments
 (0)