import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { describe, expect, it, beforeEach } from "vitest"; import { ensureDOMParser } from "../utils/dom.js"; import { parseCompositions, parseSubComposition } from "./compositions.js"; describe("parseCompositions", () => { beforeEach(() => { ensureDOMParser(); }); it("resolves relative sub-composition starts when computing host duration", () => { const baseDir = mkdtempSync(join(tmpdir(), "hyperframes-compositions-")); try { const compositionsDir = join(baseDir, "compositions"); mkdirSync(compositionsDir); const subCompositionHtml = ` `; writeFileSync(join(compositionsDir, "scene.html"), subCompositionHtml); const html = `
`; const host = parseCompositions(html, baseDir).find( (composition) => composition.id === "host", ); expect(host?.duration).toBe(6); } finally { rmSync(baseDir, { recursive: true, force: true }); } }); }); describe("parseSubComposition", () => { beforeEach(() => { ensureDOMParser(); }); it("reads template-wrapped sub-composition contents", () => { const html = ` `; expect(parseSubComposition(html, "foo", 1280, 720)).toEqual({ id: "foo", duration: 1.5, width: 1920, height: 1080, elementCount: 1, }); }); it("counts visual-only template content and estimates simple script durations", () => { const html = ` `; expect(parseSubComposition(html, "foo", 1280, 720)).toEqual({ id: "foo", duration: 0.5, width: 1920, height: 1080, elementCount: 1, }); }); });