按规划持续工作
结论:补强真实浏览器解释器 SDK 对 LinuxCNC 参数文件 restore/save 及非随机/随机工具表 load/save 的直接验证,并通过 host 聚合 smoke。
This commit is contained in:
@@ -155,14 +155,16 @@ slot readback, and checks the vendored rotary-indexer `G0 A...` execution path
|
|||||||
for `UNLOCK_ROTARY`/`LOCK_ROTARY` boundary events. It also validates
|
for `UNLOCK_ROTARY`/`LOCK_ROTARY` boundary events. It also validates
|
||||||
`Interp::init_named_parameters()` and `Interp::find_named_param()` through the
|
`Interp::init_named_parameters()` and `Interp::find_named_param()` through the
|
||||||
same browser SDK/C ABI path for built-in, INI-backed, HAL-backed, and missing
|
same browser SDK/C ABI path for built-in, INI-backed, HAL-backed, and missing
|
||||||
named-parameter lookup. It also uses real browser OPFS
|
named-parameter lookup. It also directly checks browser SDK parameter-file
|
||||||
storage plus the interpreter SDK to restore and save a LinuxCNC parameter file
|
restore/save through vendored `Interp::restore_parameters()` and
|
||||||
through vendored `Interp::restore_parameters()` and `Interp::save_parameters()`,
|
`Interp::save_parameters()`, including the LinuxCNC-saved text and `.bak`
|
||||||
and directly checks missing-file success plus out-of-order parameter-file
|
backup, and directly checks browser SDK non-random/random tool-table
|
||||||
rejection through the same LinuxCNC `restore_parameters()` C ABI,
|
load/save through vendored `tooldata_common.cc`. The same browser smoke uses
|
||||||
to load/save LinuxCNC tool tables through vendored `tooldata_common.cc`, and
|
real browser OPFS storage plus the interpreter SDK to restore/save LinuxCNC
|
||||||
to check the random-toolchanger `tooldata_save()` result before OPFS text
|
parameter files, directly checks missing-file success plus out-of-order
|
||||||
writeback,
|
parameter-file rejection through the same LinuxCNC `restore_parameters()` C
|
||||||
|
ABI, and checks the random-toolchanger `tooldata_save()` result before OPFS
|
||||||
|
text writeback,
|
||||||
to reject invalid INI-derived parameter/tool-table file names through the OPFS
|
to reject invalid INI-derived parameter/tool-table file names through the OPFS
|
||||||
path model after the names are parsed by the LinuxCNC-backed INI WASM SDK. It
|
path model after the names are parsed by the LinuxCNC-backed INI WASM SDK. It
|
||||||
also verifies that explicit session parameter/tool-table file-name options
|
also verifies that explicit session parameter/tool-table file-name options
|
||||||
@@ -224,7 +226,7 @@ The validation fails if:
|
|||||||
| `tests/wasm/node/verify_interp_wasm.sh` | Validates the initial interpreter-core WASM module can be built from vendored LinuxCNC interpreter source, loaded through the interpreter JS SDK, run the first fixture group through `Interp::execute()` and selected file fixtures through `Interp::open()`/`read()`/`execute()`, match the native canonical event plus required state readback fixtures, and run parameter-file restore/save through vendored LinuxCNC `Interp::restore_parameters()` and `Interp::save_parameters()`. |
|
| `tests/wasm/node/verify_interp_wasm.sh` | Validates the initial interpreter-core WASM module can be built from vendored LinuxCNC interpreter source, loaded through the interpreter JS SDK, run the first fixture group through `Interp::execute()` and selected file fixtures through `Interp::open()`/`read()`/`execute()`, match the native canonical event plus required state readback fixtures, and run parameter-file restore/save through vendored LinuxCNC `Interp::restore_parameters()` and `Interp::save_parameters()`. |
|
||||||
| `tests/opfs/node/verify_file_service.sh` | Validates the host-owned OPFS text-file adapter, path model, session snapshot store including custom filenames and envelope/path rejection paths, machine file store, G-code text store including filename rejection paths, OPFS-to-WASM parameter/tool-table bridges, and grouped machine-session loading without moving file persistence, parameter semantics, or tool-table semantics into the WASM core. |
|
| `tests/opfs/node/verify_file_service.sh` | Validates the host-owned OPFS text-file adapter, path model, session snapshot store including custom filenames and envelope/path rejection paths, machine file store, G-code text store including filename rejection paths, OPFS-to-WASM parameter/tool-table bridges, and grouped machine-session loading without moving file persistence, parameter semantics, or tool-table semantics into the WASM core. |
|
||||||
| `tests/browser/verify_ini_panel_browser.sh` | Validates the INI SDK, INI/interpreter WASM module loading, LinuxCNC-backed INI machine-session file-name string lookup, OPFS text-file round trip, generic session snapshot round trip plus custom filename and envelope/path rejection paths, machine file text round trip, G-code text round trip plus filename rejection paths, and the INI panel UI's machine-session load with default OPFS parameter/tool-table file mapping, G-code run, and canonical-event display paths in a real browser runtime. |
|
| `tests/browser/verify_ini_panel_browser.sh` | Validates the INI SDK, INI/interpreter WASM module loading, LinuxCNC-backed INI machine-session file-name string lookup, OPFS text-file round trip, generic session snapshot round trip plus custom filename and envelope/path rejection paths, machine file text round trip, G-code text round trip plus filename rejection paths, and the INI panel UI's machine-session load with default OPFS parameter/tool-table file mapping, G-code run, and canonical-event display paths in a real browser runtime. |
|
||||||
| `tests/browser/verify_interp_browser.sh` | Validates the interpreter-core WASM module loads through the interpreter JS SDK in a real browser runtime and runs selected positive and negative canonical fixtures through vendored LinuxCNC `Interp::execute()` plus `Interp::open()`/`read()`/`execute()` via the exported C ABI, including OPFS-backed parameter-file restore/save and non-random/random tool-table load/save through vendored LinuxCNC source. |
|
| `tests/browser/verify_interp_browser.sh` | Validates the interpreter-core WASM module loads through the interpreter JS SDK in a real browser runtime and runs selected positive and negative canonical fixtures through vendored LinuxCNC `Interp::execute()` plus `Interp::open()`/`read()`/`execute()` via the exported C ABI, including direct browser SDK and OPFS-backed parameter-file restore/save plus non-random/random tool-table load/save through vendored LinuxCNC source. |
|
||||||
| `tests/host/verify_host_smokes.sh` | Runs the current host-side Node, WASM interpreter-core, OPFS, and browser smoke validation with shared WASM builds. |
|
| `tests/host/verify_host_smokes.sh` | Runs the current host-side Node, WASM interpreter-core, OPFS, and browser smoke validation with shared WASM builds. |
|
||||||
|
|
||||||
## Fixture Coverage
|
## Fixture Coverage
|
||||||
@@ -319,17 +321,20 @@ restore/save behavior through the exported C ABI, including out-of-order file
|
|||||||
rejection, missing-file success, missing required numeric parameter defaulting,
|
rejection, missing-file success, missing required numeric parameter defaulting,
|
||||||
required numeric parameter writeback, removal of named-parameter-only lines
|
required numeric parameter writeback, removal of named-parameter-only lines
|
||||||
from saved output, and the `.bak` backup produced by vendored
|
from saved output, and the `.bak` backup produced by vendored
|
||||||
`save_parameters()`, including browser OPFS readback of the backup text after
|
`save_parameters()`, including direct browser SDK readback from the
|
||||||
the host bridge writes it to persistent storage, plus INI-derived custom and
|
Emscripten filesystem, browser OPFS readback of the backup text after the host
|
||||||
explicit host override parameter-file paths saved back to OPFS with their
|
bridge writes it to persistent storage, plus INI-derived custom and explicit
|
||||||
LinuxCNC-produced backup text. It also covers LinuxCNC tool-table
|
host override parameter-file paths saved back to OPFS with their
|
||||||
load/save behavior through vendored `tooldata_common.cc`, including the
|
LinuxCNC-produced backup text. It also covers LinuxCNC tool-table load/save
|
||||||
non-random and random-toolchanger `tooldata_init()` branches, with the SDK
|
behavior through vendored `tooldata_common.cc`, including the non-random and
|
||||||
only copying text into the Emscripten filesystem and calling the exported C
|
random-toolchanger `tooldata_init()` branches, with the SDK only copying text
|
||||||
ABI; the browser smoke checks the random-toolchanger `tooldata_save()` C ABI
|
into the Emscripten filesystem and calling the exported C ABI; the browser
|
||||||
result before OPFS persistence writes the saved table text back, and verifies
|
smoke directly reads back both non-random and random saved tool-table text
|
||||||
that INI-derived custom and explicit host override tool-table OPFS paths can
|
from the Emscripten filesystem, checks the random-toolchanger
|
||||||
be saved and read back after the table is loaded through vendored LinuxCNC. The same
|
`tooldata_save()` C ABI result before OPFS persistence writes the saved table
|
||||||
|
text back, and verifies that INI-derived custom and explicit host override
|
||||||
|
tool-table OPFS paths can be saved and read back after the table is loaded
|
||||||
|
through vendored LinuxCNC. The same
|
||||||
Node WASM and browser interpreter smokes now validate the exported
|
Node WASM and browser interpreter smokes now validate the exported
|
||||||
`Interp::init()`/`Interp::synch()` probe for initialization canonical events,
|
`Interp::init()`/`Interp::synch()` probe for initialization canonical events,
|
||||||
metric/inch `emcStatus` machine-unit conversion, and current/selected tool
|
metric/inch `emcStatus` machine-unit conversion, and current/selected tool
|
||||||
|
|||||||
@@ -338,6 +338,178 @@
|
|||||||
].join("\n"),
|
].join("\n"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const browserParameterFilePath = "/work/browser-direct.var";
|
||||||
|
interp.writeTextFile(
|
||||||
|
browserParameterFilePath,
|
||||||
|
[
|
||||||
|
"5161 10.5",
|
||||||
|
"5162 20.25",
|
||||||
|
"5220 1",
|
||||||
|
"5221 2.25",
|
||||||
|
"5399 44",
|
||||||
|
"<_named_param> 123",
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"restore_parameters_direct",
|
||||||
|
interp.restoreParameters(browserParameterFilePath),
|
||||||
|
[
|
||||||
|
"restore_parameters=0",
|
||||||
|
"parameter_5161=10.5",
|
||||||
|
"parameter_5162=20.25",
|
||||||
|
"parameter_5221=2.25",
|
||||||
|
"parameter_5399=44",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"save_parameters_direct",
|
||||||
|
interp.saveParameters(browserParameterFilePath, {
|
||||||
|
5161: 12.34,
|
||||||
|
5162: 56.78,
|
||||||
|
5220: 1.0,
|
||||||
|
5221: 9.87,
|
||||||
|
5399: 66.6,
|
||||||
|
}),
|
||||||
|
[
|
||||||
|
"save_parameters=0",
|
||||||
|
"parameter_5161=12.34",
|
||||||
|
"parameter_5162=56.78",
|
||||||
|
"parameter_5221=9.87",
|
||||||
|
"parameter_5399=66.6",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"saved_parameters_direct_text",
|
||||||
|
interp.readTextFile(browserParameterFilePath),
|
||||||
|
[
|
||||||
|
"5161\t12.340000",
|
||||||
|
"5162\t56.780000",
|
||||||
|
"5221\t9.870000",
|
||||||
|
"5399\t66.600000",
|
||||||
|
"absent=<_named_param>",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"saved_parameters_direct_backup",
|
||||||
|
interp.readTextFile(`${browserParameterFilePath}.bak`),
|
||||||
|
[
|
||||||
|
"5161 10.5",
|
||||||
|
"5162 20.25",
|
||||||
|
"5221 2.25",
|
||||||
|
"5399 44",
|
||||||
|
"<_named_param> 123",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
|
||||||
|
const browserToolTablePath = "/work/browser-direct-tool.tbl";
|
||||||
|
interp.writeTextFile(
|
||||||
|
browserToolTablePath,
|
||||||
|
[
|
||||||
|
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser direct finish tool",
|
||||||
|
"T5 P9 X1 Y2 Z3 ;browser direct rough tool",
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"load_tool_table_direct",
|
||||||
|
interp.loadToolTable(browserToolTablePath),
|
||||||
|
[
|
||||||
|
"tooldata_load=0",
|
||||||
|
"tooldata_last_index=2",
|
||||||
|
"tool_1.toolno=2",
|
||||||
|
"tool_1.pocketno=7",
|
||||||
|
"tool_1.z=3.125",
|
||||||
|
"tool_1.diameter=1.5",
|
||||||
|
"tool_1.frontangle=12",
|
||||||
|
"tool_1.backangle=34",
|
||||||
|
"tool_1.orientation=4",
|
||||||
|
"tool_1.comment=browser direct finish tool",
|
||||||
|
"tool_2.toolno=5",
|
||||||
|
"tool_2.pocketno=9",
|
||||||
|
"tool_2.comment=browser direct rough tool",
|
||||||
|
"tool_index_for_tool_2=1",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"save_tool_table_direct",
|
||||||
|
interp.saveToolTable(browserToolTablePath),
|
||||||
|
[
|
||||||
|
"tooldata_save=0",
|
||||||
|
"tool_1.toolno=2",
|
||||||
|
"tool_2.toolno=5",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"saved_tool_table_direct_text",
|
||||||
|
interp.readTextFile(browserToolTablePath),
|
||||||
|
[
|
||||||
|
"T2",
|
||||||
|
"P7",
|
||||||
|
"Z+3.125000",
|
||||||
|
"D+1.500000",
|
||||||
|
"I+12.000000",
|
||||||
|
"J+34.000000",
|
||||||
|
"Q4",
|
||||||
|
";browser direct finish tool",
|
||||||
|
"T5",
|
||||||
|
"P9",
|
||||||
|
";browser direct rough tool",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
|
||||||
|
const browserRandomToolTablePath = "/work/browser-direct-random-tool.tbl";
|
||||||
|
interp.writeTextFile(
|
||||||
|
browserRandomToolTablePath,
|
||||||
|
[
|
||||||
|
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser direct random finish tool",
|
||||||
|
"T5 P9 X1 Y2 Z3 ;browser direct random rough tool",
|
||||||
|
"",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"load_tool_table_direct_random",
|
||||||
|
interp.loadToolTable(browserRandomToolTablePath, { randomToolChanger: true }),
|
||||||
|
[
|
||||||
|
"tooldata_random_toolchanger=1",
|
||||||
|
"tooldata_load=0",
|
||||||
|
"tooldata_last_index=9",
|
||||||
|
"tool_pocket_7.toolno=2",
|
||||||
|
"tool_pocket_7.pocketno=7",
|
||||||
|
"tool_pocket_7.z=3.125",
|
||||||
|
"tool_pocket_7.diameter=1.5",
|
||||||
|
"tool_pocket_7.frontangle=12",
|
||||||
|
"tool_pocket_7.backangle=34",
|
||||||
|
"tool_pocket_7.orientation=4",
|
||||||
|
"tool_pocket_7.comment=browser direct random finish tool",
|
||||||
|
"tool_pocket_9.toolno=5",
|
||||||
|
"tool_pocket_9.pocketno=9",
|
||||||
|
"tool_pocket_9.comment=browser direct random rough tool",
|
||||||
|
"tool_index_for_tool_2=7",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"save_tool_table_direct_random",
|
||||||
|
interp.saveToolTable(browserRandomToolTablePath),
|
||||||
|
[
|
||||||
|
"tooldata_save=0",
|
||||||
|
"tool_pocket_7.toolno=2",
|
||||||
|
"tool_pocket_9.toolno=5",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
verifyExpectedOutput(
|
||||||
|
"saved_tool_table_direct_random_text",
|
||||||
|
interp.readTextFile(browserRandomToolTablePath),
|
||||||
|
[
|
||||||
|
"T2",
|
||||||
|
"P7",
|
||||||
|
";browser direct random finish tool",
|
||||||
|
"T5",
|
||||||
|
"P9",
|
||||||
|
";browser direct random rough tool",
|
||||||
|
].join("\n"),
|
||||||
|
);
|
||||||
|
|
||||||
await saveMachineTextFiles("browser-interp", {
|
await saveMachineTextFiles("browser-interp", {
|
||||||
ini: "[EMC]\nMACHINE = browser-interp\n",
|
ini: "[EMC]\nMACHINE = browser-interp\n",
|
||||||
toolTable: "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser finish tool\n",
|
toolTable: "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser finish tool\n",
|
||||||
|
|||||||
Reference in New Issue
Block a user