@@ -210,6 +210,8 @@ namespace ts.projectSystem {
210
210
211
211
class TestSession extends server . Session {
212
212
private seq = 0 ;
213
+ public events : protocol . Event [ ] = [ ] ;
214
+ public host : TestServerHost ;
213
215
214
216
getProjectService ( ) {
215
217
return this . projectService ;
@@ -229,6 +231,16 @@ namespace ts.projectSystem {
229
231
request . type = "request" ;
230
232
return this . executeCommand ( < T > request ) ;
231
233
}
234
+
235
+ public event < T > ( body : T , eventName : string ) {
236
+ this . events . push ( server . toEvent ( eventName , body ) ) ;
237
+ super . event ( body , eventName ) ;
238
+ }
239
+
240
+ public clearMessages ( ) {
241
+ clear ( this . events ) ;
242
+ this . host . clearOutput ( ) ;
243
+ }
232
244
}
233
245
234
246
export function createSession ( host : server . ServerHost , opts : Partial < server . SessionOptions > = { } ) {
@@ -436,48 +448,29 @@ namespace ts.projectSystem {
436
448
verifyDiagnostics ( actual , [ ] ) ;
437
449
}
438
450
439
- function assertEvent ( actualOutput : string , expectedEvent : protocol . Event , host : TestServerHost ) {
440
- assert . equal ( actualOutput , server . formatMessage ( expectedEvent , nullLogger , Utils . byteLength , host . newLine ) ) ;
451
+ function checkErrorMessage ( session : TestSession , eventName : "syntaxDiag" | "semanticDiag" , diagnostics : protocol . DiagnosticEventBody ) {
452
+ checkNthEvent ( session , ts . server . toEvent ( eventName , diagnostics ) , 0 , /*isMostRecent*/ false ) ;
441
453
}
442
454
443
- function checkErrorMessage ( host : TestServerHost , eventName : "syntaxDiag" | "semanticDiag" , diagnostics : protocol . DiagnosticEventBody ) {
444
- const outputs = host . getOutput ( ) ;
445
- assert . isTrue ( outputs . length >= 1 , outputs . toString ( ) ) ;
446
- const event : protocol . Event = {
447
- seq : 0 ,
448
- type : "event" ,
449
- event : eventName ,
450
- body : diagnostics
451
- } ;
452
- assertEvent ( outputs [ 0 ] , event , host ) ;
455
+ function checkCompleteEvent ( session : TestSession , numberOfCurrentEvents : number , expectedSequenceId : number ) {
456
+ checkNthEvent ( session , ts . server . toEvent ( "requestCompleted" , { request_seq : expectedSequenceId } ) , numberOfCurrentEvents - 1 , /*isMostRecent*/ true ) ;
453
457
}
454
458
455
- function checkCompleteEvent ( host : TestServerHost , numberOfCurrentEvents : number , expectedSequenceId : number ) {
456
- const outputs = host . getOutput ( ) ;
457
- assert . equal ( outputs . length , numberOfCurrentEvents , outputs . toString ( ) ) ;
458
- const event : protocol . RequestCompletedEvent = {
459
- seq : 0 ,
460
- type : "event" ,
461
- event : "requestCompleted" ,
462
- body : {
463
- request_seq : expectedSequenceId
464
- }
465
- } ;
466
- assertEvent ( outputs [ numberOfCurrentEvents - 1 ] , event , host ) ;
459
+ function checkProjectUpdatedInBackgroundEvent ( session : TestSession , openFiles : string [ ] ) {
460
+ checkNthEvent ( session , ts . server . toEvent ( "projectsUpdatedInBackground" , { openFiles } ) , 0 , /*isMostRecent*/ true ) ;
467
461
}
468
462
469
- function checkProjectUpdatedInBackgroundEvent ( host : TestServerHost , openFiles : string [ ] ) {
470
- const outputs = host . getOutput ( ) ;
471
- assert . equal ( outputs . length , 1 , outputs . toString ( ) ) ;
472
- const event : protocol . ProjectsUpdatedInBackgroundEvent = {
473
- seq : 0 ,
474
- type : "event" ,
475
- event : "projectsUpdatedInBackground" ,
476
- body : {
477
- openFiles
478
- }
479
- } ;
480
- assertEvent ( outputs [ 0 ] , event , host ) ;
463
+ function checkNthEvent ( session : TestSession , expectedEvent : protocol . Event , index : number , isMostRecent : boolean ) {
464
+ const events = session . events ;
465
+ assert . deepEqual ( events [ index ] , expectedEvent ) ;
466
+
467
+ const outputs = session . host . getOutput ( ) ;
468
+ assert . equal ( outputs [ index ] , server . formatMessage ( expectedEvent , nullLogger , Utils . byteLength , session . host . newLine ) ) ;
469
+
470
+ if ( isMostRecent ) {
471
+ assert . strictEqual ( events . length , index + 1 , JSON . stringify ( events ) ) ;
472
+ assert . strictEqual ( outputs . length , index + 1 , JSON . stringify ( outputs ) ) ;
473
+ }
481
474
}
482
475
483
476
describe ( "tsserverProjectSystem" , ( ) => {
@@ -2891,14 +2884,14 @@ namespace ts.projectSystem {
2891
2884
2892
2885
assert . isFalse ( hasError ) ;
2893
2886
host . checkTimeoutQueueLength ( 2 ) ;
2894
- checkErrorMessage ( host , "syntaxDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2895
- host . clearOutput ( ) ;
2887
+ checkErrorMessage ( session , "syntaxDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2888
+ session . clearMessages ( ) ;
2896
2889
2897
2890
host . runQueuedImmediateCallbacks ( ) ;
2898
2891
assert . isFalse ( hasError ) ;
2899
- checkErrorMessage ( host , "semanticDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2892
+ checkErrorMessage ( session , "semanticDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2900
2893
2901
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
2894
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
2902
2895
}
2903
2896
2904
2897
it ( "has projectRoot" , ( ) => {
@@ -2942,7 +2935,7 @@ namespace ts.projectSystem {
2942
2935
verifyErrorsInApp ( ) ;
2943
2936
2944
2937
function verifyErrorsInApp ( ) {
2945
- host . clearOutput ( ) ;
2938
+ session . clearMessages ( ) ;
2946
2939
const expectedSequenceId = session . getNextSeq ( ) ;
2947
2940
session . executeCommandSeq < protocol . GeterrRequest > ( {
2948
2941
command : server . CommandNames . Geterr ,
@@ -2952,13 +2945,13 @@ namespace ts.projectSystem {
2952
2945
}
2953
2946
} ) ;
2954
2947
host . checkTimeoutQueueLengthAndRun ( 1 ) ;
2955
- checkErrorMessage ( host , "syntaxDiag" , { file : app . path , diagnostics : [ ] } ) ;
2956
- host . clearOutput ( ) ;
2948
+ checkErrorMessage ( session , "syntaxDiag" , { file : app . path , diagnostics : [ ] } ) ;
2949
+ session . clearMessages ( ) ;
2957
2950
2958
2951
host . runQueuedImmediateCallbacks ( ) ;
2959
- checkErrorMessage ( host , "semanticDiag" , { file : app . path , diagnostics : [ ] } ) ;
2960
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
2961
- host . clearOutput ( ) ;
2952
+ checkErrorMessage ( session , "semanticDiag" , { file : app . path , diagnostics : [ ] } ) ;
2953
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
2954
+ session . clearMessages ( ) ;
2962
2955
}
2963
2956
} ) ;
2964
2957
} ) ;
@@ -3683,7 +3676,7 @@ namespace ts.projectSystem {
3683
3676
}
3684
3677
} ) ;
3685
3678
checkNumberOfProjects ( service , { inferredProjects : 1 } ) ;
3686
- host . clearOutput ( ) ;
3679
+ session . clearMessages ( ) ;
3687
3680
const expectedSequenceId = session . getNextSeq ( ) ;
3688
3681
session . executeCommandSeq < protocol . GeterrRequest > ( {
3689
3682
command : server . CommandNames . Geterr ,
@@ -3694,23 +3687,24 @@ namespace ts.projectSystem {
3694
3687
} ) ;
3695
3688
3696
3689
host . checkTimeoutQueueLengthAndRun ( 1 ) ;
3697
- checkErrorMessage ( host , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3698
- host . clearOutput ( ) ;
3690
+ checkErrorMessage ( session , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3691
+ session . clearMessages ( ) ;
3699
3692
3700
3693
host . runQueuedImmediateCallbacks ( ) ;
3701
3694
const moduleNotFound = Diagnostics . Cannot_find_module_0 ;
3702
3695
const startOffset = file1 . content . indexOf ( '"' ) + 1 ;
3703
- checkErrorMessage ( host , "semanticDiag" , {
3696
+ checkErrorMessage ( session , "semanticDiag" , {
3704
3697
file : file1 . path , diagnostics : [ {
3705
3698
start : { line : 1 , offset : startOffset } ,
3706
3699
end : { line : 1 , offset : startOffset + '"pad"' . length } ,
3707
3700
text : formatStringFromArgs ( moduleNotFound . message , [ "pad" ] ) ,
3708
3701
code : moduleNotFound . code ,
3709
- category : DiagnosticCategory [ moduleNotFound . category ] . toLowerCase ( )
3702
+ category : DiagnosticCategory [ moduleNotFound . category ] . toLowerCase ( ) ,
3703
+ source : undefined
3710
3704
} ]
3711
3705
} ) ;
3712
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
3713
- host . clearOutput ( ) ;
3706
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
3707
+ session . clearMessages ( ) ;
3714
3708
3715
3709
const padIndex : FileOrFolder = {
3716
3710
path : `${ folderPath } /node_modules/@types/pad/index.d.ts` ,
@@ -3719,15 +3713,15 @@ namespace ts.projectSystem {
3719
3713
files . push ( padIndex ) ;
3720
3714
host . reloadFS ( files , { ignoreWatchInvokedWithTriggerAsFileCreate : true } ) ;
3721
3715
host . runQueuedTimeoutCallbacks ( ) ;
3722
- checkProjectUpdatedInBackgroundEvent ( host , [ file1 . path ] ) ;
3723
- host . clearOutput ( ) ;
3716
+ checkProjectUpdatedInBackgroundEvent ( session , [ file1 . path ] ) ;
3717
+ session . clearMessages ( ) ;
3724
3718
3725
3719
host . runQueuedTimeoutCallbacks ( ) ;
3726
- checkErrorMessage ( host , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3727
- host . clearOutput ( ) ;
3720
+ checkErrorMessage ( session , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3721
+ session . clearMessages ( ) ;
3728
3722
3729
3723
host . runQueuedImmediateCallbacks ( ) ;
3730
- checkErrorMessage ( host , "semanticDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3724
+ checkErrorMessage ( session , "semanticDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3731
3725
} ) ;
3732
3726
} ) ;
3733
3727
@@ -4841,7 +4835,7 @@ namespace ts.projectSystem {
4841
4835
command : "projectInfo" ,
4842
4836
arguments : { file : f1 . path }
4843
4837
} ) ;
4844
- host . clearOutput ( ) ;
4838
+ session . clearMessages ( ) ;
4845
4839
4846
4840
// cancel previously issued Geterr
4847
4841
cancellationToken . setRequestToCancel ( getErrId ) ;
@@ -4865,7 +4859,7 @@ namespace ts.projectSystem {
4865
4859
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4866
4860
const e1 = < protocol . Event > getMessage ( 0 ) ;
4867
4861
assert . equal ( e1 . event , "syntaxDiag" ) ;
4868
- host . clearOutput ( ) ;
4862
+ session . clearMessages ( ) ;
4869
4863
4870
4864
cancellationToken . setRequestToCancel ( getErrId ) ;
4871
4865
host . runQueuedImmediateCallbacks ( ) ;
@@ -4887,7 +4881,7 @@ namespace ts.projectSystem {
4887
4881
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4888
4882
const e1 = < protocol . Event > getMessage ( 0 ) ;
4889
4883
assert . equal ( e1 . event , "syntaxDiag" ) ;
4890
- host . clearOutput ( ) ;
4884
+ session . clearMessages ( ) ;
4891
4885
4892
4886
// the semanticDiag message
4893
4887
host . runQueuedImmediateCallbacks ( ) ;
@@ -4910,7 +4904,7 @@ namespace ts.projectSystem {
4910
4904
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4911
4905
const e1 = < protocol . Event > getMessage ( 0 ) ;
4912
4906
assert . equal ( e1 . event , "syntaxDiag" ) ;
4913
- host . clearOutput ( ) ;
4907
+ session . clearMessages ( ) ;
4914
4908
4915
4909
session . executeCommandSeq ( < protocol . GeterrRequest > {
4916
4910
command : "geterr" ,
@@ -4924,7 +4918,7 @@ namespace ts.projectSystem {
4924
4918
const event = < protocol . RequestCompletedEvent > getMessage ( n ) ;
4925
4919
assert . equal ( event . event , "requestCompleted" ) ;
4926
4920
assert . equal ( event . body . request_seq , expectedSeq , "expectedSeq" ) ;
4927
- host . clearOutput ( ) ;
4921
+ session . clearMessages ( ) ;
4928
4922
}
4929
4923
4930
4924
function getMessage ( n : number ) {
@@ -6427,7 +6421,7 @@ namespace ts.projectSystem {
6427
6421
} ) ;
6428
6422
6429
6423
// Verified the events, reset them
6430
- host . clearOutput ( ) ;
6424
+ session . clearMessages ( ) ;
6431
6425
}
6432
6426
}
6433
6427
} ) ;
0 commit comments