import { fireEvent, render, screen, waitFor } from "@testing-library/react";
import userEvent from "@testing-library/user-event";
import { describe, expect, it } from "vitest";
import { Workbench } from "../../src/components/Workbench";
describe("Diff Tools workbench", () => {
it("renders exact newline metadata and both result layouts", async () => {
const user = userEvent.setup();
render();
expect(screen.getByText("Browser-local")).toBeVisible();
expect(await screen.findByText(/substantive change row/u)).toBeVisible();
expect(screen.getAllByText("CRLF").length).toBeGreaterThan(0);
await user.click(screen.getByRole("tab", { name: "Side by side" }));
expect(
screen.getByRole("table", { name: "Side-by-side differences" }),
).toBeVisible();
});
it("keeps exact large numbers in the RFC 6902 artifact", async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByRole("tab", { name: /JSON Semantic/u }));
fireEvent.change(screen.getByTestId("left-editor"), {
target: { value: '{"n":1}' },
});
fireEvent.change(screen.getByTestId("right-editor"), {
target: { value: '{"n":9007199254740993123456789}' },
});
await user.click(screen.getByRole("button", { name: "Compare now" }));
await waitFor(() =>
expect(screen.getByText(/1 substantive change row/u)).toBeVisible(),
);
await user.click(screen.getByRole("tab", { name: "Patches" }));
expect(
(screen.getByTestId("json-patch") as HTMLTextAreaElement).value,
).toContain("9007199254740993123456789");
});
it("keeps the last successful XML result visible beside an error", async () => {
const user = userEvent.setup();
render();
await user.click(screen.getByRole("tab", { name: /XML Namespace-aware/u }));
expect(await screen.findByText(/substantive change row/u)).toBeVisible();
const verdict = screen.getByText("Different", { exact: true });
fireEvent.change(screen.getByTestId("left-editor"), {
target: { value: "" },
});
await user.click(screen.getByRole("button", { name: "Compare now" }));
expect(await screen.findByText("xml.doctype-rejected")).toBeVisible();
expect(verdict).toBeVisible();
});
});