import { describe, expect, it, vi } from "vitest"; import { createToolcraftSourceAssetCoordinator } from "./source-asset-coordinator"; import { createFileHandler, createLease, createRepository, createStateHarness, fileControl, fileDraft, prepared, testFile, } from "./source-asset-coordinator-test-support"; import { createToolcraftSourceAssetRegistry } from "./source-asset-registry"; describe("source asset presentation reachability", () => { it("keeps a ref reachable while one or more presentation owners retain it", async () => { const harness = createStateHarness(); const collected: ReadonlySet[] = []; const collect = vi.fn(async (refs: ReadonlySet) => { collected.push(refs); return []; }); const repository = createRepository([createLease(), createLease()], { collect, }); const handler = createFileHandler(async () => prepared(fileDraft("one.txt"))); const coordinator = createToolcraftSourceAssetCoordinator({ dispatch: harness.dispatch, getState: harness.getState, registry: createToolcraftSourceAssetRegistry([handler]), repository, }); const releaseFirst = coordinator.retainResourceRef!("document:presented"); const releaseSecond = coordinator.retainResourceRef!("document:presented"); await coordinator.importBatch( { files: [testFile("one.txt")], origin: "panel" }, fileControl(), ); expect(collected.at(-1)).toContain("document:presented"); releaseFirst(); await coordinator.importBatch( { files: [testFile("two.txt")], origin: "panel" }, fileControl(), ); expect(collected.at(-1)).toContain("document:presented"); releaseSecond(); releaseSecond(); await coordinator.dispose(); }); });