import { act, cleanup, fireEvent, render, screen, } from "@testing-library/react"; import { afterEach, describe, expect, it, vi } from "vitest"; import type { RegexExecutionRequest } from "../regex/model/match"; import type { CaptureDefinition, RegexSyntaxRequest, RegexSyntaxResult, ReplacementSyntaxResult, } from "../regex/model/syntax"; interface PendingPattern { readonly request: RegexSyntaxRequest; readonly resolve: (result: RegexSyntaxResult) => void; } interface PendingReplacement { readonly replacement: string; readonly resolve: (result: ReplacementSyntaxResult) => void; } interface SyntaxInstance { readonly label: string; cancelCalls: number; } const syntaxHarness = vi.hoisted(() => ({ instances: [] as SyntaxInstance[], patterns: [] as PendingPattern[], replacements: [] as PendingReplacement[], })); const engineHarness = vi.hoisted(() => ({ requests: [] as RegexExecutionRequest[], emitWholeFirstCharacterMatch: false, })); vi.mock("../editors/CodeEditor", () => ({ CodeEditor({ value, onChange, label, readOnly, marks, selectedRange, onSelectionChange, }: { readonly value: string; readonly onChange?: (value: string) => void; readonly label: string; readonly readOnly?: boolean; readonly marks?: readonly unknown[]; readonly selectedRange?: { readonly startUtf16: number }; readonly onSelectionChange?: (range: { readonly startUtf16: number; readonly endUtf16: number; }) => void; }) { return (