Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/test/browser/extHostDiagnostics.test.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { URI, UriComponents } from '../../../../base/common/uri.js';
8
import { DiagnosticCollection, ExtHostDiagnostics } from '../../common/extHostDiagnostics.js';
9
import { Diagnostic, DiagnosticSeverity, Range, DiagnosticRelatedInformation, Location } from '../../common/extHostTypes.js';
10
import { MainThreadDiagnosticsShape, IMainContext } from '../../common/extHost.protocol.js';
11
import { IMarkerData, MarkerSeverity } from '../../../../platform/markers/common/markers.js';
12
import { mock } from '../../../../base/test/common/mock.js';
13
import { Emitter, Event } from '../../../../base/common/event.js';
14
import { NullLogService } from '../../../../platform/log/common/log.js';
15
import type * as vscode from 'vscode';
16
import { nullExtensionDescription } from '../../../services/extensions/common/extensions.js';
17
import { ExtUri, extUri } from '../../../../base/common/resources.js';
18
import { IExtHostFileSystemInfo } from '../../common/extHostFileSystemInfo.js';
19
import { runWithFakedTimers } from '../../../../base/test/common/timeTravelScheduler.js';
20
import { IExtHostDocumentsAndEditors } from '../../common/extHostDocumentsAndEditors.js';
21
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
22
23
suite('ExtHostDiagnostics', () => {
24
25
class DiagnosticsShape extends mock<MainThreadDiagnosticsShape>() {
26
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]): void {
27
//
28
}
29
override $clear(owner: string): void {
30
//
31
}
32
}
33
34
const fileSystemInfoService = new class extends mock<IExtHostFileSystemInfo>() {
35
override readonly extUri = extUri;
36
};
37
38
const versionProvider = (uri: URI): number | undefined => {
39
return undefined;
40
};
41
42
const store = ensureNoDisposablesAreLeakedInTestSuite();
43
44
test('disposeCheck', () => {
45
46
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
47
48
collection.dispose();
49
collection.dispose(); // that's OK
50
assert.throws(() => collection.name);
51
assert.throws(() => collection.clear());
52
assert.throws(() => collection.delete(URI.parse('aa:bb')));
53
assert.throws(() => collection.forEach(() => { }));
54
assert.throws(() => collection.get(URI.parse('aa:bb')));
55
assert.throws(() => collection.has(URI.parse('aa:bb')));
56
assert.throws(() => collection.set(URI.parse('aa:bb'), []));
57
assert.throws(() => collection.set(URI.parse('aa:bb'), undefined!));
58
});
59
60
61
test('diagnostic collection, forEach, clear, has', function () {
62
let collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
63
assert.strictEqual(collection.name, 'test');
64
collection.dispose();
65
assert.throws(() => collection.name);
66
67
let c = 0;
68
collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
69
collection.forEach(() => c++);
70
assert.strictEqual(c, 0);
71
72
collection.set(URI.parse('foo:bar'), [
73
new Diagnostic(new Range(0, 0, 1, 1), 'message-1'),
74
new Diagnostic(new Range(0, 0, 1, 1), 'message-2')
75
]);
76
collection.forEach(() => c++);
77
assert.strictEqual(c, 1);
78
79
c = 0;
80
collection.clear();
81
collection.forEach(() => c++);
82
assert.strictEqual(c, 0);
83
84
collection.set(URI.parse('foo:bar1'), [
85
new Diagnostic(new Range(0, 0, 1, 1), 'message-1'),
86
new Diagnostic(new Range(0, 0, 1, 1), 'message-2')
87
]);
88
collection.set(URI.parse('foo:bar2'), [
89
new Diagnostic(new Range(0, 0, 1, 1), 'message-1'),
90
new Diagnostic(new Range(0, 0, 1, 1), 'message-2')
91
]);
92
collection.forEach(() => c++);
93
assert.strictEqual(c, 2);
94
95
assert.ok(collection.has(URI.parse('foo:bar1')));
96
assert.ok(collection.has(URI.parse('foo:bar2')));
97
assert.ok(!collection.has(URI.parse('foo:bar3')));
98
collection.delete(URI.parse('foo:bar1'));
99
assert.ok(!collection.has(URI.parse('foo:bar1')));
100
101
collection.dispose();
102
});
103
104
test('diagnostic collection, immutable read', function () {
105
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
106
collection.set(URI.parse('foo:bar'), [
107
new Diagnostic(new Range(0, 0, 1, 1), 'message-1'),
108
new Diagnostic(new Range(0, 0, 1, 1), 'message-2')
109
]);
110
111
let array = collection.get(URI.parse('foo:bar')) as Diagnostic[];
112
assert.throws(() => array.length = 0);
113
assert.throws(() => array.pop());
114
assert.throws(() => array[0] = new Diagnostic(new Range(0, 0, 0, 0), 'evil'));
115
116
collection.forEach((uri: URI, array: readonly vscode.Diagnostic[]): any => {
117
assert.throws(() => (array as Diagnostic[]).length = 0);
118
assert.throws(() => (array as Diagnostic[]).pop());
119
assert.throws(() => (array as Diagnostic[])[0] = new Diagnostic(new Range(0, 0, 0, 0), 'evil'));
120
});
121
122
array = collection.get(URI.parse('foo:bar')) as Diagnostic[];
123
assert.strictEqual(array.length, 2);
124
125
collection.dispose();
126
});
127
128
129
test('diagnostics collection, set with dupliclated tuples', function () {
130
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
131
const uri = URI.parse('sc:hightower');
132
collection.set([
133
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-1')]],
134
[URI.parse('some:thing'), [new Diagnostic(new Range(0, 0, 1, 1), 'something')]],
135
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-2')]],
136
]);
137
138
let array = collection.get(uri);
139
assert.strictEqual(array.length, 2);
140
let [first, second] = array;
141
assert.strictEqual(first.message, 'message-1');
142
assert.strictEqual(second.message, 'message-2');
143
144
// clear
145
collection.delete(uri);
146
assert.ok(!collection.has(uri));
147
148
// bad tuple clears 1/2
149
collection.set([
150
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-1')]],
151
[URI.parse('some:thing'), [new Diagnostic(new Range(0, 0, 1, 1), 'something')]],
152
[uri, undefined!]
153
]);
154
assert.ok(!collection.has(uri));
155
156
// clear
157
collection.delete(uri);
158
assert.ok(!collection.has(uri));
159
160
// bad tuple clears 2/2
161
collection.set([
162
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-1')]],
163
[URI.parse('some:thing'), [new Diagnostic(new Range(0, 0, 1, 1), 'something')]],
164
[uri, undefined!],
165
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-2')]],
166
[uri, [new Diagnostic(new Range(0, 0, 0, 1), 'message-3')]],
167
]);
168
169
array = collection.get(uri);
170
assert.strictEqual(array.length, 2);
171
[first, second] = array;
172
assert.strictEqual(first.message, 'message-2');
173
assert.strictEqual(second.message, 'message-3');
174
175
collection.dispose();
176
});
177
178
test('diagnostics collection, set tuple overrides, #11547', function () {
179
180
let lastEntries!: [UriComponents, IMarkerData[]][];
181
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new class extends DiagnosticsShape {
182
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]): void {
183
lastEntries = entries;
184
return super.$changeMany(owner, entries);
185
}
186
}, new Emitter());
187
const uri = URI.parse('sc:hightower');
188
189
collection.set([[uri, [new Diagnostic(new Range(0, 0, 1, 1), 'error')]]]);
190
assert.strictEqual(collection.get(uri).length, 1);
191
assert.strictEqual(collection.get(uri)[0].message, 'error');
192
assert.strictEqual(lastEntries.length, 1);
193
const [[, data1]] = lastEntries;
194
assert.strictEqual(data1.length, 1);
195
assert.strictEqual(data1[0].message, 'error');
196
lastEntries = undefined!;
197
198
collection.set([[uri, [new Diagnostic(new Range(0, 0, 1, 1), 'warning')]]]);
199
assert.strictEqual(collection.get(uri).length, 1);
200
assert.strictEqual(collection.get(uri)[0].message, 'warning');
201
assert.strictEqual(lastEntries.length, 1);
202
const [[, data2]] = lastEntries;
203
assert.strictEqual(data2.length, 1);
204
assert.strictEqual(data2[0].message, 'warning');
205
lastEntries = undefined!;
206
});
207
208
test('do send message when not making a change', function () {
209
210
let changeCount = 0;
211
let eventCount = 0;
212
213
const emitter = new Emitter<any>();
214
store.add(emitter.event(_ => eventCount += 1));
215
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new class extends DiagnosticsShape {
216
override $changeMany() {
217
changeCount += 1;
218
}
219
}, emitter);
220
221
const uri = URI.parse('sc:hightower');
222
const diag = new Diagnostic(new Range(0, 0, 0, 1), 'ffff');
223
224
collection.set(uri, [diag]);
225
assert.strictEqual(changeCount, 1);
226
assert.strictEqual(eventCount, 1);
227
228
collection.set(uri, [diag]);
229
assert.strictEqual(changeCount, 2);
230
assert.strictEqual(eventCount, 2);
231
232
});
233
234
test('diagnostics collection, tuples and undefined (small array), #15585', function () {
235
236
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
237
const uri = URI.parse('sc:hightower');
238
const uri2 = URI.parse('sc:nomad');
239
const diag = new Diagnostic(new Range(0, 0, 0, 1), 'ffff');
240
241
collection.set([
242
[uri, [diag, diag, diag]],
243
[uri, undefined!],
244
[uri, [diag]],
245
246
[uri2, [diag, diag]],
247
[uri2, undefined!],
248
[uri2, [diag]],
249
]);
250
251
assert.strictEqual(collection.get(uri).length, 1);
252
assert.strictEqual(collection.get(uri2).length, 1);
253
});
254
255
test('diagnostics collection, tuples and undefined (large array), #15585', function () {
256
257
const collection = new DiagnosticCollection('test', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), new Emitter());
258
const tuples: [URI, Diagnostic[]][] = [];
259
260
for (let i = 0; i < 500; i++) {
261
const uri = URI.parse('sc:hightower#' + i);
262
const diag = new Diagnostic(new Range(0, 0, 0, 1), i.toString());
263
264
tuples.push([uri, [diag, diag, diag]]);
265
tuples.push([uri, undefined!]);
266
tuples.push([uri, [diag]]);
267
}
268
269
collection.set(tuples);
270
271
for (let i = 0; i < 500; i++) {
272
const uri = URI.parse('sc:hightower#' + i);
273
assert.strictEqual(collection.has(uri), true);
274
assert.strictEqual(collection.get(uri).length, 1);
275
}
276
});
277
278
test('diagnostic capping (max per file)', function () {
279
280
let lastEntries!: [UriComponents, IMarkerData[]][];
281
const collection = new DiagnosticCollection('test', 'test', 100, 250, versionProvider, extUri, new class extends DiagnosticsShape {
282
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]): void {
283
lastEntries = entries;
284
return super.$changeMany(owner, entries);
285
}
286
}, new Emitter());
287
const uri = URI.parse('aa:bb');
288
289
const diagnostics: Diagnostic[] = [];
290
for (let i = 0; i < 500; i++) {
291
diagnostics.push(new Diagnostic(new Range(i, 0, i + 1, 0), `error#${i}`, i < 300
292
? DiagnosticSeverity.Warning
293
: DiagnosticSeverity.Error));
294
}
295
296
collection.set(uri, diagnostics);
297
assert.strictEqual(collection.get(uri).length, 500);
298
assert.strictEqual(lastEntries.length, 1);
299
assert.strictEqual(lastEntries[0][1].length, 251);
300
assert.strictEqual(lastEntries[0][1][0].severity, MarkerSeverity.Error);
301
assert.strictEqual(lastEntries[0][1][200].severity, MarkerSeverity.Warning);
302
assert.strictEqual(lastEntries[0][1][250].severity, MarkerSeverity.Info);
303
});
304
305
test('diagnostic capping (max files)', function () {
306
307
let lastEntries!: [UriComponents, IMarkerData[]][];
308
const collection = new DiagnosticCollection('test', 'test', 2, 1, versionProvider, extUri, new class extends DiagnosticsShape {
309
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]): void {
310
lastEntries = entries;
311
return super.$changeMany(owner, entries);
312
}
313
}, new Emitter());
314
315
const diag = new Diagnostic(new Range(0, 0, 1, 1), 'Hello');
316
317
318
collection.set([
319
[URI.parse('aa:bb1'), [diag]],
320
[URI.parse('aa:bb2'), [diag]],
321
[URI.parse('aa:bb3'), [diag]],
322
[URI.parse('aa:bb4'), [diag]],
323
]);
324
assert.strictEqual(lastEntries.length, 3); // goes above the limit and then stops
325
});
326
327
test('diagnostic eventing', async function () {
328
const emitter = new Emitter<readonly URI[]>();
329
const collection = new DiagnosticCollection('ddd', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), emitter);
330
331
const diag1 = new Diagnostic(new Range(1, 1, 2, 3), 'diag1');
332
const diag2 = new Diagnostic(new Range(1, 1, 2, 3), 'diag2');
333
const diag3 = new Diagnostic(new Range(1, 1, 2, 3), 'diag3');
334
335
let p = Event.toPromise(emitter.event).then(a => {
336
assert.strictEqual(a.length, 1);
337
assert.strictEqual(a[0].toString(), 'aa:bb');
338
assert.ok(URI.isUri(a[0]));
339
});
340
collection.set(URI.parse('aa:bb'), []);
341
await p;
342
343
p = Event.toPromise(emitter.event).then(e => {
344
assert.strictEqual(e.length, 2);
345
assert.ok(URI.isUri(e[0]));
346
assert.ok(URI.isUri(e[1]));
347
assert.strictEqual(e[0].toString(), 'aa:bb');
348
assert.strictEqual(e[1].toString(), 'aa:cc');
349
});
350
collection.set([
351
[URI.parse('aa:bb'), [diag1]],
352
[URI.parse('aa:cc'), [diag2, diag3]],
353
]);
354
await p;
355
356
p = Event.toPromise(emitter.event).then(e => {
357
assert.strictEqual(e.length, 2);
358
assert.ok(URI.isUri(e[0]));
359
assert.ok(URI.isUri(e[1]));
360
});
361
collection.clear();
362
await p;
363
});
364
365
test('vscode.languages.onDidChangeDiagnostics Does Not Provide Document URI #49582', async function () {
366
const emitter = new Emitter<readonly URI[]>();
367
const collection = new DiagnosticCollection('ddd', 'test', 100, 100, versionProvider, extUri, new DiagnosticsShape(), emitter);
368
369
const diag1 = new Diagnostic(new Range(1, 1, 2, 3), 'diag1');
370
371
// delete
372
collection.set(URI.parse('aa:bb'), [diag1]);
373
let p = Event.toPromise(emitter.event).then(e => {
374
assert.strictEqual(e[0].toString(), 'aa:bb');
375
});
376
collection.delete(URI.parse('aa:bb'));
377
await p;
378
379
// set->undefined (as delete)
380
collection.set(URI.parse('aa:bb'), [diag1]);
381
p = Event.toPromise(emitter.event).then(e => {
382
assert.strictEqual(e[0].toString(), 'aa:bb');
383
});
384
collection.set(URI.parse('aa:bb'), undefined!);
385
await p;
386
});
387
388
test('diagnostics with related information', function (done) {
389
390
const collection = new DiagnosticCollection('ddd', 'test', 100, 100, versionProvider, extUri, new class extends DiagnosticsShape {
391
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]) {
392
393
const [[, data]] = entries;
394
assert.strictEqual(entries.length, 1);
395
assert.strictEqual(data.length, 1);
396
397
const [diag] = data;
398
assert.strictEqual(diag.relatedInformation!.length, 2);
399
assert.strictEqual(diag.relatedInformation![0].message, 'more1');
400
assert.strictEqual(diag.relatedInformation![1].message, 'more2');
401
done();
402
}
403
}, new Emitter<any>());
404
405
const diag = new Diagnostic(new Range(0, 0, 1, 1), 'Foo');
406
diag.relatedInformation = [
407
new DiagnosticRelatedInformation(new Location(URI.parse('cc:dd'), new Range(0, 0, 0, 0)), 'more1'),
408
new DiagnosticRelatedInformation(new Location(URI.parse('cc:ee'), new Range(0, 0, 0, 0)), 'more2')
409
];
410
411
collection.set(URI.parse('aa:bb'), [diag]);
412
});
413
414
test('vscode.languages.getDiagnostics appears to return old diagnostics in some circumstances #54359', function () {
415
const ownerHistory: string[] = [];
416
const diags = new ExtHostDiagnostics(new class implements IMainContext {
417
getProxy(id: any): any {
418
return new class DiagnosticsShape {
419
$clear(owner: string): void {
420
ownerHistory.push(owner);
421
}
422
};
423
}
424
set(): any {
425
return null;
426
}
427
dispose() { }
428
assertRegistered(): void {
429
430
}
431
drain() {
432
return undefined!;
433
}
434
}, new NullLogService(), fileSystemInfoService, new class extends mock<IExtHostDocumentsAndEditors>() {
435
override getDocument() {
436
return undefined;
437
}
438
});
439
440
const collection1 = diags.createDiagnosticCollection(nullExtensionDescription.identifier, 'foo');
441
const collection2 = diags.createDiagnosticCollection(nullExtensionDescription.identifier, 'foo'); // warns, uses a different owner
442
443
collection1.clear();
444
collection2.clear();
445
446
assert.strictEqual(ownerHistory.length, 2);
447
assert.strictEqual(ownerHistory[0], 'foo');
448
assert.strictEqual(ownerHistory[1], 'foo0');
449
});
450
451
test('Error updating diagnostics from extension #60394', function () {
452
let callCount = 0;
453
const collection = new DiagnosticCollection('ddd', 'test', 100, 100, versionProvider, extUri, new class extends DiagnosticsShape {
454
override $changeMany(owner: string, entries: [UriComponents, IMarkerData[]][]) {
455
callCount += 1;
456
}
457
}, new Emitter<any>());
458
459
const array: Diagnostic[] = [];
460
const diag1 = new Diagnostic(new Range(0, 0, 1, 1), 'Foo');
461
const diag2 = new Diagnostic(new Range(0, 0, 1, 1), 'Bar');
462
463
array.push(diag1, diag2);
464
465
collection.set(URI.parse('test:me'), array);
466
assert.strictEqual(callCount, 1);
467
468
collection.set(URI.parse('test:me'), array);
469
assert.strictEqual(callCount, 2); // equal array
470
471
array.push(diag2);
472
collection.set(URI.parse('test:me'), array);
473
assert.strictEqual(callCount, 3); // same but un-equal array
474
});
475
476
test('Version id is set whenever possible', function () {
477
478
const all: [UriComponents, IMarkerData[]][] = [];
479
480
const collection = new DiagnosticCollection('ddd', 'test', 100, 100, uri => {
481
return 7;
482
}, extUri, new class extends DiagnosticsShape {
483
override $changeMany(_owner: string, entries: [UriComponents, IMarkerData[]][]) {
484
all.push(...entries);
485
}
486
}, new Emitter<any>());
487
488
const array: Diagnostic[] = [];
489
const diag1 = new Diagnostic(new Range(0, 0, 1, 1), 'Foo');
490
const diag2 = new Diagnostic(new Range(0, 0, 1, 1), 'Bar');
491
492
array.push(diag1, diag2);
493
494
collection.set(URI.parse('test:one'), array);
495
collection.set(URI.parse('test:two'), [diag1]);
496
collection.set(URI.parse('test:three'), [diag2]);
497
498
const allVersions = all.map(tuple => tuple[1].map(t => t.modelVersionId)).flat();
499
assert.deepStrictEqual(allVersions, [7, 7, 7, 7]);
500
});
501
502
test('Diagnostics created by tasks aren\'t accessible to extensions #47292', async function () {
503
return runWithFakedTimers({}, async function () {
504
505
const diags = new ExtHostDiagnostics(new class implements IMainContext {
506
getProxy(id: any): any {
507
return {};
508
}
509
set(): any {
510
return null;
511
}
512
dispose() { }
513
assertRegistered(): void {
514
515
}
516
drain() {
517
return undefined!;
518
}
519
}, new NullLogService(), fileSystemInfoService, new class extends mock<IExtHostDocumentsAndEditors>() {
520
override getDocument() {
521
return undefined;
522
}
523
});
524
525
526
//
527
const uri = URI.parse('foo:bar');
528
const data: IMarkerData[] = [{
529
message: 'message',
530
startLineNumber: 1,
531
startColumn: 1,
532
endLineNumber: 1,
533
endColumn: 1,
534
severity: MarkerSeverity.Info
535
}];
536
537
const p1 = Event.toPromise(diags.onDidChangeDiagnostics);
538
diags.$acceptMarkersChange([[uri, data]]);
539
await p1;
540
assert.strictEqual(diags.getDiagnostics(uri).length, 1);
541
542
const p2 = Event.toPromise(diags.onDidChangeDiagnostics);
543
diags.$acceptMarkersChange([[uri, []]]);
544
await p2;
545
assert.strictEqual(diags.getDiagnostics(uri).length, 0);
546
});
547
});
548
549
test('languages.getDiagnostics doesn\'t handle case insensitivity correctly #128198', function () {
550
551
const diags = new ExtHostDiagnostics(new class implements IMainContext {
552
getProxy(id: any): any {
553
return new DiagnosticsShape();
554
}
555
set(): any {
556
return null;
557
}
558
dispose() { }
559
assertRegistered(): void {
560
561
}
562
drain() {
563
return undefined!;
564
}
565
}, new NullLogService(), new class extends mock<IExtHostFileSystemInfo>() {
566
567
override readonly extUri = new ExtUri(uri => uri.scheme === 'insensitive');
568
}, new class extends mock<IExtHostDocumentsAndEditors>() {
569
override getDocument() {
570
return undefined;
571
}
572
});
573
574
const col = diags.createDiagnosticCollection(nullExtensionDescription.identifier);
575
576
const uriSensitive = URI.from({ scheme: 'foo', path: '/SOME/path' });
577
const uriSensitiveCaseB = uriSensitive.with({ path: uriSensitive.path.toUpperCase() });
578
579
const uriInSensitive = URI.from({ scheme: 'insensitive', path: '/SOME/path' });
580
const uriInSensitiveUpper = uriInSensitive.with({ path: uriInSensitive.path.toUpperCase() });
581
582
col.set(uriSensitive, [new Diagnostic(new Range(0, 0, 0, 0), 'sensitive')]);
583
col.set(uriInSensitive, [new Diagnostic(new Range(0, 0, 0, 0), 'insensitive')]);
584
585
// collection itself honours casing
586
assert.strictEqual(col.get(uriSensitive)?.length, 1);
587
assert.strictEqual(col.get(uriSensitiveCaseB)?.length, 0);
588
589
assert.strictEqual(col.get(uriInSensitive)?.length, 1);
590
assert.strictEqual(col.get(uriInSensitiveUpper)?.length, 1);
591
592
// languages.getDiagnostics honours casing
593
assert.strictEqual(diags.getDiagnostics(uriSensitive)?.length, 1);
594
assert.strictEqual(diags.getDiagnostics(uriSensitiveCaseB)?.length, 0);
595
596
assert.strictEqual(diags.getDiagnostics(uriInSensitive)?.length, 1);
597
assert.strictEqual(diags.getDiagnostics(uriInSensitiveUpper)?.length, 1);
598
599
600
const fromForEach: URI[] = [];
601
col.forEach(uri => fromForEach.push(uri));
602
assert.strictEqual(fromForEach.length, 2);
603
assert.strictEqual(fromForEach[0].toString(), uriSensitive.toString());
604
assert.strictEqual(fromForEach[1].toString(), uriInSensitive.toString());
605
});
606
});
607
608