import { describe, expect, it } from "vitest";
import { DiagnosticsStore } from "./diagnostics.js";

describe("diagnostics", () => {
	it("formats diagnostics with severity, location, and message", () => {
		const store = new DiagnosticsStore();
		store.setPushDiagnostics({
			uri: "file:///test.ts",
			diagnostics: [
				{
					range: { start: { line: 0, character: 5 }, end: { line: 0, character: 10 } },
					severity: 1,
					source: "typescript",
					message: "Cannot find name 'hello'.",
				},
			],
		});

		const formatted = store.format("file:///test.ts");
		expect(formatted).toContain("ERROR");
		expect(formatted).toContain("L1:6");
		expect(formatted).toContain("Cannot find name 'hello'.");
		expect(formatted).toContain("[typescript]");
	});

	it("merges push and pull diagnostics with deduplication", () => {
		const store = new DiagnosticsStore();
		const diag = {
			range: { start: { line: 0, character: 0 }, end: { line: 0, character: 5 } },
			severity: 1,
			message: "Error",
		};

		store.setPushDiagnostics({
			uri: "file:///test.ts",
			diagnostics: [diag],
		});
		store.setPullDiagnostics("file:///test.ts", {
			kind: "full",
			items: [diag],
		});

		const merged = store.getMerged("file:///test.ts");
		expect(merged).toHaveLength(1);
	});

	it("returns empty string when no diagnostics exist", () => {
		const store = new DiagnosticsStore();
		expect(store.format("file:///nonexistent.ts")).toBe("");
	});
});
