aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/diagnostic_revision_test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/drivers/diagnostic_revision_test.js')
-rw-r--r--tests/drivers/diagnostic_revision_test.js47
1 files changed, 47 insertions, 0 deletions
diff --git a/tests/drivers/diagnostic_revision_test.js b/tests/drivers/diagnostic_revision_test.js
new file mode 100644
index 0000000..725fb87
--- /dev/null
+++ b/tests/drivers/diagnostic_revision_test.js
@@ -0,0 +1,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');