import test from 'node:test'; import assert from 'node:assert/strict'; import { createEnsureYomitanExtensionLoadedHandler } from './yomitan-extension-loader'; test('ensure yomitan loader returns existing extension when available', async () => { const extension = { id: 'ext' } as never; const ensureLoaded = createEnsureYomitanExtensionLoadedHandler({ getYomitanExtension: () => extension, getLoadInFlight: () => null, setLoadInFlight: () => { throw new Error('unexpected'); }, loadYomitanExtension: async () => { throw new Error('unexpected'); }, }); assert.equal(await ensureLoaded(), extension); }); test('ensure yomitan loader reuses in-flight promise', async () => { const extension = { id: 'ext' } as never; const inflight = Promise.resolve(extension); const ensureLoaded = createEnsureYomitanExtensionLoadedHandler({ getYomitanExtension: () => null, getLoadInFlight: () => inflight, setLoadInFlight: () => { throw new Error('unexpected'); }, loadYomitanExtension: async () => { throw new Error('unexpected'); }, }); assert.equal(await ensureLoaded(), extension); }); test('ensure yomitan loader starts load and clears in-flight when done', async () => { const calls: string[] = []; let inFlight: Promise | null = null; const extension = { id: 'ext' } as never; const ensureLoaded = createEnsureYomitanExtensionLoadedHandler({ getYomitanExtension: () => null, getLoadInFlight: () => inFlight, setLoadInFlight: (promise) => { inFlight = promise; calls.push(promise ? 'set:promise' : 'set:null'); }, loadYomitanExtension: async () => { calls.push('load'); return extension; }, }); assert.equal(await ensureLoaded(), extension); assert.deepEqual(calls, ['load', 'set:promise', 'set:null']); });