import { createPortal } from "react-dom"; import { type ReactNode, useState } from "react"; import { act, fireEvent, render, screen, waitFor, within } from "@testing-library/react"; import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { PaneWorkbench } from "@/components/workbench/PaneWorkbench"; import { EMPTY_WORKBENCH_STATE, addWorkbenchPane, setWorkbenchLayout, setWorkbenchPaneLayoutOrder, workbenchTab, workbenchTabForPane, } from "@/components/workbench/workbench-model"; function rect(left: number, top: number, width: number, height: number): DOMRect { return { x: left, y: top, left, top, width, height, right: left + width, bottom: top + height, toJSON: () => ({}), }; } function WorkbenchHarness({ initialLayout = "columns", onPaneOrderChange = () => {}, onSplitRatiosChange = () => {}, }: { initialLayout?: "columns" | "rows"; onPaneOrderChange?: (paneKeys: string[]) => void; onSplitRatiosChange?: (splitRatios: number[]) => void; } = {}) { const [activePaneKey, setActivePaneKey] = useState("beta"); const [state, setState] = useState(() => { const initial = addWorkbenchPane(EMPTY_WORKBENCH_STATE, "alpha", "beta"); const tabKey = workbenchTabForPane(initial, "alpha").tabKey; return setWorkbenchLayout(initial, tabKey, initialLayout); }); const tabKey = workbenchTabForPane(state, "alpha").tabKey; const tab = workbenchTab(state, tabKey); if (!tab) return null; const titles: Record = { alpha: "Alpha", beta: "Beta" }; return ( ({ key, title: titles[key] }))} activePaneKey={activePaneKey} layout={tab.layout} splitRatios={tab.splitRatios} showLayoutControl onActivatePane={setActivePaneKey} onAddPane={vi.fn()} onLayoutChange={(layout) => setState((current) => ( setWorkbenchLayout(current, tabKey, layout) ))} onPaneOrderChange={(paneKeys) => { onPaneOrderChange(paneKeys); setState((current) => ( setWorkbenchPaneLayoutOrder(current, tabKey, paneKeys) )); }} onSplitRatiosChange={onSplitRatiosChange} renderPane={(pane, context) => ( <> {context.headerPortalTarget && context.active ? createPortal( context.headerActions, context.headerPortalTarget, ) : null} {context.composerPortalTarget ? createPortal(