import { describe, expect, it } from "vitest"; import { parseCsv } from "../csv-parser.js"; describe("parseCsv (RFC 4180, T-165)", () => { it("parses a plain row", () => { expect(parseCsv("a,b,c")).toEqual([["a", "b", "c"]]); }); it("splits rows on LF, CRLF and CR", () => { expect(parseCsv("a\nb\r\nc\rd")).toEqual([["a"], ["b"], ["c"], ["d"]]); }); it("handles quoted fields with commas and escaped quotes", () => { expect(parseCsv('a,"x, y","say ""hi""",b')).toEqual([["a", "x, y", 'say "hi"', "b"]]); }); it("handles newlines inside quotes", () => { expect(parseCsv('a,"line1\nline2",b')).toEqual([["a", "line1\nline2", "b"]]); }); it("strips a UTF-8 BOM", () => { expect(parseCsv("a,b")).toEqual([["a", "b"]]); }); it("tolerates ragged rows (extras kept; the caller pads short rows)", () => { expect(parseCsv("a,b,c\n1\n1,2,3,4")).toEqual([["a", "b", "c"], ["1"], ["1", "2", "3", "4"]]); }); it("keeps an unterminated quote's collected content", () => { expect(parseCsv('a,"unterminated,b')).toEqual([["a", "unterminated,b"]]); }); it("empty input has no rows", () => { expect(parseCsv("")).toEqual([]); }); it("a trailing empty line does not create a phantom row", () => { expect(parseCsv("a,b\n1,2\n")).toEqual([["a", "b"], ["1", "2"]]); }); });