@@ -3051,6 +3051,10 @@ Actual: ${stringify(fullActual)}`);
30513051 }
30523052 }
30533053
3054+ public verifyRefactorsAvailable ( names : ReadonlyArray < string > ) : void {
3055+ assert . deepEqual ( unique ( this . getApplicableRefactors ( this . getSelection ( ) ) , r => r . name ) , names ) ;
3056+ }
3057+
30543058 public verifyRefactor ( { name, actionName, refactors } : FourSlashInterface . VerifyRefactorOptions ) {
30553059 const actualRefactors = this . getApplicableRefactors ( this . getSelection ( ) ) . filter ( r => r . name === name && r . actions . some ( a => a . name === actionName ) ) ;
30563060 this . assertObjectsEqual ( actualRefactors , refactors ) ;
@@ -3092,32 +3096,44 @@ Actual: ${stringify(fullActual)}`);
30923096 this . applyEdits ( edit . fileName , edit . textChanges , /*isFormattingEdit*/ false ) ;
30933097 }
30943098
3095- const { renamePosition, newContent } = parseNewContent ( ) ;
3099+ let renameFilename : string | undefined ;
3100+ let renamePosition : number | undefined ;
30963101
3097- this . verifyCurrentFileContent ( newContent ) ;
3102+ const newFileContents = typeof newContentWithRenameMarker === "string" ? { [ this . activeFile . fileName ] : newContentWithRenameMarker } : newContentWithRenameMarker ;
3103+ for ( const fileName in newFileContents ) {
3104+ const { renamePosition : rp , newContent } = TestState . parseNewContent ( newFileContents [ fileName ] ) ;
3105+ if ( renamePosition === undefined ) {
3106+ renameFilename = fileName ;
3107+ renamePosition = rp ;
3108+ }
3109+ else {
3110+ ts . Debug . assert ( rp === undefined ) ;
3111+ }
3112+ this . verifyFileContent ( fileName , newContent ) ;
3113+
3114+ }
30983115
30993116 if ( renamePosition === undefined ) {
31003117 if ( editInfo . renameLocation !== undefined ) {
31013118 this . raiseError ( `Did not expect a rename location, got ${ editInfo . renameLocation } ` ) ;
31023119 }
31033120 }
31043121 else {
3105- // TODO: test editInfo.renameFilename value
3106- assert . isDefined ( editInfo . renameFilename ) ;
3122+ this . assertObjectsEqual ( editInfo . renameFilename , renameFilename ) ;
31073123 if ( renamePosition !== editInfo . renameLocation ) {
31083124 this . raiseError ( `Expected rename position of ${ renamePosition } , but got ${ editInfo . renameLocation } ` ) ;
31093125 }
31103126 }
3127+ }
31113128
3112- function parseNewContent ( ) : { renamePosition : number | undefined , newContent : string } {
3113- const renamePosition = newContentWithRenameMarker . indexOf ( "/*RENAME*/" ) ;
3114- if ( renamePosition === - 1 ) {
3115- return { renamePosition : undefined , newContent : newContentWithRenameMarker } ;
3116- }
3117- else {
3118- const newContent = newContentWithRenameMarker . slice ( 0 , renamePosition ) + newContentWithRenameMarker . slice ( renamePosition + "/*RENAME*/" . length ) ;
3119- return { renamePosition, newContent } ;
3120- }
3129+ private static parseNewContent ( newContentWithRenameMarker : string ) : { readonly renamePosition : number | undefined , readonly newContent : string } {
3130+ const renamePosition = newContentWithRenameMarker . indexOf ( "/*RENAME*/" ) ;
3131+ if ( renamePosition === - 1 ) {
3132+ return { renamePosition : undefined , newContent : newContentWithRenameMarker } ;
3133+ }
3134+ else {
3135+ const newContent = newContentWithRenameMarker . slice ( 0 , renamePosition ) + newContentWithRenameMarker . slice ( renamePosition + "/*RENAME*/" . length ) ;
3136+ return { renamePosition, newContent } ;
31213137 }
31223138 }
31233139
@@ -3821,7 +3837,7 @@ ${code}
38213837 }
38223838
38233839 /** Collects an array of unique outputs. */
3824- function unique < T > ( inputs : T [ ] , getOutput : ( t : T ) => string ) : string [ ] {
3840+ function unique < T > ( inputs : ReadonlyArray < T > , getOutput : ( t : T ) => string ) : string [ ] {
38253841 const set = ts . createMap < true > ( ) ;
38263842 for ( const input of inputs ) {
38273843 const out = getOutput ( input ) ;
@@ -4112,6 +4128,10 @@ namespace FourSlashInterface {
41124128 this . state . verifyApplicableRefactorAvailableForRange ( this . negative ) ;
41134129 }
41144130
4131+ public refactorsAvailable ( names : ReadonlyArray < string > ) : void {
4132+ this . state . verifyRefactorsAvailable ( names ) ;
4133+ }
4134+
41154135 public refactor ( options : VerifyRefactorOptions ) {
41164136 this . state . verifyRefactor ( options ) ;
41174137 }
@@ -4734,7 +4754,7 @@ namespace FourSlashInterface {
47344754 refactorName : string ;
47354755 actionName : string ;
47364756 actionDescription : string ;
4737- newContent : string ;
4757+ newContent : NewFileContent ;
47384758 }
47394759
47404760 export type ExpectedCompletionEntry = string | {
@@ -4796,9 +4816,11 @@ namespace FourSlashInterface {
47964816 filesToSearch ?: ReadonlyArray < string > ;
47974817 }
47984818
4819+ export type NewFileContent = string | { readonly [ filename : string ] : string } ;
4820+
47994821 export interface NewContentOptions {
48004822 // Exactly one of these should be defined.
4801- newFileContent ?: string | { readonly [ filename : string ] : string } ;
4823+ newFileContent ?: NewFileContent ;
48024824 newRangeContent ?: string ;
48034825 }
48044826
0 commit comments