@@ -103,6 +103,7 @@ internal abstract class CodeWhispererCodeCoverageTrackerTestBase(myProjectRule:
103
103
protected lateinit var telemetryServiceSpy: TelemetryService
104
104
protected lateinit var batcher: TelemetryBatcher
105
105
protected lateinit var exploreActionManagerMock: CodeWhispererExplorerActionManager
106
+ protected lateinit var sut: CodeWhispererCodeCoverageTracker
106
107
107
108
init {
108
109
this .projectRule = myProjectRule
@@ -126,6 +127,9 @@ internal abstract class CodeWhispererCodeCoverageTrackerTestBase(myProjectRule:
126
127
@After
127
128
fun tearDown () {
128
129
CodeWhispererCodeCoverageTracker .getInstancesMap().clear()
130
+ if (::sut.isInitialized) {
131
+ sut.forceTrackerFlush()
132
+ }
129
133
}
130
134
131
135
protected companion object {
@@ -205,26 +209,26 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
205
209
}
206
210
207
211
@Test
208
- fun `test tracker is listening to cwspr recommendation service invocation` () {
209
- val pythonTracker = TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE )
212
+ fun `test tracker is listening to codewhisperer recommendation service invocation` () {
213
+ sut = TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE )
210
214
val jsxTracker = TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererJsx .INSTANCE )
211
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = pythonTracker
215
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = sut
212
216
CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererJsx .INSTANCE ] = jsxTracker
213
- pythonTracker .activateTrackerIfNotActive()
214
- assertThat(pythonTracker .serviceInvocationCount).isEqualTo(0 )
217
+ sut .activateTrackerIfNotActive()
218
+ assertThat(sut .serviceInvocationCount).isEqualTo(0 )
215
219
assertThat(jsxTracker.serviceInvocationCount).isEqualTo(0 )
216
220
217
221
val fileContextInfo = mock<FileContextInfo > { on { programmingLanguage } doReturn CodeWhispererPython .INSTANCE }
218
222
ApplicationManager .getApplication().messageBus.syncPublisher(CodeWhispererService .CODEWHISPERER_CODE_COMPLETION_PERFORMED ).onSuccess(fileContextInfo)
219
- assertThat(pythonTracker .serviceInvocationCount).isEqualTo(1 )
223
+ assertThat(sut .serviceInvocationCount).isEqualTo(1 )
220
224
assertThat(jsxTracker.serviceInvocationCount).isEqualTo(0 )
221
225
}
222
226
223
227
@Test
224
228
fun `test tracker is listening to document changes and increment totalTokens - add new code` () {
225
- val pythonTracker = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE ))
226
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = pythonTracker
227
- pythonTracker .activateTrackerIfNotActive()
229
+ sut = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE ))
230
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = sut
231
+ sut .activateTrackerIfNotActive()
228
232
229
233
fixture.configureByText(pythonFileName, " " )
230
234
runInEdtAndWait {
@@ -233,32 +237,32 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
233
237
}
234
238
}
235
239
val captor = argumentCaptor<DocumentEvent >()
236
- verify(pythonTracker , Times (1 )).documentChanged(captor.capture())
240
+ verify(sut , Times (1 )).documentChanged(captor.capture())
237
241
assertThat(captor.firstValue.newFragment.toString()).isEqualTo(pythonTestLeftContext)
238
- val oldSize = pythonTracker .totalTokensSize
239
- assertThat(pythonTracker .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
242
+ val oldSize = sut .totalTokensSize
243
+ assertThat(sut .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
240
244
241
245
val anotherCode = " (x, y):"
242
246
runInEdtAndWait {
243
247
WriteCommandAction .runWriteCommandAction(project) {
244
248
fixture.editor.appendString(anotherCode)
245
249
}
246
250
}
247
- assertThat(pythonTracker .totalTokensSize).isEqualTo(oldSize + anotherCode.length)
251
+ assertThat(sut .totalTokensSize).isEqualTo(oldSize + anotherCode.length)
248
252
}
249
253
250
254
@Test
251
255
fun `test tracker is listening to document changes and increment totalTokens - delete code should not affect` () {
252
- val pythonTracker = TestCodePercentageTracker (
256
+ sut = TestCodePercentageTracker (
253
257
project,
254
258
TOTAL_SECONDS_IN_MINUTE ,
255
259
CodeWhispererPython .INSTANCE ,
256
260
codeCoverageTokens = mutableMapOf (fixture.editor.document to CodeCoverageTokens (pythonTestLeftContext.length, 0 ))
257
261
)
258
262
259
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = pythonTracker
260
- pythonTracker .activateTrackerIfNotActive()
261
- assertThat(pythonTracker .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
263
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = sut
264
+ sut .activateTrackerIfNotActive()
265
+ assertThat(sut .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
262
266
263
267
runInEdtAndWait {
264
268
fixture.editor.caretModel.primaryCaret.moveToOffset(fixture.editor.document.textLength)
@@ -267,34 +271,34 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
267
271
}
268
272
}
269
273
270
- assertThat(pythonTracker .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
274
+ assertThat(sut .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
271
275
}
272
276
273
277
@Test
274
278
fun `test tracker documentChanged - will not increment tokens on blank string of length greater than 1` () {
275
- val pythonTracker = TestCodePercentageTracker (
279
+ sut = TestCodePercentageTracker (
276
280
project,
277
281
TOTAL_SECONDS_IN_MINUTE ,
278
282
CodeWhispererPython .INSTANCE ,
279
283
codeCoverageTokens = mutableMapOf (fixture.editor.document to CodeCoverageTokens (pythonTestLeftContext.length, 0 ))
280
284
)
281
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = pythonTracker
282
- pythonTracker .activateTrackerIfNotActive()
283
- assertThat(pythonTracker .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
285
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererPython .INSTANCE ] = sut
286
+ sut .activateTrackerIfNotActive()
287
+ assertThat(sut .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
284
288
285
289
runInEdtAndWait {
286
290
WriteCommandAction .runWriteCommandAction(project) {
287
291
fixture.editor.document.insertString(fixture.editor.caretModel.offset, " \t " )
288
292
}
289
293
}
290
294
291
- assertThat(pythonTracker .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
295
+ assertThat(sut .totalTokensSize).isEqualTo(pythonTestLeftContext.length)
292
296
}
293
297
294
298
@Test
295
299
fun `test msg CODEWHISPERER_USER_ACTION_PERFORMED will add rangeMarker in the list` () {
296
- val pythonTracker = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , language = CodeWhispererPython .INSTANCE ))
297
- pythonTracker .activateTrackerIfNotActive()
300
+ sut = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , language = CodeWhispererPython .INSTANCE ))
301
+ sut .activateTrackerIfNotActive()
298
302
val rangeMarkerMock = runInEdtAndGet {
299
303
spy(fixture.editor.document.createRangeMarker(0 , 3 )) {
300
304
on { isValid } doReturn true
@@ -307,46 +311,46 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
307
311
rangeMarkerMock
308
312
)
309
313
310
- assertThat(pythonTracker .acceptedRecommendationsCount).isEqualTo(1 )
314
+ assertThat(sut .acceptedRecommendationsCount).isEqualTo(1 )
311
315
val argumentCaptor = argumentCaptor<String >()
312
316
verify(rangeMarkerMock, atLeastOnce()).putUserData(any<Key <String >>(), argumentCaptor.capture())
313
317
assertThat(argumentCaptor.firstValue).isEqualTo(pythonTestLeftContext.substring(0 , 3 ))
314
318
}
315
319
316
320
@Test
317
321
fun `test 0 totalTokens will return null` () {
318
- val javaTracker = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , language = CodeWhispererJava .INSTANCE ))
319
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererJava .INSTANCE ] = javaTracker
320
- assertThat(javaTracker .percentage).isNull()
322
+ sut = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , language = CodeWhispererJava .INSTANCE ))
323
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererJava .INSTANCE ] = sut
324
+ assertThat(sut .percentage).isNull()
321
325
}
322
326
323
327
@Test
324
328
fun `test flush() will reset tokens and reschedule next telemetry sending` () {
325
- val pythonTracker = TestCodePercentageTracker (
329
+ sut = TestCodePercentageTracker (
326
330
project,
327
331
TOTAL_SECONDS_IN_MINUTE ,
328
332
CodeWhispererPython .INSTANCE ,
329
333
codeCoverageTokens = mutableMapOf (mock<Document >() to CodeCoverageTokens (" foobar" .length, " bar" .length))
330
334
)
331
335
332
- pythonTracker .activateTrackerIfNotActive()
333
- assertThat(pythonTracker .activeRequestCount()).isEqualTo(1 )
334
- assertThat(pythonTracker .acceptedTokensSize).isEqualTo(" bar" .length)
335
- assertThat(pythonTracker .totalTokensSize).isEqualTo(" foobar" .length)
336
+ sut .activateTrackerIfNotActive()
337
+ assertThat(sut .activeRequestCount()).isEqualTo(1 )
338
+ assertThat(sut .acceptedTokensSize).isEqualTo(" bar" .length)
339
+ assertThat(sut .totalTokensSize).isEqualTo(" foobar" .length)
336
340
337
- pythonTracker .forceTrackerFlush()
341
+ sut .forceTrackerFlush()
338
342
339
- assertThat(pythonTracker .activeRequestCount()).isEqualTo(1 )
340
- assertThat(pythonTracker .acceptedTokensSize).isEqualTo(0 )
341
- assertThat(pythonTracker .totalTokensSize).isEqualTo(0 )
343
+ assertThat(sut .activeRequestCount()).isEqualTo(1 )
344
+ assertThat(sut .acceptedTokensSize).isEqualTo(0 )
345
+ assertThat(sut .totalTokensSize).isEqualTo(0 )
342
346
}
343
347
344
348
@Test
345
349
fun `test when rangeMarker is not vaild, acceptedToken will not be updated` () {
346
350
// when user delete whole recommendation, rangeMarker will be isValid = false
347
351
val rangeMarkerMock: RangeMarker = mock()
348
352
whenever(rangeMarkerMock.isValid).thenReturn(false )
349
- val pythonTracker = spy(
353
+ sut = spy(
350
354
TestCodePercentageTracker (
351
355
project,
352
356
TOTAL_SECONDS_IN_MINUTE ,
@@ -357,29 +361,29 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
357
361
onGeneric { getAcceptedTokensDelta(any(), any()) } doReturn 100
358
362
}
359
363
360
- pythonTracker .activateTrackerIfNotActive()
361
- pythonTracker .forceTrackerFlush()
364
+ sut .activateTrackerIfNotActive()
365
+ sut .forceTrackerFlush()
362
366
363
- verify(pythonTracker , Times (0 )).getAcceptedTokensDelta(any(), any())
367
+ verify(sut , Times (0 )).getAcceptedTokensDelta(any(), any())
364
368
}
365
369
366
370
@Test
367
371
fun `test flush() will call emitTelemetry automatically schedule next call` () {
368
- val pythonTracker = spy(
372
+ sut = spy(
369
373
TestCodePercentageTracker (
370
374
project,
371
375
TOTAL_SECONDS_IN_MINUTE ,
372
376
CodeWhispererPython .INSTANCE ,
373
377
)
374
378
)
375
- doNothing().whenever(pythonTracker ).emitCodeWhispererCodeContribution()
379
+ doNothing().whenever(sut ).emitCodeWhispererCodeContribution()
376
380
377
- pythonTracker .activateTrackerIfNotActive()
378
- assertThat(pythonTracker .activeRequestCount()).isEqualTo(1 )
379
- pythonTracker .forceTrackerFlush()
381
+ sut .activateTrackerIfNotActive()
382
+ assertThat(sut .activeRequestCount()).isEqualTo(1 )
383
+ sut .forceTrackerFlush()
380
384
381
- verify(pythonTracker , Times (1 )).emitCodeWhispererCodeContribution()
382
- assertThat(pythonTracker .activeRequestCount()).isEqualTo(1 )
385
+ verify(sut , Times (1 )).emitCodeWhispererCodeContribution()
386
+ assertThat(sut .activeRequestCount()).isEqualTo(1 )
383
387
}
384
388
385
389
@Test
@@ -391,7 +395,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
391
395
on { document } doReturn fixture.editor.document
392
396
}
393
397
394
- val pythonTracker = spy(
398
+ sut = spy(
395
399
TestCodePercentageTracker (
396
400
project,
397
401
TOTAL_SECONDS_IN_MINUTE ,
@@ -404,7 +408,7 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
404
408
onGeneric { getAcceptedTokensDelta(any(), any()) } doReturn 99
405
409
}
406
410
407
- pythonTracker .emitCodeWhispererCodeContribution()
411
+ sut .emitCodeWhispererCodeContribution()
408
412
409
413
val metricCaptor = argumentCaptor<MetricEvent >()
410
414
verify(batcher, Times (1 )).enqueue(metricCaptor.capture())
@@ -422,13 +426,13 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
422
426
@Test
423
427
fun `test flush() won't emit telemetry event when users not enabling telemetry` () {
424
428
AwsSettings .getInstance().isTelemetryEnabled = false
425
- val pythonTracker = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE ))
426
- doNothing().whenever(pythonTracker ).emitCodeWhispererCodeContribution()
429
+ sut = spy(TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE ))
430
+ doNothing().whenever(sut ).emitCodeWhispererCodeContribution()
427
431
428
- pythonTracker .activateTrackerIfNotActive()
429
- pythonTracker .forceTrackerFlush()
432
+ sut .activateTrackerIfNotActive()
433
+ sut .forceTrackerFlush()
430
434
431
- verify(pythonTracker , Times (0 )).emitCodeWhispererCodeContribution()
435
+ verify(sut , Times (0 )).emitCodeWhispererCodeContribution()
432
436
}
433
437
434
438
@Test
@@ -478,10 +482,10 @@ internal class CodeWhispererCodeCoverageTrackerTestPython : CodeWhispererCodeCov
478
482
479
483
@Test
480
484
fun `test flush() won't emit telemetry when users are not editing the document (totalTokens == 0)` () {
481
- val pythonTracker = TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE )
482
- pythonTracker .activateTrackerIfNotActive()
483
- assertThat(pythonTracker .activeRequestCount()).isEqualTo(1 )
484
- pythonTracker .forceTrackerFlush()
485
+ sut = TestCodePercentageTracker (project, TOTAL_SECONDS_IN_MINUTE , CodeWhispererPython .INSTANCE )
486
+ sut .activateTrackerIfNotActive()
487
+ assertThat(sut .activeRequestCount()).isEqualTo(1 )
488
+ sut .forceTrackerFlush()
485
489
verify(batcher, Times (0 )).enqueue(any())
486
490
}
487
491
@@ -518,23 +522,23 @@ internal class CodeWhispererCodeCoverageTrackerTestJava : CodeWhispererCodeCover
518
522
}
519
523
""" .trimIndent()
520
524
val file = fixture.configureByText(" test.java" , codeNeedToBeReformatted)
521
- val tracker = spy(
525
+ sut = spy(
522
526
TestCodePercentageTracker (
523
527
project,
524
528
TOTAL_SECONDS_IN_MINUTE ,
525
529
language = CodeWhispererJava .INSTANCE ,
526
530
codeCoverageTokens = mutableMapOf (fixture.editor.document to CodeCoverageTokens (totalTokens = codeNeedToBeReformatted.length))
527
531
)
528
532
)
529
- CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererJava .INSTANCE ] = tracker
533
+ CodeWhispererCodeCoverageTracker .getInstancesMap()[CodeWhispererJava .INSTANCE ] = sut
530
534
runInEdtAndWait {
531
535
WriteCommandAction .runWriteCommandAction(project) {
532
536
CodeStyleManager .getInstance(project).reformatText(file, 0 , fixture.editor.document.textLength)
533
537
}
534
538
}
535
539
// reformat should fire documentChanged events, but tracker should not update token from these events
536
- verify(tracker , atLeastOnce()).documentChanged(any())
537
- assertThat(tracker .totalTokensSize).isEqualTo(codeNeedToBeReformatted.length)
540
+ verify(sut , atLeastOnce()).documentChanged(any())
541
+ assertThat(sut .totalTokensSize).isEqualTo(codeNeedToBeReformatted.length)
538
542
539
543
val formatted = """
540
544
class Answer {
0 commit comments