@@ -28,9 +28,16 @@ import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
2828import software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled
2929import software.aws.toolkits.jetbrains.services.codewhisperer.util.toCodeChunk
3030import software.aws.toolkits.jetbrains.services.codewhisperer.util.truncateLineByLine
31+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticDifferences
32+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticsType
33+ import software.aws.toolkits.jetbrains.services.codewhisperer.util.convertSeverity
34+ import com.intellij.lang.annotation.HighlightSeverity
3135import software.aws.toolkits.jetbrains.settings.AwsSettings
3236import software.aws.toolkits.jetbrains.utils.rules.JavaCodeInsightTestFixtureRule
3337import software.aws.toolkits.telemetry.CodewhispererCompletionType
38+ import software.amazon.awssdk.services.codewhispererruntime.model.IdeDiagnostic
39+ import software.amazon.awssdk.services.codewhispererruntime.model.Position
40+ import software.amazon.awssdk.services.codewhispererruntime.model.Range
3441
3542class CodeWhispererUtilTest {
3643 @JvmField
@@ -308,4 +315,116 @@ class CodeWhispererUtilTest {
308315 val file = fixture.addFileToProject(" workspace/projectA1/src/Sample.java" , " " ).virtualFile
309316 assertThat(file.isWithin(projectRoot)).isFalse()
310317 }
318+ @Test
319+ fun `getDiagnosticsType correctly identifies syntax errors` () {
320+ val messages = listOf (
321+ " Expected semicolon at end of line" ,
322+ " Incorrect indent level" ,
323+ " Syntax error in expression"
324+ )
325+
326+ messages.forEach { message ->
327+ assertThat(getDiagnosticsType(message)).isEqualTo(" SYNTAX_ERROR" )
328+ }
329+ }
330+
331+ @Test
332+ fun `getDiagnosticsType correctly identifies type errors` () {
333+ val messages = listOf (
334+ " Cannot cast String to Int" ,
335+ " Type mismatch: expected String but got Int"
336+ )
337+
338+ messages.forEach { message ->
339+ assertThat(getDiagnosticsType(message)).isEqualTo(" TYPE_ERROR" )
340+ }
341+ }
342+
343+ @Test
344+ fun `getDiagnosticsType returns OTHER for unrecognized patterns` () {
345+ val message = " Some random message"
346+ assertThat(getDiagnosticsType(message)).isEqualTo(" OTHER" )
347+ }
348+
349+ @Test
350+ fun `convertSeverity correctly maps severity levels` () {
351+ assertThat(convertSeverity(HighlightSeverity .ERROR )).isEqualTo(" ERROR" )
352+ assertThat(convertSeverity(HighlightSeverity .WARNING )).isEqualTo(" WARNING" )
353+ assertThat(convertSeverity(HighlightSeverity .INFORMATION )).isEqualTo(" INFORMATION" )
354+ assertThat(convertSeverity(HighlightSeverity .INFO )).isEqualTo(" INFORMATION" )
355+ }
356+
357+ @Test
358+ fun `getDiagnosticDifferences correctly identifies added and removed diagnostics` () {
359+ val diagnostic1 = IdeDiagnostic .builder()
360+ .ideDiagnosticType(" SYNTAX_ERROR" )
361+ .severity(" ERROR" )
362+ .source(" inspection1" )
363+ .range(Range .builder()
364+ .start(Position .builder().line(0 ).character(0 ).build())
365+ .end(Position .builder().line(0 ).character(10 ).build())
366+ .build())
367+ .build()
368+
369+ val diagnostic2 = IdeDiagnostic .builder()
370+ .ideDiagnosticType(" TYPE_ERROR" )
371+ .severity(" WARNING" )
372+ .source(" inspection2" )
373+ .range(Range .builder()
374+ .start(Position .builder().line(1 ).character(0 ).build())
375+ .end(Position .builder().line(1 ).character(10 ).build())
376+ .build())
377+ .build()
378+
379+ val oldList = listOf (diagnostic1)
380+ val newList = listOf (diagnostic2)
381+
382+ val differences = getDiagnosticDifferences(oldList, newList)
383+
384+ assertThat(differences.added).containsExactly(diagnostic2)
385+ assertThat(differences.removed).containsExactly(diagnostic1)
386+ }
387+
388+ @Test
389+ fun `getDiagnosticDifferences handles empty lists` () {
390+ val diagnostic = IdeDiagnostic .builder()
391+ .ideDiagnosticType(" SYNTAX_ERROR" )
392+ .severity(" ERROR" )
393+ .source(" inspection1" )
394+ .range(Range .builder()
395+ .start(Position .builder().line(0 ).character(0 ).build())
396+ .end(Position .builder().line(0 ).character(10 ).build())
397+ .build())
398+ .build()
399+
400+ val emptyList = emptyList<IdeDiagnostic >()
401+ val nonEmptyList = listOf (diagnostic)
402+
403+ val differencesWithEmptyOld = getDiagnosticDifferences(emptyList, nonEmptyList)
404+ assertThat(differencesWithEmptyOld.added).containsExactly(diagnostic)
405+ assertThat(differencesWithEmptyOld.removed).isEmpty()
406+
407+ val differencesWithEmptyNew = getDiagnosticDifferences(nonEmptyList, emptyList)
408+ assertThat(differencesWithEmptyNew.added).isEmpty()
409+ assertThat(differencesWithEmptyNew.removed).containsExactly(diagnostic)
410+ }
411+
412+ @Test
413+ fun `getDiagnosticDifferences handles identical lists` () {
414+ val diagnostic = IdeDiagnostic .builder()
415+ .ideDiagnosticType(" SYNTAX_ERROR" )
416+ .severity(" ERROR" )
417+ .source(" inspection1" )
418+ .range(Range .builder()
419+ .start(Position .builder().line(0 ).character(0 ).build())
420+ .end(Position .builder().line(0 ).character(10 ).build())
421+ .build())
422+ .build()
423+
424+ val list = listOf (diagnostic)
425+ val differences = getDiagnosticDifferences(list, list)
426+
427+ assertThat(differences.added).isEmpty()
428+ assertThat(differences.removed).isEmpty()
429+ }
311430}
0 commit comments