import {
cleanup,
fireEvent,
render,
screen,
waitFor,
} from "@testing-library/react";
import * as React from "react";
import { afterEach, describe, expect, it, vi } from "vitest";
import { encodeToolcraftModelDocument } from "../../model-import/canonical/model-document-codec";
import { createValidModelDocument } from "../../model-import/canonical/model-document-test-support";
import { createHydrationModelAsset } from "../../model-import/model-persistence-hydration-test-support";
import { defineToolcraft } from "../../schema/define-toolcraft";
import { ToolcraftRoot } from "../app-shell/toolcraft-root";
import { useToolcraftDispatch } from "../app-shell/use-toolcraft";
import { useToolcraftCanvasFrame } from "../canvas/use-toolcraft-canvas-frame";
import { createModelCanvasLayerTestBinding } from "./model-canvas-layer.test-support";
import { ToolcraftModelCanvasLayers } from "./model-canvas-layer";
import { ToolcraftModelRenderProvider } from "./model-render-provider";
afterEach(() => {
cleanup();
});
describe("Toolcraft model canvas continuity", () => {
it("keeps one model render surface and lifecycle across canvas modes", async () => {
const binding = createModelCanvasLayerTestBinding();
const bytes = encodeToolcraftModelDocument(createValidModelDocument());
const schema = defineToolcraft({
base: {
identity: {
id: "runtime-test",
title: "Toolcraft fixture",
},
canvas: { enabled: true },
panels: {},
},
modules: [],
});
const view = render(
bytes}
standardBinding={createModelCanvasLayerTestBinding()}
>
,
);
const layer = await waitFor(() => {
const element = view.container.querySelector(
'[data-canvas-model-layer="layer-1"]',
);
expect(element).not.toBeNull();
return element as HTMLElement;
});
expect(layer.style.left).toBe("-70px");
expect(layer.style.top).toBe("-140px");
expect(layer.style.width).toBe("300px");
expect(layer.style.height).toBe("200px");
expect(layer.dataset.selected).toBe("true");
const finiteStyle = layer.style.cssText;
expect(screen.getByTestId("model-canvas-mode").textContent).toBe("finite");
await waitFor(() =>
expect(binding.create).toHaveBeenCalledWith(
expect.objectContaining({
displayFit: expect.objectContaining({
viewport: { height: 200, width: 300 },
}),
}),
expect.anything(),
),
);
fireEvent.click(screen.getByRole("button", { name: "Enable Infinity" }));
const infiniteLayer = view.container.querySelector(
'[data-canvas-model-layer="layer-1"]',
);
expect(infiniteLayer).toBe(layer);
expect(infiniteLayer?.style.cssText).toBe(finiteStyle);
expect(binding.create).toHaveBeenCalledTimes(1);
expect(screen.getByTestId("model-canvas-mode").textContent).toBe(
"infinite",
);
});
});
function ModelInfinityToggle(): React.JSX.Element {
const dispatch = useToolcraftDispatch();
const frame = useToolcraftCanvasFrame();
return (
<>
>
);
}