Files
wasm-simulator/web/test-browser-wasm-smoke-app-sections.js
cnc 6cf7c73392 参考所有分组:完善OPFS参数备份桥接
结论:按 LinuxCNC rs274ngc_pre.cc save_parameters()/restore_parameters() 语义,补齐浏览器 OPFS 参数文件 .bak 持久化;未扩展 smoke 解析行为。

验证:./test-native.sh;./test-linuxcnc-source-link.sh;./test-web-wasm-node-smoke.sh;./test-web-wasm-browser-smoke.sh。
2026-06-03 10:58:05 +08:00

81 lines
3.7 KiB
JavaScript

export async function runBrowserAppOpfsSections(context) {
const {
browserHasOpfs,
createHiddenAppFrame,
disposeAppFrame,
expectIncludes,
expectText,
getAppFrameSimulator,
parseAppFrameProgram,
runSection,
waitFor,
waitForAppAlarm,
waitForAppControls,
} = context;
if (!browserHasOpfs()) {
return;
}
await runSection("browser app opfs save", async () => {
const appFrame = await createHiddenAppFrame();
try {
await waitForAppControls(appFrame, "app frame did not load CNC controls");
parseAppFrameProgram(appFrame, "G21 G90\nG0 X1\nG28.1\nM30\n");
await waitForAppAlarm(appFrame, "OK ", "app frame did not parse program");
const appSimulator = await getAppFrameSimulator(appFrame, "app frame did not create OPFS simulator workspace");
const savedProgram = new TextDecoder().decode(await appSimulator.fs.opfs.readFile("programs/current.ngc"));
expectText(savedProgram, "G21 G90\nG0 X1\nG28.1\nM30\n",
"app frame did not persist current program into OPFS");
const savedParameterFile = new TextDecoder().decode(await appSimulator.fs.opfs.readFile("parameters/rs274ngc.var"));
expectIncludes(savedParameterFile, "5161\t1.000000",
"app frame did not persist LinuxCNC parameter state into OPFS");
await appSimulator.fs.opfs.removeFile("parameters/rs274ngc.var.bak");
parseAppFrameProgram(appFrame, "G21 G90\nG0 X2\nG28.1\nM30\n");
await waitFor(
() => appFrame.contentDocument?.querySelector("#axisX")?.value === "2.000",
"app frame did not parse second program for parameter backup coverage",
);
// LinuxCNC source basis: rs274ngc_pre.cc save_parameters()
// preserves the previous parameter file as filename + ".bak".
const updatedParameterFile = new TextDecoder().decode(await appSimulator.fs.opfs.readFile("parameters/rs274ngc.var"));
expectIncludes(updatedParameterFile, "5161\t2.000000",
"app frame did not replace LinuxCNC parameter state after second parse");
const savedParameterBackup = new TextDecoder().decode(await appSimulator.fs.opfs.readFile("parameters/rs274ngc.var.bak"));
expectIncludes(savedParameterBackup, "5161\t1.000000",
"app frame did not persist LinuxCNC parameter backup into OPFS");
} finally {
await disposeAppFrame(appFrame);
}
});
await runSection("browser app opfs restore", async () => {
const restoredAppFrame = await createHiddenAppFrame();
try {
await waitForAppControls(restoredAppFrame, "restored app frame did not load CNC controls");
await waitFor(() => {
const restoredInput = restoredAppFrame.contentDocument?.querySelector("#programInput");
return restoredInput?.value === "G21 G90\nG0 X2\nG28.1\nM30\n";
}, "app frame did not restore current program from OPFS after reload");
await waitForAppAlarm(
restoredAppFrame,
"OPFS PROGRAM RESTORED",
"app frame did not report OPFS program restore after reload",
);
await getAppFrameSimulator(restoredAppFrame, "restored app frame did not create OPFS simulator workspace");
parseAppFrameProgram(
restoredAppFrame,
"G21 G90\nF100\nO10 if [#5161 EQ 2]\nG1 X12\nO10 endif\nM30\n",
);
await waitForAppAlarm(
restoredAppFrame,
"OK ",
"restored app frame did not parse program with reloaded parameter state",
);
await waitFor(
() => restoredAppFrame.contentDocument?.querySelector("#axisX")?.value === "12.000",
"app frame did not reload LinuxCNC parameter state from OPFS after reload",
);
} finally {
await disposeAppFrame(restoredAppFrame);
}
});
}