feat: publish Regex Tools 0.2.0
This commit is contained in:
102
tests/browser/minimization.spec.ts
Normal file
102
tests/browser/minimization.spec.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
import { expect, test, type Page } from "@playwright/test";
|
||||
|
||||
async function setEditor(page: Page, testId: string, value: string) {
|
||||
await page.getByTestId(testId).locator(".cm-content").fill(value);
|
||||
}
|
||||
|
||||
async function openMinimizer(page: Page) {
|
||||
await page.getByRole("button", { name: "Minimize", exact: true }).click();
|
||||
const dialog = page.getByRole("dialog", {
|
||||
name: "Minimize a reproducer",
|
||||
});
|
||||
await expect(dialog).toBeVisible();
|
||||
await expect(dialog).toBeInViewport();
|
||||
return dialog;
|
||||
}
|
||||
|
||||
test("real workers minimize exact failures and expose bounded cancellation", async ({
|
||||
page,
|
||||
}) => {
|
||||
const pageErrors: string[] = [];
|
||||
page.on("pageerror", (error) => pageErrors.push(error.message));
|
||||
await page.goto("./");
|
||||
await page.getByLabel("Live").uncheck();
|
||||
|
||||
// A deterministic failing should-not-match assertion, verified by the
|
||||
// browser's actual ECMAScript worker.
|
||||
await setEditor(page, "editor-regular-expression-pattern", "X");
|
||||
await setEditor(page, "editor-test-text", "abXcd");
|
||||
await expect(
|
||||
page.getByRole("button", { name: "Run", exact: true }),
|
||||
).toBeEnabled({ timeout: 15_000 });
|
||||
let dialog = await openMinimizer(page);
|
||||
await dialog.getByRole("button", { name: "Verify & minimize" }).click();
|
||||
await expect(
|
||||
dialog.getByRole("heading", {
|
||||
name: "Locally minimal under the documented transforms",
|
||||
}),
|
||||
).toBeVisible({ timeout: 30_000 });
|
||||
await expect(
|
||||
dialog.getByLabel("Minimizer evaluation progress"),
|
||||
).toBeVisible();
|
||||
await expect(dialog.getByText("Baseline verification")).toBeVisible();
|
||||
await expect(dialog.getByText("Final accepted candidate")).toBeVisible();
|
||||
await expect(dialog).toContainText("Native ECMAScript RegExp");
|
||||
await expect(dialog).toContainText("expected-no-match:present");
|
||||
await expect(dialog.getByLabel("Minimized subject")).toHaveValue("X");
|
||||
await dialog.getByRole("button", { name: "Use minimized subject" }).click();
|
||||
await expect(dialog).not.toBeVisible();
|
||||
await expect(
|
||||
page.getByTestId("editor-test-text").locator(".cm-content"),
|
||||
).toHaveText("X");
|
||||
|
||||
// With mandatory PCRE2 UCP, \w matches é; ECMAScript \w does not. Padding
|
||||
// is removed while preserving the exact match-count mismatch category.
|
||||
await setEditor(page, "editor-regular-expression-pattern", "\\w+");
|
||||
await setEditor(page, "editor-test-text", "!!é??");
|
||||
await expect(
|
||||
page.getByRole("button", { name: "Run", exact: true }),
|
||||
).toBeEnabled({ timeout: 15_000 });
|
||||
dialog = await openMinimizer(page);
|
||||
await dialog
|
||||
.getByLabel("Minimization failure kind")
|
||||
.selectOption("comparison-mismatch");
|
||||
await dialog.getByRole("button", { name: "Verify & minimize" }).click();
|
||||
await expect(
|
||||
dialog.getByRole("heading", {
|
||||
name: "Locally minimal under the documented transforms",
|
||||
}),
|
||||
).toBeVisible({ timeout: 30_000 });
|
||||
await expect(dialog.getByLabel("Minimized subject")).toHaveValue("é");
|
||||
await expect(dialog).toContainText(
|
||||
"comparison:semantic-mismatch · match-count",
|
||||
);
|
||||
await expect(dialog).toContainText("Native ECMAScript RegExp");
|
||||
await expect(dialog).toContainText("PCRE2 WebAssembly");
|
||||
await expect(dialog).toContainText("10.47 2025-10-21");
|
||||
await dialog.getByRole("button", { name: "Use minimized subject" }).click();
|
||||
await expect(
|
||||
page.getByTestId("editor-test-text").locator(".cm-content"),
|
||||
).toHaveText("é");
|
||||
|
||||
// Cancellation stays immediately available even for a deliberately
|
||||
// pathological timeout target; it terminates the active worker set.
|
||||
await setEditor(page, "editor-regular-expression-pattern", "(a+)+$");
|
||||
await setEditor(page, "editor-test-text", `${"a".repeat(40_000)}!`);
|
||||
dialog = await openMinimizer(page);
|
||||
await dialog
|
||||
.getByLabel("Minimization failure kind")
|
||||
.selectOption("engine-timeout");
|
||||
await dialog.getByLabel("Each candidate ms").fill("10000");
|
||||
await dialog.getByRole("button", { name: "Verify & minimize" }).click();
|
||||
const cancel = dialog.getByRole("button", { name: "Cancel" });
|
||||
await expect(cancel).toBeVisible();
|
||||
await cancel.click();
|
||||
await expect(dialog).toContainText(
|
||||
"Cancelled; active syntax and engine workers were terminated.",
|
||||
);
|
||||
await expect(
|
||||
dialog.getByRole("button", { name: "Verify & minimize" }),
|
||||
).toBeEnabled();
|
||||
expect(pageErrors).toEqual([]);
|
||||
});
|
||||
Reference in New Issue
Block a user