525
526
export class TestFileService implements IFileService {
528
>
declare readonly _serviceBrand: undefined;
529
>
530
>
private readonly _onDidFilesChange = new Emitter<FileChangesEvent>();
531
>
get onDidFilesChange(): Event<FileChangesEvent> { return this._onDidFilesChange.event; }
532
>
fireFileChanges(event: FileChangesEvent): void { this._onDidFilesChange.fire(event); }
533
>
534
>
private readonly _onDidRunOperation = new Emitter<FileOperationEvent>();
535
>
get onDidRunOperation(): Event<FileOperationEvent> { return this._onDidRunOperation.event; }
536
>
fireAfterOperation(event: FileOperationEvent): void { this._onDidRunOperation.fire(event); }
537
>
538
>
private readonly _onDidChangeFileSystemProviderCapabilities = new Emitter<IFileSystemProviderCapabilitiesChangeEvent>();
539
>
get onDidChangeFileSystemProviderCapabilities(): Event<IFileSystemProviderCapabilitiesChangeEvent> { return this._onDidChangeFileSystemProviderCapabilities.event; }
540
>
fireFileSystemProviderCapabilitiesChangeEvent(event: IFileSystemProviderCapabilitiesChangeEvent): void { this._onDidChangeFileSystemProviderCapabilities.fire(event); }
541
>
542
>
private _onWillActivateFileSystemProvider = new Emitter<IFileSystemProviderActivationEvent>();
543
>
readonly onWillActivateFileSystemProvider = this._onWillActivateFileSystemProvider.event;
544
>
readonly onDidWatchError = Event.None;
545
>
546
>
protected content = 'Hello Html';
547
>
protected lastReadFileUri!: URI;
548
>
549
>
readonly = false;
550
>
551
>
// Tracking functionality for tests
552
>
readonly writeOperations: Array<{ resource: URI; content: string }> = [];
553
>
readonly readOperations: Array<{ resource: URI }> = [];
554
>
555
>
setContent(content: string): void { this.content = content; }
556
>
getContent(): string { return this.content; }
557
>
getLastReadFileUri(): URI { return this.lastReadFileUri; }
558
>
559
>
// Clear tracking data for tests
560
>
clearTracking(): void {
561
this.writeOperations.length = 0;
562
this.readOperations.length = 0;
563
}
565
>
resolve(resource: URI, _options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
566
>
resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat>;
567
>
async resolve(resource: URI, _options?: IResolveFileOptions): Promise<IFileStat> {
568
return createFileStat(resource, this.readonly);
569
}
571
>
stat(resource: URI): Promise<IFileStatWithPartialMetadata> {
572
return this.resolve(resource, { resolveMetadata: true });
573
}
575
>
async realpath(resource: URI): Promise<URI> {
576
return resource;
577
}
579
>
async resolveAll(toResolve: { resource: URI; options?: IResolveFileOptions }[]): Promise<IFileStatResult[]> {
580
const stats = await Promise.all(toResolve.map(resourceAndOption => this.resolve(resourceAndOption.resource, resourceAndOption.options)));
581
582
return stats.map(stat => ({ stat, success: true }));
583
}
585
>
readonly notExistsSet = new ResourceMap<boolean>();
586
>
587
>
async exists(_resource: URI): Promise<boolean> { return !this.notExistsSet.has(_resource); }
588
>
589
>
readShouldThrowError: Error | undefined = undefined;
590
>
591
>
async readFile(resource: URI, options?: IReadFileOptions | undefined): Promise<IFileContent> {
592
if (this.readShouldThrowError) {
593
throw this.readShouldThrowError;