3
3
4
4
package software.aws.toolkits.jetbrains.services.codewhisperer
5
5
6
+ import com.intellij.lang.annotation.HighlightSeverity
6
7
import com.intellij.openapi.util.SimpleModificationTracker
7
8
import com.intellij.testFramework.fixtures.CodeInsightTestFixture
8
9
import kotlinx.coroutines.runBlocking
@@ -12,7 +13,11 @@ import org.junit.Before
12
13
import org.junit.Rule
13
14
import org.junit.Test
14
15
import software.amazon.awssdk.regions.Region
16
+ import software.amazon.awssdk.services.codewhispererruntime.model.DiagnosticSeverity
17
+ import software.amazon.awssdk.services.codewhispererruntime.model.IdeDiagnostic
15
18
import 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
16
21
import software.amazon.awssdk.services.ssooidc.SsoOidcClient
17
22
import software.aws.toolkits.core.utils.test.aStringWithLineCount
18
23
import software.aws.toolkits.jetbrains.core.MockClientManagerRule
@@ -23,6 +28,9 @@ import software.aws.toolkits.jetbrains.core.credentials.sono.SONO_URL
23
28
import software.aws.toolkits.jetbrains.core.region.MockRegionProviderRule
24
29
import software.aws.toolkits.jetbrains.services.codewhisperer.util.CodeWhispererUtil.getCompletionType
25
30
import 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
26
34
import software.aws.toolkits.jetbrains.services.codewhisperer.util.isWithin
27
35
import software.aws.toolkits.jetbrains.services.codewhisperer.util.runIfIdcConnectionOrTelemetryEnabled
28
36
import software.aws.toolkits.jetbrains.services.codewhisperer.util.toCodeChunk
@@ -263,4 +271,126 @@ class CodeWhispererUtilTest {
263
271
val file = fixture.addFileToProject(" workspace/projectA1/src/Sample.java" , " " ).virtualFile
264
272
assertThat(file.isWithin(projectRoot)).isFalse()
265
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(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
+ }
266
396
}
0 commit comments