import { describe, expect, it } from "vitest"; import { timelineModule } from "../modules/built-ins/timeline/timeline-module"; import { spatialViewModule } from "../modules/built-ins/spatial-view/spatial-view-module"; import { defineToolcraft } from "./define-toolcraft"; import { isToolcraftRuntimeOwnedTarget, toolcraftCanvasRotationLockedTarget, } from "./runtime-targets"; import { getToolcraftControlKeyframeCapability } from "./keyframe-capability"; function createSchema(gizmo: boolean, timeline = false, canvas = true) { return defineToolcraft({ base: { identity: { id: "rotation-lock-test", title: "Rotation lock test" }, canvas: { enabled: canvas }, panels: { controls: { title: "Controls", sections: gizmo ? [ { id: "view", title: "View", controls: { orientation: { applicability: { mode: "always" }, label: false, target: "view.orbit", type: "orientationGizmo", }, }, }, ] : [], }, }, }, modules: [ ...(gizmo ? [spatialViewModule()] : []), ...(timeline ? [timelineModule({ mode: "playback" })] : []), ], }); } describe("runtime Setup rotation lock", () => { it("owns one non-keyframeable switch beside Timeline in the final row", () => { const setup = createSchema(true, true).panels.controls!.sections[1]!; const control = setup.controls.rotationLocked!; expect(control).toMatchObject({ defaultValue: false, label: "Lock rotation", target: toolcraftCanvasRotationLockedTarget, type: "switch", }); expect(isToolcraftRuntimeOwnedTarget(control.target)).toBe(true); expect(getToolcraftControlKeyframeCapability(control)).toEqual({ capable: false, reason: "runtime-owned-target", }); expect(Object.keys(setup.controls).slice(-2)).toEqual([ "timelineExtended", "rotationLocked", ]); expect(setup.layoutGroups?.at(-1)).toEqual({ columns: 2, controls: ["timelineExtended", "rotationLocked"], layout: "inline", }); }); it("does not require or enable Timeline", () => { const schema = createSchema(true); expect( schema.panels.controls!.sections[1]!.controls.rotationLocked, ).toBeDefined(); expect( schema.panels.controls!.sections[1]!.controls.timelineExtended, ).toBeUndefined(); expect(schema.panels.timeline).toBeUndefined(); }); it.each([true, false])( "omits the switch without a gizmo: canvas=%s", (canvas) => { expect( createSchema(false, true, canvas).panels.controls!.sections[1]!.controls .rotationLocked, ).toBeUndefined(); }, ); });