diff --git a/tests/e2e/viewport-quad-layout.e2e.ts b/tests/e2e/viewport-quad-layout.e2e.ts new file mode 100644 index 00000000..04fa2c57 --- /dev/null +++ b/tests/e2e/viewport-quad-layout.e2e.ts @@ -0,0 +1,59 @@ +import { expect, test } from "@playwright/test"; + +import { clickViewport } from "./viewport-test-helpers"; + +test("quad viewport layout shows four linked panels with shared selection and active panel state", async ({ page }) => { + const pageErrors: string[] = []; + const consoleErrors: string[] = []; + + page.on("pageerror", (error) => { + pageErrors.push(error.message); + }); + + page.on("console", (message) => { + if (message.type() === "error") { + consoleErrors.push(message.text()); + } + }); + + await page.goto("/"); + await page.evaluate((storageKey) => { + window.localStorage.removeItem(storageKey); + }, "webeditor3d.scene-document-draft"); + await page.reload(); + + await page.getByRole("button", { name: "Box Create" }).click(); + await clickViewport(page, "topLeft"); + await expect(page.getByRole("button", { name: /Box Brush 1/ })).toBeVisible(); + await expect(page.getByText("1 brush selected (Box Brush 1)")).toBeVisible(); + + await page.getByTestId("viewport-layout-quad").click(); + + await expect(page.getByTestId("viewport-panel-topLeft")).toBeVisible(); + await expect(page.getByTestId("viewport-panel-topRight")).toBeVisible(); + await expect(page.getByTestId("viewport-panel-bottomLeft")).toBeVisible(); + await expect(page.getByTestId("viewport-panel-bottomRight")).toBeVisible(); + + await expect(page.getByTestId("viewport-panel-topLeft-view-perspective")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-topLeft-display-normal")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-topRight-view-top")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-topRight-display-authoring")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-bottomLeft-view-front")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-bottomLeft-display-authoring")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-bottomRight-view-side")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-panel-bottomRight-display-authoring")).toHaveAttribute("aria-pressed", "true"); + + await page.getByTestId("viewport-panel-topRight-view-side").click(); + await expect(page.getByTestId("viewport-active-panel")).toContainText("Top Right"); + await expect(page.getByTestId("viewport-panel-topRight-view-side")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByRole("button", { name: /Box Brush 1/ })).toBeVisible(); + + await page.getByTestId("viewport-panel-topLeft-display-authoring").click(); + await expect(page.getByTestId("viewport-active-panel")).toContainText("Top Left"); + await expect(page.getByTestId("viewport-panel-topLeft-display-authoring")).toHaveAttribute("aria-pressed", "true"); + await expect(page.getByTestId("viewport-canvas-topLeft")).toHaveCSS("background-color", "rgb(0, 0, 0)"); + await expect(page.getByText("1 brush selected (Box Brush 1)")).toBeVisible(); + + expect(pageErrors).toEqual([]); + expect(consoleErrors).toEqual([]); +});