// 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');