import * as assert from "node:assert"; import { execFileSync } from "node:child_process"; import * as fs from "node:fs"; import * as os from "node:os"; import * as path from "node:path"; import * as vscode from "vscode"; import { activateApi, settle, settleUntil } from "./helpers"; suite("baseline router (PUC-1, INV-7/D13/D14)", () => { test("snapshot mode: enter captures; markReviewed re-pins clean", async () => { const api = await activateApi(); const doc = await vscode.workspace.openTextDocument({ language: "markdown", content: "one\n" }); const ed = await vscode.window.showTextDocument(doc); await vscode.commands.executeCommand("cowriting.coeditDocument"); await settle(); assert.strictEqual(api.diffViewController.modeOf(doc.uri.toString()), "snapshot"); assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.text, "one\n"); await ed.edit((b) => b.insert(new vscode.Position(1, 0), "two\n")); await vscode.commands.executeCommand("cowriting.markReviewed"); const b = api.diffViewController.getBaseline(doc.uri.toString()); assert.strictEqual(b?.text, "one\ntwo\n"); assert.strictEqual(b?.reason, "pinned"); }); test("head mode: baseline = HEAD; commit advances it", async function () { this.timeout(30000); const dir = fs.mkdtempSync(path.join(os.tmpdir(), "cw-git-")); const git = (...a: string[]) => execFileSync("git", ["-C", dir, ...a], { encoding: "utf8" }); git("init", "-q"); fs.writeFileSync(path.join(dir, "doc.md"), "committed\n"); git("add", "doc.md"); git("-c", "user.name=t", "-c", "user.email=t@t", "commit", "-qm", "c1"); const api = await activateApi(); const doc = await vscode.workspace.openTextDocument(vscode.Uri.file(path.join(dir, "doc.md"))); const ed = await vscode.window.showTextDocument(doc); await vscode.commands.executeCommand("cowriting.coeditDocument"); await settleUntil(() => api.diffViewController.modeOf(doc.uri.toString()) === "head", 10000); assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.text, "committed\n"); await ed.edit((b) => b.insert(new vscode.Position(1, 0), "uncommitted\n")); await doc.save(); git("-c", "user.name=t", "-c", "user.email=t@t", "commit", "-aqm", "c2"); await settleUntil( () => api.diffViewController.getBaseline(doc.uri.toString())?.text === "committed\nuncommitted\n", 15000, ); assert.strictEqual(api.diffViewController.getBaseline(doc.uri.toString())?.reason, "head"); }); });