Files
workinf_Blender_Wasm/web/tests/unit/grease-pencil-reorder.test.mjs
mes123456 0fe8d2bb56
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 M8-M11 parity workflows
2026-08-17 04:37:07 -04:00

84 lines
3.8 KiB
JavaScript

import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { pathToFileURL } from "node:url";
import test from "node:test";
import ts from "typescript";
const repoRoot = path.resolve(import.meta.dirname, "../../..");
const sourcePath = path.join(repoRoot, "web/protocol/grease-pencil-reorder.ts");
const temporary = fs.mkdtempSync(path.join(os.tmpdir(), "grease-pencil-reorder-unit-"));
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 modulePath = path.join(temporary, "grease-pencil-reorder.mjs");
fs.writeFileSync(modulePath, transpiled.outputText);
const reorder = await import(pathToFileURL(modulePath));
const dataId = "grease-pencil:Data";
const linesId = "grease-pencil-layer:Data:Lines";
const draftsId = "grease-pencil-layer:Data:Web Drafts";
const drawingId = "grease-pencil-drawing:Data:4";
const drawing = { id: drawingId, strokeCount: 0, pointCount: 0, strokes: [] };
const data = [{
id: dataId,
name: "Data",
geometryStatus: "available",
layerCount: 2,
frameCount: 2,
strokeCount: 0,
pointCount: 0,
layers: [
{ id: linesId, name: "Lines", visible: true, locked: false, opacity: 1, frames: [{ frame: 1, drawing: { ...drawing, id: "grease-pencil-drawing:Data:0" } }] },
{ id: draftsId, name: "Web Drafts", visible: true, locked: false, opacity: 1, frames: [{ frame: 1, drawing }] },
],
}];
test("M9-08 binds layer and frame reorder commands to stable IDs and Main revision", () => {
const layer = reorder.validateGreasePencilReorderCommand({
type: "moveGreasePencilLayer",
schemaVersion: 1,
dataId,
layerId: draftsId,
direction: "DOWN",
baseRevision: 27,
}, 27, data);
assert.deepEqual(layer, {
type: "moveGreasePencilLayer",
schemaVersion: 1,
dataId,
layerId: draftsId,
direction: "DOWN",
baseRevision: 27,
});
const frame = reorder.validateGreasePencilReorderCommand({
type: "moveGreasePencilFrame",
schemaVersion: 1,
dataId,
layerId: draftsId,
frame: 1,
targetFrame: 12,
drawingId,
baseRevision: 27,
}, 27, data);
assert.equal(frame.drawingId, drawingId);
assert.equal(frame.targetFrame, 12);
});
test("M9-08 rejects stale, no-op, forged drawing and occupied-target reorders", () => {
const layerCommand = { type: "moveGreasePencilLayer", schemaVersion: 1, dataId, layerId: draftsId, direction: "DOWN", baseRevision: 27 };
assert.throws(() => reorder.validateGreasePencilReorderCommand(layerCommand, 28, data), (error) => error.code === "REVISION_CONFLICT");
assert.throws(() => reorder.validateGreasePencilReorderCommand({ ...layerCommand, layerId: linesId }, 27, data), (error) => error.code === "GREASE_PENCIL_SCHEMA_INVALID");
const frameCommand = { type: "moveGreasePencilFrame", schemaVersion: 1, dataId, layerId: draftsId, frame: 1, targetFrame: 12, drawingId, baseRevision: 27 };
assert.throws(() => reorder.validateGreasePencilReorderCommand({ ...frameCommand, drawingId: "grease-pencil-drawing:Data:5" }, 27, data), (error) => error.code === "GREASE_PENCIL_SCHEMA_INVALID");
assert.throws(() => reorder.validateGreasePencilReorderCommand({ ...frameCommand, targetFrame: 1 }, 27, data), (error) => error.code === "GREASE_PENCIL_SCHEMA_INVALID");
const occupied = [{ ...data[0], layers: data[0].layers.map((layer) => layer.id === draftsId ? { ...layer, frames: [...layer.frames, { frame: 12, drawing: { ...drawing, id: "grease-pencil-drawing:Data:5" } }] } : layer) }];
assert.throws(() => reorder.validateGreasePencilReorderCommand(frameCommand, 27, occupied), (error) => error.code === "GREASE_PENCIL_SCHEMA_INVALID");
});