Path: blob/main/src/vs/workbench/api/test/browser/extHostDocumentContentProvider.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import assert from 'assert';6import { URI, UriComponents } from '../../../../base/common/uri.js';7import { ExtHostDocumentsAndEditors } from '../../common/extHostDocumentsAndEditors.js';8import { SingleProxyRPCProtocol } from '../common/testRPCProtocol.js';9import { NullLogService } from '../../../../platform/log/common/log.js';10import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';11import { ExtHostDocumentContentProvider } from '../../common/extHostDocumentContentProviders.js';12import { Emitter } from '../../../../base/common/event.js';13import { MainThreadDocumentContentProvidersShape } from '../../common/extHost.protocol.js';14import { timeout } from '../../../../base/common/async.js';15import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';1617suite('ExtHostDocumentContentProvider', () => {1819ensureNoDisposablesAreLeakedInTestSuite();2021const resource = URI.parse('foo:bar');22let documentContentProvider: ExtHostDocumentContentProvider;23let mainThreadContentProvider: MainThreadDocumentContentProvidersShape;24const changes: [uri: UriComponents, value: string][] = [];2526setup(() => {2728changes.length = 0;2930mainThreadContentProvider = new class implements MainThreadDocumentContentProvidersShape {31$registerTextContentProvider(handle: number, scheme: string): void {3233}34$unregisterTextContentProvider(handle: number): void {3536}37async $onVirtualDocumentChange(uri: UriComponents, value: string): Promise<void> {38await timeout(10);39changes.push([uri, value]);40}41dispose(): void {42throw new Error('Method not implemented.');43}44};4546const ehContext = SingleProxyRPCProtocol(mainThreadContentProvider);47const documentsAndEditors = new ExtHostDocumentsAndEditors(ehContext, new NullLogService());48documentsAndEditors.$acceptDocumentsAndEditorsDelta({49addedDocuments: [{50isDirty: false,51languageId: 'foo',52uri: resource,53versionId: 1,54lines: ['foo'],55EOL: '\n',56encoding: 'utf8'57}]58});59documentContentProvider = new ExtHostDocumentContentProvider(ehContext, documentsAndEditors, new NullLogService());60});6162test('TextDocumentContentProvider drops onDidChange events when they happen quickly #179711', async () => {63await runWithFakedTimers({}, async function () {6465const emitter = new Emitter<URI>();66const contents = ['X', 'Y'];67let counter = 0;6869let stack = 0;7071const d = documentContentProvider.registerTextDocumentContentProvider(resource.scheme, {72onDidChange: emitter.event,73async provideTextDocumentContent(_uri) {74assert.strictEqual(stack, 0);75stack++;76try {77await timeout(0);78return contents[counter++ % contents.length];79} finally {80stack--;81}82}83});8485emitter.fire(resource);86emitter.fire(resource);8788await timeout(100);8990assert.strictEqual(changes.length, 2);91assert.strictEqual(changes[0][1], 'X');92assert.strictEqual(changes[1][1], 'Y');9394d.dispose();95});96});979899});100101102