diff options
Diffstat (limited to 'tests/drivers/sourceprovider_test.js')
| -rw-r--r-- | tests/drivers/sourceprovider_test.js | 31 |
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; }); |
