import { describe, expect, test } from "bun:test"; import { parseCsv, toCsv } from "../src/csv.ts"; describe("csv codec", () => { test("round-trips awkward cells", () => { const x = [["a", "b,c", 'q"uote', "line\nbreak", "cr\r\nlf", "", "🐉"], ["", "", "", "", "", "", ""], ["only"]]; expect(parseCsv(toCsv(x))).toEqual(x); }); test("toCsv uses CRLF and quotes as needed", () => { expect(toCsv([["a", "b c"], ["x,y", 'z"']])).toBe('a,b c\r\n"x,y","z"""\r\n'); }); test("strips BOM and detects semicolon / tab", () => { expect(parseCsv("a;b\n1;2\n")).toEqual([["a", "b"], ["1", "2"]]); expect(parseCsv("a\tb\n1\t2")).toEqual([["a", "b"], ["1", "2"]]); }); test("explicit delimiter wins; delimiters inside quoted header are ignored", () => { expect(parseCsv('"a;b;c",d\n1,2', {})).toEqual([["a;b;c", "d"], ["1", "2"]]); expect(parseCsv("a,b;c\n1,2;3", { delimiter: ";" })).toEqual([["a,b", "c"], ["1,2", "3"]]); }); test("handles CRLF, blank trailing lines, and empty input", () => { expect(parseCsv("a,b\r\n1,2\r\n\r\n")).toEqual([["a", "b"], ["1", "2"]]); expect(parseCsv("")).toEqual([]); }); });