import assert from "node:assert/strict"; import test from "node:test"; async function loadSubject() { return import("./git-status.ts"); } test("parses null-delimited Git status entries including renames", async () => { const { parseGitPorcelainV1 } = await loadSubject(); const entries = parseGitPorcelainV1([ " M components/App.tsx", "?? notes.txt", "R src/new-name.ts", "src/old-name.ts", "", ].join("\0")); assert.deepEqual(entries, [ { path: "components/App.tsx", indexStatus: " ", worktreeStatus: "M", }, { path: "notes.txt", indexStatus: "?", worktreeStatus: "?", }, { path: "src/new-name.ts", originalPath: "src/old-name.ts", indexStatus: "R", worktreeStatus: " ", }, ]); }); test("classifies Git status for explorer badges", async () => { const { classifyGitStatus } = await loadSubject(); const classify = (pair) => classifyGitStatus({ path: "file.ts", indexStatus: pair[0], worktreeStatus: pair[1], }); assert.deepEqual(classify(" M"), { status: "modified", code: "M" }); assert.deepEqual(classify("??"), { status: "untracked", code: "U" }); assert.deepEqual(classify("A "), { status: "added", code: "A" }); assert.deepEqual(classify("R "), { status: "renamed", code: "R" }); assert.deepEqual(classify("UU"), { status: "conflict", code: "C" }); assert.deepEqual(classify(" D"), { status: "deleted", code: "D" }); });