Path: blob/main/src/vs/workbench/api/test/browser/mainThreadDiagnostics.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 { timeout } from '../../../../base/common/async.js';7import { URI, UriComponents } from '../../../../base/common/uri.js';8import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';10import { MarkerService } from '../../../../platform/markers/common/markerService.js';11import { IMarkerData } from '../../../../platform/markers/common/markers.js';12import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js';13import { MainThreadDiagnostics } from '../../browser/mainThreadDiagnostics.js';14import { IExtHostContext } from '../../../services/extensions/common/extHostCustomers.js';15import { ExtensionHostKind } from '../../../services/extensions/common/extensionHostKind.js';16import { mock } from '../../../test/common/workbenchTestServices.js';171819suite('MainThreadDiagnostics', function () {2021let markerService: MarkerService;2223setup(function () {24markerService = new MarkerService();25});2627teardown(function () {28markerService.dispose();29});3031ensureNoDisposablesAreLeakedInTestSuite();3233test('clear markers on dispose', function () {3435const diag = new MainThreadDiagnostics(36new class implements IExtHostContext {37remoteAuthority = '';38extensionHostKind = ExtensionHostKind.LocalProcess;39dispose() { }40assertRegistered() { }41set(v: any): any { return null; }42getProxy(): any {43return {44$acceptMarkersChange() { }45};46}47drain(): any { return null; }48},49markerService,50new class extends mock<IUriIdentityService>() {51override asCanonicalUri(uri: URI) { return uri; }52}53);5455diag.$changeMany('foo', [[URI.file('a'), [{56code: '666',57startLineNumber: 1,58startColumn: 1,59endLineNumber: 1,60endColumn: 1,61message: 'fffff',62severity: 1,63source: 'me'64}]]]);6566assert.strictEqual(markerService.read().length, 1);67diag.dispose();68assert.strictEqual(markerService.read().length, 0);69});7071test('OnDidChangeDiagnostics triggers twice on same diagnostics #136434', function () {7273return runWithFakedTimers({}, async () => {7475const changedData: [UriComponents, IMarkerData[]][][] = [];7677const diag = new MainThreadDiagnostics(78new class implements IExtHostContext {79remoteAuthority = '';80extensionHostKind = ExtensionHostKind.LocalProcess;81dispose() { }82assertRegistered() { }83set(v: any): any { return null; }84getProxy(): any {85return {86$acceptMarkersChange(data: [UriComponents, IMarkerData[]][]) {87changedData.push(data);88}89};90}91drain(): any { return null; }92},93markerService,94new class extends mock<IUriIdentityService>() {95override asCanonicalUri(uri: URI) { return uri; }96}97);9899const markerDataStub = {100code: '666',101startLineNumber: 1,102startColumn: 1,103endLineNumber: 1,104endColumn: 1,105severity: 1,106source: 'me'107};108const target = URI.file('a');109diag.$changeMany('foo', [[target, [{ ...markerDataStub, message: 'same_owner' }]]]);110markerService.changeOne('bar', target, [{ ...markerDataStub, message: 'forgein_owner' }]);111112// added one marker via the API and one via the ext host. the latter must not113// trigger an event to the extension host114115await timeout(0);116assert.strictEqual(markerService.read().length, 2);117assert.strictEqual(changedData.length, 1);118assert.strictEqual(changedData[0].length, 1);119assert.strictEqual(changedData[0][0][1][0].message, 'forgein_owner');120121diag.dispose();122});123});124125test('onDidChangeDiagnostics different behavior when "extensionKind" ui running on remote workspace #136955', function () {126return runWithFakedTimers({}, async () => {127128const markerData: IMarkerData = {129code: '666',130startLineNumber: 1,131startColumn: 1,132endLineNumber: 1,133endColumn: 1,134severity: 1,135source: 'me',136message: 'message'137};138const target = URI.file('a');139markerService.changeOne('bar', target, [markerData]);140141const changedData: [UriComponents, IMarkerData[]][][] = [];142143const diag = new MainThreadDiagnostics(144new class implements IExtHostContext {145remoteAuthority = '';146extensionHostKind = ExtensionHostKind.LocalProcess;147dispose() { }148assertRegistered() { }149set(v: any): any { return null; }150getProxy(): any {151return {152$acceptMarkersChange(data: [UriComponents, IMarkerData[]][]) {153changedData.push(data);154}155};156}157drain(): any { return null; }158},159markerService,160new class extends mock<IUriIdentityService>() {161override asCanonicalUri(uri: URI) { return uri; }162}163);164165diag.$clear('bar');166await timeout(0);167assert.strictEqual(markerService.read().length, 0);168assert.strictEqual(changedData.length, 1);169170diag.dispose();171});172});173});174175176