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,11 @@ 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.DiagnosticSeverity 
17+ import  software.amazon.awssdk.services.codewhispererruntime.model.IdeDiagnostic 
1518import  software.amazon.awssdk.services.codewhispererruntime.model.OptOutPreference 
19+ import  software.amazon.awssdk.services.codewhispererruntime.model.Position 
20+ import  software.amazon.awssdk.services.codewhispererruntime.model.Range 
1621import  software.amazon.awssdk.services.ssooidc.SsoOidcClient 
1722import  software.aws.toolkits.core.utils.test.aStringWithLineCount 
1823import  software.aws.toolkits.jetbrains.core.MockClientManagerRule 
@@ -23,6 +28,9 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.SONO_URL
2328import  software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule 
2429import  software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getCompletionType 
2530import  software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getTelemetryOptOutPreference 
31+ import  software.aws.toolkits.jetbrains.services.codewhisperer.util.convertSeverity 
32+ import  software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticDifferences 
33+ import  software.aws.toolkits.jetbrains.services.codewhisperer.util.getDiagnosticsType 
2634import  software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin 
2735import  software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled 
2836import  software.aws.toolkits.jetbrains.services.codewhisperer.util.toCodeChunk 
@@ -263,4 +271,126 @@ class CodeWhispererUtilTest {
263271        val  file =  fixture.addFileToProject(" workspace/projectA1/src/Sample.java"  , " "  ).virtualFile
264272        assertThat(file.isWithin(projectRoot)).isFalse()
265273    }
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(DiagnosticSeverity .ERROR )
309+         assertThat(convertSeverity(HighlightSeverity .WARNING )).isEqualTo(DiagnosticSeverity .WARNING )
310+         assertThat(convertSeverity(HighlightSeverity .TEXT_ATTRIBUTES )).isEqualTo(DiagnosticSeverity .HINT )
311+         assertThat(convertSeverity(HighlightSeverity .INFORMATION )).isEqualTo(DiagnosticSeverity .INFORMATION )
312+         assertThat(convertSeverity(HighlightSeverity .INFO )).isEqualTo(DiagnosticSeverity .INFORMATION )
313+     }
314+ 
315+     @Test
316+     fun  `getDiagnosticDifferences correctly identifies added and removed diagnostics`  () {
317+         val  diagnostic1 =  IdeDiagnostic .builder()
318+             .ideDiagnosticType(" SYNTAX_ERROR"  )
319+             .severity(" ERROR"  )
320+             .source(" inspection1"  )
321+             .range(
322+                 Range .builder()
323+                     .start(Position .builder().line(0 ).character(0 ).build())
324+                     .end(Position .builder().line(0 ).character(10 ).build())
325+                     .build()
326+             )
327+             .build()
328+ 
329+         val  diagnostic2 =  IdeDiagnostic .builder()
330+             .ideDiagnosticType(" TYPE_ERROR"  )
331+             .severity(" WARNING"  )
332+             .source(" inspection2"  )
333+             .range(
334+                 Range .builder()
335+                     .start(Position .builder().line(1 ).character(0 ).build())
336+                     .end(Position .builder().line(1 ).character(10 ).build())
337+                     .build()
338+             )
339+             .build()
340+ 
341+         val  oldList =  listOf (diagnostic1)
342+         val  newList =  listOf (diagnostic2)
343+ 
344+         val  differences =  getDiagnosticDifferences(oldList, newList)
345+ 
346+         assertThat(differences.added).containsExactly(diagnostic2)
347+         assertThat(differences.removed).containsExactly(diagnostic1)
348+     }
349+ 
350+     @Test
351+     fun  `getDiagnosticDifferences handles empty lists`  () {
352+         val  diagnostic =  IdeDiagnostic .builder()
353+             .ideDiagnosticType(" SYNTAX_ERROR"  )
354+             .severity(" ERROR"  )
355+             .source(" inspection1"  )
356+             .range(
357+                 Range .builder()
358+                     .start(Position .builder().line(0 ).character(0 ).build())
359+                     .end(Position .builder().line(0 ).character(10 ).build())
360+                     .build()
361+             )
362+             .build()
363+ 
364+         val  emptyList =  emptyList<IdeDiagnostic >()
365+         val  nonEmptyList =  listOf (diagnostic)
366+ 
367+         val  differencesWithEmptyOld =  getDiagnosticDifferences(emptyList, nonEmptyList)
368+         assertThat(differencesWithEmptyOld.added).containsExactly(diagnostic)
369+         assertThat(differencesWithEmptyOld.removed).isEmpty()
370+ 
371+         val  differencesWithEmptyNew =  getDiagnosticDifferences(nonEmptyList, emptyList)
372+         assertThat(differencesWithEmptyNew.added).isEmpty()
373+         assertThat(differencesWithEmptyNew.removed).containsExactly(diagnostic)
374+     }
375+ 
376+     @Test
377+     fun  `getDiagnosticDifferences handles identical lists`  () {
378+         val  diagnostic =  IdeDiagnostic .builder()
379+             .ideDiagnosticType(" SYNTAX_ERROR"  )
380+             .severity(" ERROR"  )
381+             .source(" inspection1"  )
382+             .range(
383+                 Range .builder()
384+                     .start(Position .builder().line(0 ).character(0 ).build())
385+                     .end(Position .builder().line(0 ).character(10 ).build())
386+                     .build()
387+             )
388+             .build()
389+ 
390+         val  list =  listOf (diagnostic)
391+         val  differences =  getDiagnosticDifferences(list, list)
392+ 
393+         assertThat(differences.added).isEmpty()
394+         assertThat(differences.removed).isEmpty()
395+     }
266396}
0 commit comments