aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/diagnostic_revision_test.js
blob: 725fb87efdd98f3f9036a13e01b7d5954ba9c713 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// exercise delayed diagnostics without relying on an editor's timing.
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const vm = require('vm');
const root = path.resolve(__dirname, '../..');
const displayed = [], cached = [];
const vscode = {
    EventEmitter: class { fire() {} },
    SemanticTokensLegend: class {},
    Diagnostic: class { constructor(range, message) { this.message = message; } },
    Range: class {},
    DiagnosticSeverity: { Hint: 4, Information: 3, Warning: 2, Error: 1 },
    Uri: { parse: value => value },
};
const filename = path.join(root, 'editors/vscode/client/extension.js');
const context = vm.createContext({
    module: { exports: {} }, __dirname: path.dirname(filename), Buffer, setTimeout, clearTimeout,
    require(name) {
        if (name === 'vscode') return vscode;
        if (name === './vmproc' || name === './wasmproc') return {};
        if (name.startsWith('./')) return require(path.join(path.dirname(filename), name));
        return require(name);
    },
    displayed, cached,
});
vm.runInContext(fs.readFileSync(filename, 'utf8') + `
diagnostics = { set(uri, list) { displayed.push(list.map(d => d.message)); } };
cache = { put(key, raw) { cached.push({ key, raw }); return false; } };
const uri = 'file:///reopened.zc';
const diag = message => [{ message, range: { start: { line: 0, character: 0 }, end: { line: 0, character: 1 } } }];
opened.add(uri); docKeys.set(uri, 'current'); docVersions.set(uri, 3);
sentKeys.set(uri, [{ key: 'current', version: 3 }]);
onPublish(uri, diag('old close'), 1);
onPublish(uri, diag('old open'), 2);
onPublish(uri, diag('current open'), 3);
onPublish(uri, diag('duplicate'), 3);
opened.delete(uri);
onPublish(uri, diag('closed'), 3);
opened.add(uri); docKeys.set(uri, null); docVersions.set(uri, 5);
sentKeys.set(uri, [{ key: null, version: 4 }, { key: null, version: 5 }]);
onPublish(uri, diag('old uncacheable text'), 4);
onPublish(uri, diag('current uncacheable text'), 5);
`, context, { filename });
assert.deepStrictEqual(displayed.map(list => Array.from(list)), [['current open'], ['current uncacheable text']]);
assert.deepStrictEqual(cached.map(entry => entry.key), ['current']);
console.log('ok   closed, reopened, duplicate, and uncacheable diagnostic revisions');