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