33
44package software.aws.toolkits.jetbrains.services.codewhisperer
55
6+ import com.intellij.lang.annotation.HighlightSeverity
67import com.intellij.openapi.util.SimpleModificationTracker
78import com.intellij.testFramework.fixtures.CodeInsightTestFixture
89import kotlinx.coroutines.runBlocking
@@ -12,7 +13,10 @@ import org.junit.Before
1213import org.junit.Rule
1314import org.junit.Test
1415import software.amazon.awssdk.regions.Region
16+ import software.amazon.awssdk.services.codewhispererruntime.model.IdeDiagnostic
1517import software.amazon.awssdk.services.codewhispererruntime.model.OptOutPreference
18+ import software.amazon.awssdk.services.codewhispererruntime.model.Position
19+ import software.amazon.awssdk.services.codewhispererruntime.model.Range
1620import software.amazon.awssdk.services.ssooidc.SsoOidcClient
1721import software.aws.toolkits.core.utils.test.aStringWithLineCount
1822import software.aws.toolkits.jetbrains.core.MockClientManagerRule
@@ -27,6 +31,9 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
2731import software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled
2832import software.aws.toolkits.jetbrains.services.codewhisperer.util.toCodeChunk
2933import software.aws.toolkits.jetbrains.services.codewhisperer.util.truncateLineByLine
34+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.convertSeverity
35+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticDifferences
36+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticsType
3037import software.aws.toolkits.jetbrains.settings.AwsSettings
3138import software.aws.toolkits.jetbrains.utils.rules.JavaCodeInsightTestFixtureRule
3239import software.aws.toolkits.telemetry.CodewhispererCompletionType
@@ -263,4 +270,126 @@ class CodeWhispererUtilTest {
263270 val file = fixture.addFileToProject(" workspace/projectA1/src/Sample.java" , " " ).virtualFile
264271 assertThat(file.isWithin(projectRoot)).isFalse()
265272 }
273+
274+
275+ @Test
276+ fun `getDiagnosticsType correctly identifies syntax errors` () {
277+ val messages = listOf (
278+ " Expected semicolon at end of line" ,
279+ " Incorrect indent level" ,
280+ " Syntax error in expression"
281+ )
282+
283+ messages.forEach { message ->
284+ assertThat(getDiagnosticsType(message)).isEqualTo(" SYNTAX_ERROR" )
285+ }
286+ }
287+
288+ @Test
289+ fun `getDiagnosticsType correctly identifies type errors` () {
290+ val messages = listOf (
291+ " Cannot cast String to Int" ,
292+ " Type mismatch: expected String but got Int"
293+ )
294+
295+ messages.forEach { message ->
296+ assertThat(getDiagnosticsType(message)).isEqualTo(" TYPE_ERROR" )
297+ }
298+ }
299+
300+ @Test
301+ fun `getDiagnosticsType returns OTHER for unrecognized patterns` () {
302+ val message = " Some random message"
303+ assertThat(getDiagnosticsType(message)).isEqualTo(" OTHER" )
304+ }
305+
306+ @Test
307+ fun `convertSeverity correctly maps severity levels` () {
308+ assertThat(convertSeverity(HighlightSeverity .ERROR )).isEqualTo(" ERROR" )
309+ assertThat(convertSeverity(HighlightSeverity .WARNING )).isEqualTo(" WARNING" )
310+ assertThat(convertSeverity(HighlightSeverity .INFORMATION )).isEqualTo(" INFORMATION" )
311+ assertThat(convertSeverity(HighlightSeverity .INFO )).isEqualTo(" INFORMATION" )
312+ }
313+
314+ @Test
315+ fun `getDiagnosticDifferences correctly identifies added and removed diagnostics` () {
316+ val diagnostic1 = IdeDiagnostic .builder()
317+ .ideDiagnosticType(" SYNTAX_ERROR" )
318+ .severity(" ERROR" )
319+ .source(" inspection1" )
320+ .range(
321+ Range .builder()
322+ .start(Position .builder().line(0 ).character(0 ).build())
323+ .end(Position .builder().line(0 ).character(10 ).build())
324+ .build()
325+ )
326+ .build()
327+
328+ val diagnostic2 = IdeDiagnostic .builder()
329+ .ideDiagnosticType(" TYPE_ERROR" )
330+ .severity(" WARNING" )
331+ .source(" inspection2" )
332+ .range(
333+ Range .builder()
334+ .start(Position .builder().line(1 ).character(0 ).build())
335+ .end(Position .builder().line(1 ).character(10 ).build())
336+ .build()
337+ )
338+ .build()
339+
340+ val oldList = listOf (diagnostic1)
341+ val newList = listOf (diagnostic2)
342+
343+ val differences = getDiagnosticDifferences(oldList, newList)
344+
345+ assertThat(differences.added).containsExactly(diagnostic2)
346+ assertThat(differences.removed).containsExactly(diagnostic1)
347+ }
348+
349+ @Test
350+ fun `getDiagnosticDifferences handles empty lists` () {
351+ val diagnostic = IdeDiagnostic .builder()
352+ .ideDiagnosticType(" SYNTAX_ERROR" )
353+ .severity(" ERROR" )
354+ .source(" inspection1" )
355+ .range(
356+ Range .builder()
357+ .start(Position .builder().line(0 ).character(0 ).build())
358+ .end(Position .builder().line(0 ).character(10 ).build())
359+ .build()
360+ )
361+ .build()
362+
363+ val emptyList = emptyList<IdeDiagnostic >()
364+ val nonEmptyList = listOf (diagnostic)
365+
366+ val differencesWithEmptyOld = getDiagnosticDifferences(emptyList, nonEmptyList)
367+ assertThat(differencesWithEmptyOld.added).containsExactly(diagnostic)
368+ assertThat(differencesWithEmptyOld.removed).isEmpty()
369+
370+ val differencesWithEmptyNew = getDiagnosticDifferences(nonEmptyList, emptyList)
371+ assertThat(differencesWithEmptyNew.added).isEmpty()
372+ assertThat(differencesWithEmptyNew.removed).containsExactly(diagnostic)
373+ }
374+
375+ @Test
376+ fun `getDiagnosticDifferences handles identical lists` () {
377+ val diagnostic = IdeDiagnostic .builder()
378+ .ideDiagnosticType(" SYNTAX_ERROR" )
379+ .severity(" ERROR" )
380+ .source(" inspection1" )
381+ .range(
382+ Range .builder()
383+ .start(Position .builder().line(0 ).character(0 ).build())
384+ .end(Position .builder().line(0 ).character(10 ).build())
385+ .build()
386+ )
387+ .build()
388+
389+ val list = listOf (diagnostic)
390+ val differences = getDiagnosticDifferences(list, list)
391+
392+ assertThat(differences.added).isEmpty()
393+ assertThat(differences.removed).isEmpty()
394+ }
266395}
0 commit comments