import { test } from "node:test"; import assert from "node:assert/strict"; import { parsePorcelain } from "./git"; // Run with: pnpm --filter yt-dlp-transcript-common exec tsx --test common/lib/git.test.ts // (or `node_modules/.bin/tsx --test common/lib/git.test.ts` from the repo root) test("parsePorcelain returns empty array for clean tree", () => { assert.deepEqual(parsePorcelain(""), []); assert.deepEqual(parsePorcelain("\n"), []); }); test("parsePorcelain reads modified and staged paths", () => { const out = " M editor/CHANGELOG.md\nM common/lib/git.ts\n"; assert.deepEqual(parsePorcelain(out), [ "editor/CHANGELOG.md", "common/lib/git.ts", ]); }); test("parsePorcelain reads untracked paths", () => { assert.deepEqual(parsePorcelain("?? export/new-file.md\n"), [ "export/new-file.md", ]); }); test("parsePorcelain returns the post-arrow path for renames", () => { const out = "R old/name.md -> new/name.md\n"; assert.deepEqual(parsePorcelain(out), ["new/name.md"]); }); test("parsePorcelain tolerates CRLF line endings", () => { assert.deepEqual(parsePorcelain(" M a.md\r\n?? b.md\r\n"), ["a.md", "b.md"]); });