接入 INI panel session readiness workflow
This commit is contained in:
@@ -66,6 +66,9 @@ import {
|
||||
createIniPanelShellViewModel,
|
||||
createMachineSessionReadonlyStatus,
|
||||
createMachineSessionReadonlyStatusApiManifest,
|
||||
createMachineSessionReadinessFieldState,
|
||||
machineSessionReadinessLogLines,
|
||||
readMachineSessionReadinessWorkflow,
|
||||
loadMachineSessionForControlPageWorkflow,
|
||||
readMachineSessionReadonlyStatus,
|
||||
refreshMachineSessionControlPage,
|
||||
@@ -96,6 +99,10 @@ const sessionWorkflowText = readFileSync(
|
||||
resolve(root, "runtime/ui/ini-panel/control-page-session-workflow.js"),
|
||||
"utf8",
|
||||
);
|
||||
const iniPanelSessionWorkflowText = readFileSync(
|
||||
resolve(root, "runtime/ui/ini-panel/session-workflow.js"),
|
||||
"utf8",
|
||||
);
|
||||
|
||||
const requiredShellExports = [
|
||||
"INI_PANEL_ENTRIES",
|
||||
@@ -168,6 +175,9 @@ const requiredShellExports = [
|
||||
"createMachineSessionControlPageController",
|
||||
"createMachineSessionReadonlyStatus",
|
||||
"createMachineSessionReadonlyStatusApiManifest",
|
||||
"createMachineSessionReadinessFieldState",
|
||||
"machineSessionReadinessLogLines",
|
||||
"readMachineSessionReadinessWorkflow",
|
||||
"loadMachineSessionForControlPageWorkflow",
|
||||
"readMachineSessionReadonlyStatus",
|
||||
"refreshMachineSessionControlPage",
|
||||
@@ -196,6 +206,15 @@ for (const exportName of [
|
||||
assert.match(docText, new RegExp(`\\b${exportName}\\b`));
|
||||
}
|
||||
|
||||
for (const exportName of [
|
||||
"createMachineSessionReadinessFieldState",
|
||||
"machineSessionReadinessLogLines",
|
||||
"readMachineSessionReadinessWorkflow",
|
||||
]) {
|
||||
assert.match(iniPanelSessionWorkflowText, new RegExp(`\\bexport (?:async )?function ${exportName}\\b`));
|
||||
assert.match(docText, new RegExp(`\\b${exportName}\\b`));
|
||||
}
|
||||
|
||||
const requiredPages = [
|
||||
["Launch", "runtime/ui/ini-panel/launch.html"],
|
||||
["Edit and run", "runtime/ui/ini-panel/index.html"],
|
||||
|
||||
@@ -1,9 +1,12 @@
|
||||
import assert from "node:assert/strict";
|
||||
|
||||
import {
|
||||
createMachineSessionReadinessFieldState,
|
||||
createMachineSessionLoadFieldState,
|
||||
loadMachineSessionIntoWasmWorkflow,
|
||||
machineSessionLoadWorkflowLogLines,
|
||||
machineSessionReadinessLogLines,
|
||||
readMachineSessionReadinessWorkflow,
|
||||
restoreMachineSessionSnapshotWorkflow,
|
||||
saveMachineSessionSnapshotWorkflow,
|
||||
} from "../../../runtime/ui/ini-panel/session-workflow.js";
|
||||
@@ -63,6 +66,101 @@ await assert.rejects(
|
||||
/machine session loader/,
|
||||
);
|
||||
|
||||
const readySessionReadiness = {
|
||||
ready: true,
|
||||
phase: "ready",
|
||||
missing: [],
|
||||
checks: [
|
||||
{
|
||||
name: "ini",
|
||||
path: "linuxcnc/machines/xyzab-tdr/machine.ini",
|
||||
ok: true,
|
||||
error: null,
|
||||
},
|
||||
{
|
||||
name: "parameters",
|
||||
path: "linuxcnc/machines/xyzab-tdr/linuxcnc.var",
|
||||
ok: true,
|
||||
error: null,
|
||||
},
|
||||
{
|
||||
name: "toolTable",
|
||||
path: "linuxcnc/machines/xyzab-tdr/tool.tbl",
|
||||
ok: true,
|
||||
error: null,
|
||||
},
|
||||
],
|
||||
snapshotCheck: {
|
||||
name: "snapshot",
|
||||
path: "linuxcnc/sessions/ui-machine-session/ui-machine-session.json",
|
||||
ok: true,
|
||||
error: null,
|
||||
},
|
||||
};
|
||||
|
||||
const readinessWorkflowCalls = [];
|
||||
const readinessWorkflow = await readMachineSessionReadinessWorkflow({
|
||||
readReadiness: async () => {
|
||||
readinessWorkflowCalls.push(["readReadiness"]);
|
||||
return readySessionReadiness;
|
||||
},
|
||||
});
|
||||
assert.deepEqual(readinessWorkflowCalls, [["readReadiness"]]);
|
||||
assert.equal(readinessWorkflow.readiness, readySessionReadiness);
|
||||
assert.deepEqual(createMachineSessionReadinessFieldState(readySessionReadiness), {
|
||||
sessionReadinessPhase: "ready",
|
||||
sessionReadinessReady: "ready",
|
||||
sessionReadinessMissing: "none",
|
||||
});
|
||||
assert.deepEqual(readinessWorkflow.fields, {
|
||||
sessionReadinessPhase: "ready",
|
||||
sessionReadinessReady: "ready",
|
||||
sessionReadinessMissing: "none",
|
||||
});
|
||||
assert.deepEqual(machineSessionReadinessLogLines(readySessionReadiness), [
|
||||
"Session readiness: ready",
|
||||
"ini: linuxcnc/machines/xyzab-tdr/machine.ini -> ok",
|
||||
"parameters: linuxcnc/machines/xyzab-tdr/linuxcnc.var -> ok",
|
||||
"toolTable: linuxcnc/machines/xyzab-tdr/tool.tbl -> ok",
|
||||
"snapshot: linuxcnc/sessions/ui-machine-session/ui-machine-session.json -> ok",
|
||||
]);
|
||||
assert.deepEqual(readinessWorkflow.logLines, machineSessionReadinessLogLines(readySessionReadiness));
|
||||
await assert.rejects(
|
||||
() => readMachineSessionReadinessWorkflow({}),
|
||||
/machine session readiness reader/,
|
||||
);
|
||||
|
||||
const blockedSessionReadiness = {
|
||||
ready: false,
|
||||
phase: "blocked",
|
||||
missing: ["parameters", "toolTable"],
|
||||
checks: [
|
||||
{
|
||||
name: "parameters",
|
||||
path: "linuxcnc/machines/missing/linuxcnc.var",
|
||||
ok: false,
|
||||
error: "missing file",
|
||||
},
|
||||
{
|
||||
name: "toolTable",
|
||||
path: "linuxcnc/machines/missing/tool.tbl",
|
||||
ok: false,
|
||||
error: "missing file",
|
||||
},
|
||||
],
|
||||
snapshotCheck: null,
|
||||
};
|
||||
assert.deepEqual(createMachineSessionReadinessFieldState(blockedSessionReadiness), {
|
||||
sessionReadinessPhase: "blocked",
|
||||
sessionReadinessReady: "blocked",
|
||||
sessionReadinessMissing: "parameters, toolTable",
|
||||
});
|
||||
assert.deepEqual(machineSessionReadinessLogLines(blockedSessionReadiness), [
|
||||
"Session readiness: blocked",
|
||||
"parameters: linuxcnc/machines/missing/linuxcnc.var -> blocked (missing file)",
|
||||
"toolTable: linuxcnc/machines/missing/tool.tbl -> blocked (missing file)",
|
||||
]);
|
||||
|
||||
const calls = [];
|
||||
const saveWorkflow = await saveMachineSessionSnapshotWorkflow({
|
||||
machineId: "xyzab-tdr",
|
||||
@@ -224,6 +322,75 @@ assert.deepEqual(restoreWorkflow.logLines, [
|
||||
"G-code: linuxcnc/gcode/ui-session.ngc",
|
||||
]);
|
||||
|
||||
const restoreReadinessCalls = [];
|
||||
const restoreReadinessWorkflow = await restoreMachineSessionSnapshotWorkflow({
|
||||
machineId: "xyzab-tdr",
|
||||
snapshotId: "ui-machine-session",
|
||||
snapshotFilename: "ui-machine-session.json",
|
||||
snapshotLabel: "ui-machine-session/ui-machine-session.json",
|
||||
loadMachineSessionSnapshot: async (snapshotId, machineId, options) => {
|
||||
restoreReadinessCalls.push(["loadMachineSessionSnapshot", snapshotId, machineId, options]);
|
||||
return {
|
||||
sessionId: snapshotId,
|
||||
metadata: {
|
||||
workflow: "save-session-snapshot",
|
||||
snapshotLabel: "ui-machine-session/ui-machine-session.json",
|
||||
defaultGcodeOpfsPath: "linuxcnc/gcode/ui-session.ngc",
|
||||
},
|
||||
payload: {
|
||||
files: {
|
||||
ini: "linuxcnc/machines/xyzab-tdr/machine.ini",
|
||||
parameters: "linuxcnc/machines/xyzab-tdr/linuxcnc.var",
|
||||
toolTable: "linuxcnc/machines/xyzab-tdr/tool.tbl",
|
||||
gcode: "linuxcnc/gcode/ui-session.ngc",
|
||||
},
|
||||
},
|
||||
};
|
||||
},
|
||||
loadMachineTextFiles: async (machineId) => {
|
||||
restoreReadinessCalls.push(["loadMachineTextFiles", machineId]);
|
||||
return {
|
||||
ini: "[EMC]\nMACHINE = xyzab-tdr\n",
|
||||
};
|
||||
},
|
||||
readReadiness: async () => {
|
||||
restoreReadinessCalls.push(["readReadiness"]);
|
||||
return readySessionReadiness;
|
||||
},
|
||||
});
|
||||
|
||||
assert.deepEqual(restoreReadinessCalls, [
|
||||
[
|
||||
"loadMachineSessionSnapshot",
|
||||
"ui-machine-session",
|
||||
"xyzab-tdr",
|
||||
{ filename: "ui-machine-session.json" },
|
||||
],
|
||||
["loadMachineTextFiles", "xyzab-tdr"],
|
||||
["readReadiness"],
|
||||
]);
|
||||
assert.equal(restoreReadinessWorkflow.readiness, readySessionReadiness);
|
||||
assert.deepEqual(restoreReadinessWorkflow.fields, {
|
||||
sessionIni: "linuxcnc/machines/xyzab-tdr/machine.ini",
|
||||
sessionParameters: "linuxcnc/machines/xyzab-tdr/linuxcnc.var",
|
||||
sessionToolTable: "linuxcnc/machines/xyzab-tdr/tool.tbl",
|
||||
sessionGcode: "linuxcnc/gcode/ui-session.ngc",
|
||||
sessionSnapshot: "ui-machine-session/ui-machine-session.json",
|
||||
sessionReadinessPhase: "ready",
|
||||
sessionReadinessReady: "ready",
|
||||
sessionReadinessMissing: "none",
|
||||
});
|
||||
assert.deepEqual(restoreReadinessWorkflow.logLines, [
|
||||
"Snapshot: ui-machine-session/ui-machine-session.json",
|
||||
"Workflow: save-session-snapshot",
|
||||
"Default G-code: linuxcnc/gcode/ui-session.ngc",
|
||||
"INI: linuxcnc/machines/xyzab-tdr/machine.ini",
|
||||
"Parameter file: linuxcnc/machines/xyzab-tdr/linuxcnc.var",
|
||||
"Tool table file: linuxcnc/machines/xyzab-tdr/tool.tbl",
|
||||
"G-code: linuxcnc/gcode/ui-session.ngc",
|
||||
...machineSessionReadinessLogLines(readySessionReadiness),
|
||||
]);
|
||||
|
||||
const restoreLoadCalls = [];
|
||||
const restoreLoadWorkflow = await restoreMachineSessionSnapshotWorkflow({
|
||||
machineId: "xyzab-tdr",
|
||||
|
||||
Reference in New Issue
Block a user