@@ -3036,6 +3036,10 @@ Actual: ${stringify(fullActual)}`);
30363036 }
30373037 }
30383038
3039+ public verifyRefactorsAvailable ( names : ReadonlyArray < string > ) : void {
3040+ assert . deepEqual ( unique ( this . getApplicableRefactors ( this . getSelection ( ) ) , r => r . name ) , names ) ;
3041+ }
3042+
30393043 public verifyRefactor ( { name, actionName, refactors } : FourSlashInterface . VerifyRefactorOptions ) {
30403044 const actualRefactors = this . getApplicableRefactors ( this . getSelection ( ) ) . filter ( r => r . name === name && r . actions . some ( a => a . name === actionName ) ) ;
30413045 this . assertObjectsEqual ( actualRefactors , refactors ) ;
@@ -3077,32 +3081,44 @@ Actual: ${stringify(fullActual)}`);
30773081 this . applyEdits ( edit . fileName , edit . textChanges , /*isFormattingEdit*/ false ) ;
30783082 }
30793083
3080- const { renamePosition, newContent } = parseNewContent ( ) ;
3084+ let renameFilename : string | undefined ;
3085+ let renamePosition : number | undefined ;
30813086
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+ }
30833100
30843101 if ( renamePosition === undefined ) {
30853102 if ( editInfo . renameLocation !== undefined ) {
30863103 this . raiseError ( `Did not expect a rename location, got ${ editInfo . renameLocation } ` ) ;
30873104 }
30883105 }
30893106 else {
3090- // TODO: test editInfo.renameFilename value
3091- assert . isDefined ( editInfo . renameFilename ) ;
3107+ this . assertObjectsEqual ( editInfo . renameFilename , renameFilename ) ;
30923108 if ( renamePosition !== editInfo . renameLocation ) {
30933109 this . raiseError ( `Expected rename position of ${ renamePosition } , but got ${ editInfo . renameLocation } ` ) ;
30943110 }
30953111 }
3112+ }
30963113
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 } ;
31063122 }
31073123 }
31083124
@@ -3806,7 +3822,7 @@ ${code}
38063822 }
38073823
38083824 /** 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 [ ] {
38103826 const set = ts . createMap < true > ( ) ;
38113827 for ( const input of inputs ) {
38123828 const out = getOutput ( input ) ;
@@ -4097,6 +4113,10 @@ namespace FourSlashInterface {
40974113 this . state . verifyApplicableRefactorAvailableForRange ( this . negative ) ;
40984114 }
40994115
4116+ public refactorsAvailable ( names : ReadonlyArray < string > ) : void {
4117+ this . state . verifyRefactorsAvailable ( names ) ;
4118+ }
4119+
41004120 public refactor ( options : VerifyRefactorOptions ) {
41014121 this . state . verifyRefactor ( options ) ;
41024122 }
@@ -4719,7 +4739,7 @@ namespace FourSlashInterface {
47194739 refactorName : string ;
47204740 actionName : string ;
47214741 actionDescription : string ;
4722- newContent : string ;
4742+ newContent : NewFileContent ;
47234743 }
47244744
47254745 export type ExpectedCompletionEntry = string | {
@@ -4781,9 +4801,11 @@ namespace FourSlashInterface {
47814801 filesToSearch ?: ReadonlyArray < string > ;
47824802 }
47834803
4804+ export type NewFileContent = string | { readonly [ filename : string ] : string } ;
4805+
47844806 export interface NewContentOptions {
47854807 // Exactly one of these should be defined.
4786- newFileContent ?: string | { readonly [ filename : string ] : string } ;
4808+ newFileContent ?: NewFileContent ;
47874809 newRangeContent ?: string ;
47884810 }
47894811
0 commit comments