import { describe, expect, it } from "vitest"; import { defineToolcraft } from "./define-toolcraft"; import type { ToolcraftControlSchema } from "./types"; function createAppSchema(control: ToolcraftControlSchema) { return { canvas: { enabled: false }, panels: { controls: { sections: [ { controls: { bumpMaps: control }, title: "Bump Maps", }, ], title: "Controls", }, }, }; } function createFileDrop( overrides: Record = {}, ): ToolcraftControlSchema { return { assetKind: "file", defaultValue: [], itemControls: { depth: { defaultValue: 0.2, max: 1, min: 0, type: "slider" }, levels: { defaultValue: [0, 1], max: 1, min: 0, step: 0.01, type: "rangeSlider", }, invert: { defaultValue: false, type: "switch" }, offset: { coordinateMode: "cartesian", defaultValue: { x: "0", y: "0" }, type: "vector", }, }, multiple: true, target: "media.bumpMaps", type: "fileDrop", variant: "collection-actions", ...overrides, } as ToolcraftControlSchema; } describe("defineToolcraft fileDrop item controls", () => { it("accepts built-in settings owned by each attached file", () => { const app = defineToolcraft(createAppSchema(createFileDrop())); const control = app.panels.controls?.sections.find( (section) => section.title === "Bump Maps", )?.controls.bumpMaps; expect(control?.itemControls?.depth?.defaultValue).toBe(0.2); expect(control?.itemControls?.levels?.type).toBe("rangeSlider"); expect(control?.itemControls?.offset?.type).toBe("vector"); }); it("requires the file collection-actions variant", () => { expect(() => defineToolcraft( createAppSchema(createFileDrop({ variant: undefined })), ), ).toThrow(/collection-item-controls.*collectionActions.*fileDrop/u); }); it("requires every nested setting to declare a reset default", () => { expect(() => defineToolcraft( createAppSchema( createFileDrop({ itemControls: { depth: { type: "slider" } } }), ), ), ).toThrow(/itemControls\.depth.*defaultValue/u); }); it("rejects an empty nested settings declaration", () => { expect(() => defineToolcraft(createAppSchema(createFileDrop({ itemControls: {} }))), ).toThrow(/itemControls require at least one built-in field/u); }); it("rejects itemDefaultValue beside per-file field defaults", () => { expect(() => defineToolcraft( createAppSchema( createFileDrop({ itemDefaultValue: { depth: 1 } }), ), ), ).toThrow(/collection-item-default.*itemDefaultValue/u); }); });