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