@@ -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" , ( ) => {
@@ -2887,14 +2880,14 @@ namespace ts.projectSystem {
2887
2880
2888
2881
assert . isFalse ( hasError ) ;
2889
2882
host . checkTimeoutQueueLength ( 2 ) ;
2890
- checkErrorMessage ( host , "syntaxDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2891
- host . clearOutput ( ) ;
2883
+ checkErrorMessage ( session , "syntaxDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2884
+ session . clearMessages ( ) ;
2892
2885
2893
2886
host . runQueuedImmediateCallbacks ( ) ;
2894
2887
assert . isFalse ( hasError ) ;
2895
- checkErrorMessage ( host , "semanticDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2888
+ checkErrorMessage ( session , "semanticDiag" , { file : untitledFile , diagnostics : [ ] } ) ;
2896
2889
2897
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
2890
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
2898
2891
}
2899
2892
2900
2893
it ( "has projectRoot" , ( ) => {
@@ -2938,7 +2931,7 @@ namespace ts.projectSystem {
2938
2931
verifyErrorsInApp ( ) ;
2939
2932
2940
2933
function verifyErrorsInApp ( ) {
2941
- host . clearOutput ( ) ;
2934
+ session . clearMessages ( ) ;
2942
2935
const expectedSequenceId = session . getNextSeq ( ) ;
2943
2936
session . executeCommandSeq < protocol . GeterrRequest > ( {
2944
2937
command : server . CommandNames . Geterr ,
@@ -2948,13 +2941,13 @@ namespace ts.projectSystem {
2948
2941
}
2949
2942
} ) ;
2950
2943
host . checkTimeoutQueueLengthAndRun ( 1 ) ;
2951
- checkErrorMessage ( host , "syntaxDiag" , { file : app . path , diagnostics : [ ] } ) ;
2952
- host . clearOutput ( ) ;
2944
+ checkErrorMessage ( session , "syntaxDiag" , { file : app . path , diagnostics : [ ] } ) ;
2945
+ session . clearMessages ( ) ;
2953
2946
2954
2947
host . runQueuedImmediateCallbacks ( ) ;
2955
- checkErrorMessage ( host , "semanticDiag" , { file : app . path , diagnostics : [ ] } ) ;
2956
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
2957
- host . clearOutput ( ) ;
2948
+ checkErrorMessage ( session , "semanticDiag" , { file : app . path , diagnostics : [ ] } ) ;
2949
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
2950
+ session . clearMessages ( ) ;
2958
2951
}
2959
2952
} ) ;
2960
2953
} ) ;
@@ -3679,7 +3672,7 @@ namespace ts.projectSystem {
3679
3672
}
3680
3673
} ) ;
3681
3674
checkNumberOfProjects ( service , { inferredProjects : 1 } ) ;
3682
- host . clearOutput ( ) ;
3675
+ session . clearMessages ( ) ;
3683
3676
const expectedSequenceId = session . getNextSeq ( ) ;
3684
3677
session . executeCommandSeq < protocol . GeterrRequest > ( {
3685
3678
command : server . CommandNames . Geterr ,
@@ -3690,23 +3683,24 @@ namespace ts.projectSystem {
3690
3683
} ) ;
3691
3684
3692
3685
host . checkTimeoutQueueLengthAndRun ( 1 ) ;
3693
- checkErrorMessage ( host , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3694
- host . clearOutput ( ) ;
3686
+ checkErrorMessage ( session , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3687
+ session . clearMessages ( ) ;
3695
3688
3696
3689
host . runQueuedImmediateCallbacks ( ) ;
3697
3690
const moduleNotFound = Diagnostics . Cannot_find_module_0 ;
3698
3691
const startOffset = file1 . content . indexOf ( '"' ) + 1 ;
3699
- checkErrorMessage ( host , "semanticDiag" , {
3692
+ checkErrorMessage ( session , "semanticDiag" , {
3700
3693
file : file1 . path , diagnostics : [ {
3701
3694
start : { line : 1 , offset : startOffset } ,
3702
3695
end : { line : 1 , offset : startOffset + '"pad"' . length } ,
3703
3696
text : formatStringFromArgs ( moduleNotFound . message , [ "pad" ] ) ,
3704
3697
code : moduleNotFound . code ,
3705
- category : DiagnosticCategory [ moduleNotFound . category ] . toLowerCase ( )
3698
+ category : DiagnosticCategory [ moduleNotFound . category ] . toLowerCase ( ) ,
3699
+ source : undefined
3706
3700
} ]
3707
3701
} ) ;
3708
- checkCompleteEvent ( host , 2 , expectedSequenceId ) ;
3709
- host . clearOutput ( ) ;
3702
+ checkCompleteEvent ( session , 2 , expectedSequenceId ) ;
3703
+ session . clearMessages ( ) ;
3710
3704
3711
3705
const padIndex : FileOrFolder = {
3712
3706
path : `${ folderPath } /node_modules/@types/pad/index.d.ts` ,
@@ -3715,15 +3709,15 @@ namespace ts.projectSystem {
3715
3709
files . push ( padIndex ) ;
3716
3710
host . reloadFS ( files , { ignoreWatchInvokedWithTriggerAsFileCreate : true } ) ;
3717
3711
host . runQueuedTimeoutCallbacks ( ) ;
3718
- checkProjectUpdatedInBackgroundEvent ( host , [ file1 . path ] ) ;
3719
- host . clearOutput ( ) ;
3712
+ checkProjectUpdatedInBackgroundEvent ( session , [ file1 . path ] ) ;
3713
+ session . clearMessages ( ) ;
3720
3714
3721
3715
host . runQueuedTimeoutCallbacks ( ) ;
3722
- checkErrorMessage ( host , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3723
- host . clearOutput ( ) ;
3716
+ checkErrorMessage ( session , "syntaxDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3717
+ session . clearMessages ( ) ;
3724
3718
3725
3719
host . runQueuedImmediateCallbacks ( ) ;
3726
- checkErrorMessage ( host , "semanticDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3720
+ checkErrorMessage ( session , "semanticDiag" , { file : file1 . path , diagnostics : [ ] } ) ;
3727
3721
} ) ;
3728
3722
} ) ;
3729
3723
@@ -4837,7 +4831,7 @@ namespace ts.projectSystem {
4837
4831
command : "projectInfo" ,
4838
4832
arguments : { file : f1 . path }
4839
4833
} ) ;
4840
- host . clearOutput ( ) ;
4834
+ session . clearMessages ( ) ;
4841
4835
4842
4836
// cancel previously issued Geterr
4843
4837
cancellationToken . setRequestToCancel ( getErrId ) ;
@@ -4861,7 +4855,7 @@ namespace ts.projectSystem {
4861
4855
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4862
4856
const e1 = < protocol . Event > getMessage ( 0 ) ;
4863
4857
assert . equal ( e1 . event , "syntaxDiag" ) ;
4864
- host . clearOutput ( ) ;
4858
+ session . clearMessages ( ) ;
4865
4859
4866
4860
cancellationToken . setRequestToCancel ( getErrId ) ;
4867
4861
host . runQueuedImmediateCallbacks ( ) ;
@@ -4883,7 +4877,7 @@ namespace ts.projectSystem {
4883
4877
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4884
4878
const e1 = < protocol . Event > getMessage ( 0 ) ;
4885
4879
assert . equal ( e1 . event , "syntaxDiag" ) ;
4886
- host . clearOutput ( ) ;
4880
+ session . clearMessages ( ) ;
4887
4881
4888
4882
// the semanticDiag message
4889
4883
host . runQueuedImmediateCallbacks ( ) ;
@@ -4906,7 +4900,7 @@ namespace ts.projectSystem {
4906
4900
assert . equal ( host . getOutput ( ) . length , 1 , "expect 1 message" ) ;
4907
4901
const e1 = < protocol . Event > getMessage ( 0 ) ;
4908
4902
assert . equal ( e1 . event , "syntaxDiag" ) ;
4909
- host . clearOutput ( ) ;
4903
+ session . clearMessages ( ) ;
4910
4904
4911
4905
session . executeCommandSeq ( < protocol . GeterrRequest > {
4912
4906
command : "geterr" ,
@@ -4920,7 +4914,7 @@ namespace ts.projectSystem {
4920
4914
const event = < protocol . RequestCompletedEvent > getMessage ( n ) ;
4921
4915
assert . equal ( event . event , "requestCompleted" ) ;
4922
4916
assert . equal ( event . body . request_seq , expectedSeq , "expectedSeq" ) ;
4923
- host . clearOutput ( ) ;
4917
+ session . clearMessages ( ) ;
4924
4918
}
4925
4919
4926
4920
function getMessage ( n : number ) {
@@ -6423,7 +6417,7 @@ namespace ts.projectSystem {
6423
6417
} ) ;
6424
6418
6425
6419
// Verified the events, reset them
6426
- host . clearOutput ( ) ;
6420
+ session . clearMessages ( ) ;
6427
6421
}
6428
6422
}
6429
6423
} ) ;
0 commit comments