@@ -3036,6 +3036,10 @@ Actual: ${stringify(fullActual)}`);
3036
3036
}
3037
3037
}
3038
3038
3039
+ public verifyRefactorsAvailable ( names : ReadonlyArray < string > ) : void {
3040
+ assert . deepEqual ( unique ( this . getApplicableRefactors ( this . getSelection ( ) ) , r => r . name ) , names ) ;
3041
+ }
3042
+
3039
3043
public verifyRefactor ( { name, actionName, refactors } : FourSlashInterface . VerifyRefactorOptions ) {
3040
3044
const actualRefactors = this . getApplicableRefactors ( this . getSelection ( ) ) . filter ( r => r . name === name && r . actions . some ( a => a . name === actionName ) ) ;
3041
3045
this . assertObjectsEqual ( actualRefactors , refactors ) ;
@@ -3077,32 +3081,44 @@ Actual: ${stringify(fullActual)}`);
3077
3081
this . applyEdits ( edit . fileName , edit . textChanges , /*isFormattingEdit*/ false ) ;
3078
3082
}
3079
3083
3080
- const { renamePosition, newContent } = parseNewContent ( ) ;
3084
+ let renameFilename : string | undefined ;
3085
+ let renamePosition : number | undefined ;
3081
3086
3082
- this . verifyCurrentFileContent ( newContent ) ;
3087
+ const newFileContents = typeof newContentWithRenameMarker === "string" ? { [ this . activeFile . fileName ] : newContentWithRenameMarker } : newContentWithRenameMarker ;
3088
+ for ( const fileName in newFileContents ) {
3089
+ const { renamePosition : rp , newContent } = TestState . parseNewContent ( newFileContents [ fileName ] ) ;
3090
+ if ( renamePosition === undefined ) {
3091
+ renameFilename = fileName ;
3092
+ renamePosition = rp ;
3093
+ }
3094
+ else {
3095
+ ts . Debug . assert ( rp === undefined ) ;
3096
+ }
3097
+ this . verifyFileContent ( fileName , newContent ) ;
3098
+
3099
+ }
3083
3100
3084
3101
if ( renamePosition === undefined ) {
3085
3102
if ( editInfo . renameLocation !== undefined ) {
3086
3103
this . raiseError ( `Did not expect a rename location, got ${ editInfo . renameLocation } ` ) ;
3087
3104
}
3088
3105
}
3089
3106
else {
3090
- // TODO: test editInfo.renameFilename value
3091
- assert . isDefined ( editInfo . renameFilename ) ;
3107
+ this . assertObjectsEqual ( editInfo . renameFilename , renameFilename ) ;
3092
3108
if ( renamePosition !== editInfo . renameLocation ) {
3093
3109
this . raiseError ( `Expected rename position of ${ renamePosition } , but got ${ editInfo . renameLocation } ` ) ;
3094
3110
}
3095
3111
}
3112
+ }
3096
3113
3097
- function parseNewContent ( ) : { renamePosition : number | undefined , newContent : string } {
3098
- const renamePosition = newContentWithRenameMarker . indexOf ( "/*RENAME*/" ) ;
3099
- if ( renamePosition === - 1 ) {
3100
- return { renamePosition : undefined , newContent : newContentWithRenameMarker } ;
3101
- }
3102
- else {
3103
- const newContent = newContentWithRenameMarker . slice ( 0 , renamePosition ) + newContentWithRenameMarker . slice ( renamePosition + "/*RENAME*/" . length ) ;
3104
- return { renamePosition, newContent } ;
3105
- }
3114
+ private static parseNewContent ( newContentWithRenameMarker : string ) : { readonly renamePosition : number | undefined , readonly newContent : string } {
3115
+ const renamePosition = newContentWithRenameMarker . indexOf ( "/*RENAME*/" ) ;
3116
+ if ( renamePosition === - 1 ) {
3117
+ return { renamePosition : undefined , newContent : newContentWithRenameMarker } ;
3118
+ }
3119
+ else {
3120
+ const newContent = newContentWithRenameMarker . slice ( 0 , renamePosition ) + newContentWithRenameMarker . slice ( renamePosition + "/*RENAME*/" . length ) ;
3121
+ return { renamePosition, newContent } ;
3106
3122
}
3107
3123
}
3108
3124
@@ -3806,7 +3822,7 @@ ${code}
3806
3822
}
3807
3823
3808
3824
/** Collects an array of unique outputs. */
3809
- function unique < T > ( inputs : T [ ] , getOutput : ( t : T ) => string ) : string [ ] {
3825
+ function unique < T > ( inputs : ReadonlyArray < T > , getOutput : ( t : T ) => string ) : string [ ] {
3810
3826
const set = ts . createMap < true > ( ) ;
3811
3827
for ( const input of inputs ) {
3812
3828
const out = getOutput ( input ) ;
@@ -4097,6 +4113,10 @@ namespace FourSlashInterface {
4097
4113
this . state . verifyApplicableRefactorAvailableForRange ( this . negative ) ;
4098
4114
}
4099
4115
4116
+ public refactorsAvailable ( names : ReadonlyArray < string > ) : void {
4117
+ this . state . verifyRefactorsAvailable ( names ) ;
4118
+ }
4119
+
4100
4120
public refactor ( options : VerifyRefactorOptions ) {
4101
4121
this . state . verifyRefactor ( options ) ;
4102
4122
}
@@ -4719,7 +4739,7 @@ namespace FourSlashInterface {
4719
4739
refactorName : string ;
4720
4740
actionName : string ;
4721
4741
actionDescription : string ;
4722
- newContent : string ;
4742
+ newContent : NewFileContent ;
4723
4743
}
4724
4744
4725
4745
export type ExpectedCompletionEntry = string | {
@@ -4781,9 +4801,11 @@ namespace FourSlashInterface {
4781
4801
filesToSearch ?: ReadonlyArray < string > ;
4782
4802
}
4783
4803
4804
+ export type NewFileContent = string | { readonly [ filename : string ] : string } ;
4805
+
4784
4806
export interface NewContentOptions {
4785
4807
// Exactly one of these should be defined.
4786
- newFileContent ?: string | { readonly [ filename : string ] : string } ;
4808
+ newFileContent ?: NewFileContent ;
4787
4809
newRangeContent ?: string ;
4788
4810
}
4789
4811
0 commit comments