参考所有分组:补充OPFS失败解析备份断言
结论:按 LinuxCNC rs274ngc_pre.cc 仅成功解释后执行 save_parameters() 的语义,验证浏览器 OPFS 参数 .bak 不会在失败解析后被替换;未扩展 smoke 解析行为。 验证:./test-native.sh;./test-linuxcnc-source-link.sh;./test-web-wasm-browser-smoke.sh。
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user