From 1928ff3b6a2e3271eabe449e97e92f08e858902a Mon Sep 17 00:00:00 2001 From: cnc Date: Wed, 3 Jun 2026 11:04:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=82=E8=80=83=E6=89=80=E6=9C=89=E5=88=86?= =?UTF-8?q?=E7=BB=84=EF=BC=9A=E8=A1=A5=E5=85=85OPFS=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E5=A4=87=E4=BB=BD=E6=96=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 结论:按 LinuxCNC rs274ngc_pre.cc 仅成功解释后执行 save_parameters() 的语义,验证浏览器 OPFS 参数 .bak 不会在失败解析后被替换;未扩展 smoke 解析行为。 验证:./test-native.sh;./test-linuxcnc-source-link.sh;./test-web-wasm-browser-smoke.sh。 --- ...wser-wasm-smoke-opfs-parameter-sections.js | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/web/test-browser-wasm-smoke-opfs-parameter-sections.js b/web/test-browser-wasm-smoke-opfs-parameter-sections.js index 1d99974..b3e0300 100644 --- a/web/test-browser-wasm-smoke-opfs-parameter-sections.js +++ b/web/test-browser-wasm-smoke-opfs-parameter-sections.js @@ -14,13 +14,14 @@ export async function runBrowserOpfsParameterSections(context, simulator) { runSection, withSmokeSimulator, } = context; + const backend = { backend: "linuxcnc-rs274" }; await runSection("opfs parameter save", async () => { await simulator.parseWithParameterFile( "G21 G90\nG0 X1\nG28.1\nM30\n", "parameters/rs274ngc.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); const opfsParameterFile = await readOpfsText(simulator, "parameters/rs274ngc.var"); expectIncludes(opfsParameterFile, "5161\t1.000000", "LinuxCNC parameter file was not persisted into OPFS"); @@ -34,7 +35,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X8\nO10 endif\n", "parameters/rs274ngc.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectEvent(restoredWorkspaceEvents, (event) => event.type === "linear-feed" && near(event.end.x, 8), "LinuxCNC OPFS parameter file was not restored across WASM simulator instances"); @@ -48,11 +49,10 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nM30\n", "parameters/rs274ngc.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); const defaultParameterBackup = await readOpfsText(simulator, "parameters/rs274ngc.var.bak"); - expectIncludes(defaultParameterBackup, "5161\t1.000000", - "LinuxCNC default OPFS parameter backup did not preserve the previous file"); + expectIncludes(defaultParameterBackup, "5161\t1.000000", "LinuxCNC default OPFS parameter backup did not preserve the previous file"); }); await runSection("opfs parameter temporary cleanup", async () => { @@ -64,7 +64,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n", "parameters/rs274ngc.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectEvent(restoredParameterEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9), "LinuxCNC parameter file was not restored from OPFS"); @@ -100,7 +100,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nG0 X4\nG28.1\nM30\n", "parameters/existing-save.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); const existingSaveParameterFile = await readOpfsText(simulator, "parameters/existing-save.var"); expectIncludes(existingSaveParameterFile, "5161\t4.000000", @@ -125,7 +125,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nM30\n", "parameters/stale-backup-cleanup.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); await expectMissingOpfsFile( () => simulator.fs.opfs.readFile("parameters/stale-backup-cleanup.var.bak"), @@ -142,7 +142,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "programs/parameter-file-smoke.ngc", "parameters/rs274ngc.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectEvent(fileParameterEvents, (event) => event.type === "program-end", "OPFS program file with LinuxCNC parameter persistence did not parse"); @@ -163,7 +163,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nM30\n", "parameters/missing-main.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); const missingMainParameterFile = await readOpfsText(simulator, "parameters/missing-main.var"); expectIncludes(missingMainParameterFile, "5220\t1.000000", @@ -178,7 +178,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nF100\nO10 if [#5220 EQ 1]\nG1 X6\nO10 endif\n", "parameters/missing-main.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectEvent(missingMainRestoreEvents, (event) => event.type === "linear-feed" && near(event.end.x, 6), "LinuxCNC-created missing OPFS parameter file was not restored on the next parse"); @@ -206,7 +206,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nM30\n", "parameters/out-of-order.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ), "Parameter file out of order", "LinuxCNC accepted an out-of-order OPFS parameter file", @@ -224,7 +224,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nM30\n", "parameters/out-of-range.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ), "Parameter number out of range", "LinuxCNC accepted an out-of-range OPFS parameter file", @@ -242,7 +242,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nG28.1\n#0 = 1\n", "parameters/failed-parse.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ), "", "LinuxCNC accepted a failing parse that should not persist parameters", @@ -251,6 +251,15 @@ export async function runBrowserOpfsParameterSections(context, simulator) { if (failedParseParameterFile.includes("5161\t1.000000")) { throw new Error("LinuxCNC persisted failed parse parameter updates into OPFS"); } + // LinuxCNC source basis: save_parameters() runs only after successful interpretation. + await simulator.fs.opfs.writeFile("parameters/failed-backup.var", "5161\t5.000000\n"); + await simulator.fs.opfs.writeFile("parameters/failed-backup.var.bak", "5161\t4.000000\n"); + await expectErrorContaining( + () => simulator.parseWithParameterFile("G21 G90\n#0 = 1\n", "parameters/failed-backup.var", "linuxcnc", backend), + "", + "LinuxCNC accepted a failing parse that should not replace the parameter backup", + ); + expectText(await readOpfsText(simulator, "parameters/failed-backup.var.bak"), "5161\t4.000000\n", "LinuxCNC replaced the OPFS parameter backup after a failed parse"); }); await runSection("opfs stale parameter state cleanup", async () => { @@ -259,7 +268,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n", "parameters/stale-state.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectEvent(staleStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9), "LinuxCNC did not honor the loaded OPFS parameter state"); @@ -268,7 +277,7 @@ export async function runBrowserOpfsParameterSections(context, simulator) { "G21 G90\nF100\nO10 if [#5161 EQ 1]\nG1 X9\nO10 endif\n", "parameters/stale-state.var", "linuxcnc", - { backend: "linuxcnc-rs274" }, + backend, ); expectNoEvent(missingStateEvents, (event) => event.type === "linear-feed" && near(event.end.x, 9), "LinuxCNC stale OPFS parameter state was not cleared when the file was missing");