import { expect, test } from "@playwright/test"; import path from "node:path"; const basicBlend = path.resolve(import.meta.dirname, "../../../tests/files/web/basic_scene.blend"); test("M12-05C exposes only matrix-declared file and operator routes", async ({ page }) => { await page.goto("/"); const input = page.getByTestId("blend-file-input"); await expect(input).toHaveAttribute("accept", ".blend,application/octet-stream"); await expect(input).toHaveAttribute("data-io-format-import-routes", ""); await input.setInputFiles(basicBlend); await expect(page.getByText("BasicCube", { exact: true })).toBeVisible(); await page.keyboard.press("F3"); const search = page.getByRole("textbox", { name: "搜索操作" }); await search.fill("export glb"); await expect(page.getByRole("button", { name: "Export GLB", exact: true })).toHaveCount(1); await search.fill("export usd"); await expect(page.getByRole("button", { name: /Export USD|导出 USD/ })).toHaveCount(0); await search.fill("import obj"); await expect(page.getByRole("button", { name: /Import OBJ|导入 OBJ/ })).toHaveCount(0); await page.keyboard.press("Escape"); await input.setInputFiles({ name: "mesh.obj", mimeType: "model/obj", buffer: Buffer.from("v 0 0 0\n") }); await expect(page.getByTestId("engine-status")).toContainText("IO: format route unavailable"); await expect(page.getByTestId("engine-status")).not.toContainText("SceneIR r2"); });