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