aboutsummaryrefslogtreecommitdiff
path: root/tests/drivers/sourceprovider_test.js
diff options
context:
space:
mode:
Diffstat (limited to 'tests/drivers/sourceprovider_test.js')
-rw-r--r--tests/drivers/sourceprovider_test.js31
1 files changed, 31 insertions, 0 deletions
diff --git a/tests/drivers/sourceprovider_test.js b/tests/drivers/sourceprovider_test.js
new file mode 100644
index 0000000..f9551da
--- /dev/null
+++ b/tests/drivers/sourceprovider_test.js
@@ -0,0 +1,31 @@
+// verify the extension's virtual source provider and its language-server request.
+const assert = require('assert');
+const fs = require('fs');
+const path = require('path');
+const { createSourceProvider } = require('../../editors/vscode/client/sourceprovider.js');
+
+async function main() {
+ const calls = [];
+ const runtime = fs.readFileSync(path.resolve(__dirname, '..', '..', 'src', 'runtime', 'rt.zc'), 'utf8');
+ const provider = createSourceProvider(async (method, params) => {
+ calls.push({ method, params });
+ return runtime;
+ }, () => true);
+ assert.strictEqual(await provider.provideTextDocumentContent({ path: '/rt.zc' }), runtime);
+ assert.deepStrictEqual(calls, [{ method: 'zc/source', params: { path: '/rt.zc' } }]);
+
+ const missing = createSourceProvider(async () => null, () => true);
+ assert.strictEqual(await missing.provideTextDocumentContent({ path: '/missing.zc' }), '// no such built-in source\n');
+ const failed = createSourceProvider(async () => { throw new Error('closed'); }, () => true);
+ assert.strictEqual(await failed.provideTextDocumentContent({ path: '/rt.zc' }), '// the language server could not give this source\n');
+
+ let readyChecks = 0, delays = 0;
+ const starting = createSourceProvider(async () => runtime, () => ++readyChecks > 2, async () => { delays++; });
+ assert.strictEqual(await starting.provideTextDocumentContent({ path: '/rt.zc' }), runtime);
+ assert.strictEqual(delays, 2);
+ const stopped = createSourceProvider(async () => runtime, () => false, async () => {});
+ assert.strictEqual(await stopped.provideTextDocumentContent({ path: '/rt.zc' }), '// the language server is not running\n');
+ console.log('ok virtual source provider waits for the server and returns embedded source text');
+}
+
+main().catch(error => { console.error(error); process.exitCode = 1; });