import { describe, expect, it } from "vitest";
import { repairTruncatedJson } from "../../src/repair/truncation.js";

describe("repairTruncatedJson", () => {
  it("returns parseable JSON unchanged", () => {
    const r = repairTruncatedJson('{"a":1}');
    expect(r.changed).toBe(false);
    expect(r.repaired).toBe('{"a":1}');
  });

  it("closes unbalanced braces", () => {
    const r = repairTruncatedJson('{"a":1');
    expect(r.changed).toBe(true);
    expect(() => JSON.parse(r.repaired)).not.toThrow();
  });

  it("closes nested unbalanced structures", () => {
    const r = repairTruncatedJson('{"a":{"b":[1,2');
    expect(() => JSON.parse(r.repaired)).not.toThrow();
  });

  it("closes unterminated string", () => {
    const r = repairTruncatedJson('{"a":"he');
    expect(() => JSON.parse(r.repaired)).not.toThrow();
    expect(JSON.parse(r.repaired).a.startsWith("he")).toBe(true);
  });

  it("fills dangling key with null", () => {
    const r = repairTruncatedJson('{"a":');
    expect(() => JSON.parse(r.repaired)).not.toThrow();
    expect(JSON.parse(r.repaired)).toEqual({ a: null });
  });

  it("handles empty input", () => {
    const r = repairTruncatedJson("");
    expect(r.repaired).toBe("{}");
  });

  it("drops trailing comma", () => {
    const r = repairTruncatedJson('{"a":1,');
    expect(() => JSON.parse(r.repaired)).not.toThrow();
    expect(JSON.parse(r.repaired)).toEqual({ a: 1 });
  });
});