Files
workinf_Blender_Wasm/web/tests/unit/dirty-state.test.mjs
mes123456 7c16b279ae
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance M7 workflows and release operations
2026-08-15 17:43:53 -04:00

56 lines
2.6 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";
import test from "node:test";
import ts from "typescript";
const repoRoot = path.resolve(import.meta.dirname, "../../..");
const sourcePath = path.join(repoRoot, "web/protocol/dirty-state.ts");
const transpiled = ts.transpileModule(fs.readFileSync(sourcePath, "utf8"), {
compilerOptions: { module: ts.ModuleKind.ES2022, target: ts.ScriptTarget.ES2022 },
fileName: sourcePath,
reportDiagnostics: true,
});
assert.deepEqual(transpiled.diagnostics, []);
const moduleUrl = `data:text/javascript;base64,${Buffer.from(transpiled.outputText).toString("base64")}`;
const { acceptHistoryTransaction, acceptMainSave, acceptMainTransaction, createDirtyState, recoverDirtyState } = await import(moduleUrl);
test("M7-06 only marks dirty after an accepted Main transaction", () => {
const clean = createDirtyState(7);
const stale = acceptMainTransaction(clean, 7);
assert.deepEqual(stale, { ok: false, state: clean, errorCode: "DIRTY_REVISION_STALE" });
const edited = acceptMainTransaction(clean, 8);
assert.equal(edited.ok, true);
assert.deepEqual(edited.state, { currentMainRevision: 8, committedMainRevision: 7, dirty: true });
});
test("M7-06 failed, preview and UI-only work preserve the same dirty object", () => {
const clean = createDirtyState(3);
const failedCommandState = clean;
const previewState = failedCommandState;
const uiOnlyState = previewState;
assert.equal(failedCommandState, clean);
assert.equal(previewState, clean);
assert.equal(uiOnlyState, clean);
});
test("M7-06 clears dirty only for a save matching the accepted Main revision", () => {
const edited = recoverDirtyState(9, 7);
assert.deepEqual(acceptMainSave(edited, 8), { ok: false, state: edited, errorCode: "DIRTY_SAVE_REVISION_MISMATCH" });
const saved = acceptMainSave(edited, 9);
assert.equal(saved.ok, true);
assert.deepEqual(saved.state, { currentMainRevision: 9, committedMainRevision: 9, dirty: false });
});
test("M7-07 keeps transaction revisions monotonic while undo content toggles dirty", () => {
const saved = createDirtyState(10);
const edited = acceptMainTransaction(saved, 11);
assert.equal(edited.ok, true);
const undone = acceptHistoryTransaction(edited.state, 12, true);
assert.equal(undone.ok, true);
assert.deepEqual(undone.state, { currentMainRevision: 12, committedMainRevision: 12, dirty: false });
const redone = acceptHistoryTransaction(undone.state, 13, false);
assert.equal(redone.ok, true);
assert.deepEqual(redone.state, { currentMainRevision: 13, committedMainRevision: 12, dirty: true });
});