From 5f87c7dc9df58cf81a22f8d3fab8c1cecae0c3a6 Mon Sep 17 00:00:00 2001 From: David Souther Date: Tue, 21 Apr 2026 12:10:56 -0400 Subject: [PATCH 1/2] Refine playwright settings --- e2e/tests/chip/editor-panel.spec.ts | 49 +++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 e2e/tests/chip/editor-panel.spec.ts diff --git a/e2e/tests/chip/editor-panel.spec.ts b/e2e/tests/chip/editor-panel.spec.ts new file mode 100644 index 00000000..6a6ae041 --- /dev/null +++ b/e2e/tests/chip/editor-panel.spec.ts @@ -0,0 +1,49 @@ +import { expect, test as base } from "@playwright/test"; +import { ChipPage } from "../../src/pages/ChipPage"; + +const test = base.extend<{ chipPage: ChipPage }>({ + chipPage: async ({ page }, use) => { + await page.goto("chip"); + const chipPage = new ChipPage(page); + await chipPage.editor.toggleMonaco(); + await use(chipPage); + }, +}); + +const AND_HDL = `CHIP And { + IN a, b; + OUT out; + + PARTS: + Nand(a=a, b=b, out=x); + Not(in=x, out=out); +}`; + +test("fillHdlEditor works after fixture disables Monaco via settings UI", async ({ + chipPage, +}) => { + await chipPage.selectProject("01"); + await chipPage.selectChip("And"); + + await expect(chipPage.editor.monacoEditor).not.toBeVisible(); + + await chipPage.fillHdlEditor(AND_HDL); + await chipPage.testPanel.runTest(); + + expect(await chipPage.testPanel.getFailureCount()).toBe(0); +}); + +test("toggleMonaco re-enables Monaco editor for tests that need it", async ({ + chipPage, +}) => { + await chipPage.selectProject("01"); + await chipPage.selectChip("And"); + + await chipPage.editor.toggleMonaco(); + await expect(chipPage.editor.monacoEditor).toBeVisible(); + + await chipPage.editor.write(AND_HDL, "hdl"); + await chipPage.testPanel.runTest(); + + expect(await chipPage.testPanel.getFailureCount()).toBe(0); +}); From 397fefe243e921c177946c19acbeaf4630c0e207 Mon Sep 17 00:00:00 2001 From: David Souther Date: Tue, 21 Apr 2026 13:57:46 -0400 Subject: [PATCH 2/2] EditorPanel wrapping Monaco and Monaco toggle --- e2e/fixtures/chip.fixture.ts | 6 ++- e2e/src/pages/ChipPage.ts | 7 ++-- e2e/src/pages/EditorPanel.ts | 57 +++++++++++++++++++++++++++++ e2e/tests/chip/editor-panel.spec.ts | 4 +- 4 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 e2e/src/pages/EditorPanel.ts diff --git a/e2e/fixtures/chip.fixture.ts b/e2e/fixtures/chip.fixture.ts index 1e6496a3..258cb790 100644 --- a/e2e/fixtures/chip.fixture.ts +++ b/e2e/fixtures/chip.fixture.ts @@ -7,7 +7,9 @@ type ChipFixtures = { export const test = base.extend({ chipPage: async ({ page }, use) => { - await page.goto("chip?monaco=0"); - await use(new ChipPage(page)); + await page.goto("chip"); + const chipPage = new ChipPage(page); + await chipPage.editor.disableMonaco(); + await use(chipPage); }, }); diff --git a/e2e/src/pages/ChipPage.ts b/e2e/src/pages/ChipPage.ts index cd7246af..9be83571 100644 --- a/e2e/src/pages/ChipPage.ts +++ b/e2e/src/pages/ChipPage.ts @@ -1,10 +1,13 @@ import { expect, type Page } from "@playwright/test"; +import { EditorPanel } from "./EditorPanel"; import { TestPanel } from "./TestPanel"; export class ChipPage { + editor: EditorPanel; testPanel: TestPanel; constructor(private _page: Page) { + this.editor = new EditorPanel(_page); this.testPanel = new TestPanel(_page); } @@ -107,8 +110,6 @@ export class ChipPage { } async fillHdlEditor(content: string): Promise { - const textarea = this._page.locator('[data-testid="editor-hdl"]'); - await expect(textarea).toBeEnabled(); - await textarea.fill(content); + await this.editor.write(content, "hdl"); } } diff --git a/e2e/src/pages/EditorPanel.ts b/e2e/src/pages/EditorPanel.ts new file mode 100644 index 00000000..2bad795a --- /dev/null +++ b/e2e/src/pages/EditorPanel.ts @@ -0,0 +1,57 @@ +import { expect, type Locator, type Page } from "@playwright/test"; + +export class EditorPanel { + readonly monacoEditor: Locator; + private usingMonaco = true; + + constructor(private page: Page) { + this.monacoEditor = page.locator(".monaco-editor").nth(0); + } + + async enableMonaco(): Promise { + await this.setMonaco(true); + } + + async disableMonaco(): Promise { + await this.setMonaco(false); + } + + private async setMonaco(enabled: boolean): Promise { + await this.page.locator('[data-tooltip="Settings"]').click(); + const monacoSwitch = this.page.getByRole("switch", { + name: "Use Monaco Editor", + }); + if ((await monacoSwitch.isChecked()) !== enabled) { + await monacoSwitch.click(); + } + if (enabled) { + await expect(monacoSwitch).toBeChecked(); + } else { + await expect(monacoSwitch).not.toBeChecked(); + } + const closeButton = this.page.locator(".settings-dialog a.close"); + await expect(closeButton).toBeVisible(); + await closeButton.click(); + this.usingMonaco = enabled; + } + + async clearEditor(editor: string): Promise { + if (this.usingMonaco) { + await this.monacoEditor.click(); + await this.page.keyboard.press("Control+A"); + await this.page.keyboard.press("Backspace"); + await this.page.keyboard.press("Backspace"); + } else { + await this.page.getByTestId(`editor-${editor}`).clear(); + } + } + + async write(text: string, editor: string): Promise { + await this.clearEditor(editor); + if (this.usingMonaco) { + await this.page.keyboard.type(text); + } else { + await this.page.getByTestId(`editor-${editor}`).fill(text); + } + } +} diff --git a/e2e/tests/chip/editor-panel.spec.ts b/e2e/tests/chip/editor-panel.spec.ts index 6a6ae041..12fe0319 100644 --- a/e2e/tests/chip/editor-panel.spec.ts +++ b/e2e/tests/chip/editor-panel.spec.ts @@ -5,7 +5,7 @@ const test = base.extend<{ chipPage: ChipPage }>({ chipPage: async ({ page }, use) => { await page.goto("chip"); const chipPage = new ChipPage(page); - await chipPage.editor.toggleMonaco(); + await chipPage.editor.disableMonaco(); await use(chipPage); }, }); @@ -39,7 +39,7 @@ test("toggleMonaco re-enables Monaco editor for tests that need it", async ({ await chipPage.selectProject("01"); await chipPage.selectChip("And"); - await chipPage.editor.toggleMonaco(); + await chipPage.editor.enableMonaco(); await expect(chipPage.editor.monacoEditor).toBeVisible(); await chipPage.editor.write(AND_HDL, "hdl");