Compare commits

..

17 Commits

Author SHA1 Message Date
51f58e8822 继续推进浏览器 OPFS seed 局部常量化 2026-06-14 08:32:38 +08:00
30646b08c4 Guard browser OPFS tool-table seed text 2026-06-14 08:26:39 +08:00
912394d65a Guard browser direct random tool-table input 2026-06-14 08:19:39 +08:00
cb21c867bd Guard browser direct generated tool-table input 2026-06-14 08:12:51 +08:00
922f20d887 Guard browser generated parameter fixture locals 2026-06-14 07:56:49 +08:00
c4b454c711 Guard browser direct generated parameter fixture 2026-06-14 07:52:28 +08:00
0a968b0ebf Guard browser parameter seed object adapter 2026-06-14 07:45:34 +08:00
ec2105ddff Guard browser explicit parameter object adapters 2026-06-14 07:42:01 +08:00
1a77863ddb Guard browser INI-named parameter object adapters 2026-06-14 07:36:48 +08:00
c7e7f075f3 Guard browser direct parameter object adapters 2026-06-14 07:32:22 +08:00
6ac7cc8953 Guard browser OPFS tool-table result adapter 2026-06-14 07:22:59 +08:00
58215c24cc Guard browser OPFS tool-table object adapters 2026-06-14 07:15:00 +08:00
45d34c8586 Guard browser direct session tool-table values 2026-06-14 07:10:28 +08:00
4274cda03d Guard browser custom session tool-table values 2026-06-14 07:07:09 +08:00
c260246a8e Guard browser shared tool-table result helper 2026-06-14 07:03:10 +08:00
29ee314afb Guard browser shared tool-table text helper 2026-06-14 06:59:26 +08:00
5cf6f8f339 Guard browser direct non-random generated tool-table 2026-06-14 06:56:41 +08:00
2 changed files with 1271 additions and 151 deletions

957
text9.txt
View File

@@ -465,3 +465,960 @@ host_wasm_opfs_browser_smokes=ok
tool-table file block 中的 load/save/readback expected lines 是否能复用现有
`opfsToolTable*` helpers 或局部常量;只改测试胶水,不改变 direct generated file input、
WASM path 字符串或保存/读取行为。
十一、2026-06-14 继续执行记录browser direct generated non-random tool-table helper guard
本轮按上一条下一步建议继续收敛 direct non-random generated toolchanger file block 的
load/save/readback expected lines范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `directToolTableResultLines(...)`,统一 direct non-random generated load/save
result expected lines 的拼装;
- 新增 `directToolTableTextLines(...)`,统一 direct non-random generated saved
tool-table readback expected lines 的拼装;
- 为 direct non-random generated file block 增加 `browserDirectFinishTool`、
`browserDirectRoughTool` 与 `browserDirectTools` 局部常量;
- `load_tool_table_direct` expected lines 改为复用
`directToolTableResultLines("load", ...)`,并继续显式保留 `tooldata_last_index=2`
和 `tool_index_for_tool_2=1`
- `save_tool_table_direct` expected lines 改为复用
`directToolTableResultLines("save", ...)`
- `saved_tool_table_direct_text` expected lines 改为复用
`directToolTableTextLines(...)`
- 未改变 direct generated file input、WASM path 字符串、save/read/load 行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct `browser-interp` session 和
direct generated file block 之间是否还能抽出更小的共享 tool-table helper只改测试
胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
十二、2026-06-14 继续执行记录browser shared tool-table text helper guard
本轮按上一条下一步建议继续收敛 direct `browser-interp` session 与 direct generated
file block 之间的 saved tool-table text helper范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `toolTableTextLines(...)`,统一 tool object 到 saved tool-table readback
expected lines 的拼装;
- `directToolTableTextLines(...)` 改为复用 `toolTableTextLines(...)`
- `opfsRandomToolTableTextLines(...)` 改为复用 `toolTableTextLines(...)`
- 保留 direct 与 random wrapper 名称,避免扩大调用点改动;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 tool-table result helper 是否也能抽出
不改变输出的 shared `tool.resultLines` flatten helper或者转向 custom session
tool-table load value groups 的局部常量收敛只改测试胶水不改变输入、OPFS path、
WASM path 字符串或保存/读取行为。
十三、2026-06-14 继续执行记录browser shared tool-table result helper guard
本轮按上一条下一步建议继续收敛 tool-table result helper 的重复
`tool.resultLines` flatten 逻辑,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `toolTableResultLines(...)`,统一 tool object 到 load/save result expected
lines 的 flatten 逻辑;
- `directToolTableResultLines(...)` 改为复用 `toolTableResultLines(...)`
- `opfsRandomToolTableResultLines(...)` 改为复用 `toolTableResultLines(...)`
- 保留 direct 与 random wrapper 的输出前缀、extra lines 顺序和调用点不变;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 custom session tool-table load/save
value groups看是否能像 direct session 一样用 tool object locals 表达 load、
save、readback 三组 expected lines只改测试胶水不改变输入、OPFS path、WASM path
字符串或保存/读取行为。
十四、2026-06-14 继续执行记录browser custom session tool-table value object guard
本轮按上一条下一步建议继续收敛 custom session 普通 tool-table load/save/readback
value groups范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `opfsToolTableToolValues(...)`,用显式 object locals 承载普通 OPFS
tool-table 的 seed、load result 与 readback expected 值;
- `iniNamedToolTable*` 三组并行数组收敛为 `iniNamedToolTable` object
- `explicitToolTable*` 三组并行数组收敛为 `explicitToolTable` object
- `loadComment`、`readbackZOffset` 与 `readbackDiameter` 继续显式传入,避免在
browser test glue 中推导 LinuxCNC-owned tool-table 格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct `browser-interp` ordinary
tool-table value groups 是否也能复用 `opfsToolTableToolValues(...)`,或把
`opfsToolTableSeedText(...)` / `opfsToolTableTextLines(...)` 调用收敛成 object
adapter只改测试胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
十五、2026-06-14 继续执行记录browser direct session tool-table value object guard
本轮按上一条下一步建议继续收敛 direct `browser-interp` ordinary tool-table
load/save/readback value groups范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- `browserInterpToolTableValues` 与 `browserInterpToolTableReadbackValues` 两组并行
数组收敛为 `browserInterpToolTable` object
- direct `browser-interp` ordinary tool-table 的 load/save/readback expected lines
改为复用 `opfsToolTableToolValues(...)` 的显式 object locals
- front angle、back angle、orientation 与 `tool_index_for_tool_2=1` 仍保留在
对应 load expected lines 调用点,保持语义边界外显;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描是否值得新增
`opfsToolTableSeedTextForTool(...)` / `opfsToolTableTextLinesForTool(...)` object
adapter减少普通 OPFS tool-table 调用点的参数展开;只改测试胶水,不改变输入、
OPFS path、WASM path 字符串或保存/读取行为。
十六、2026-06-14 继续执行记录browser OPFS tool-table object adapter guard
本轮按上一条下一步建议继续收敛普通 OPFS tool-table helper 调用点的参数展开,
范围仍只触及 `wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `opfsToolTableTextLinesForTool(...)`,从显式 tool object locals 转发到
`opfsToolTableTextLines(...)`
- 新增 `opfsToolTableSeedTextForTool(...)`,从显式 tool object locals 转发到
`opfsToolTableSeedText(...)`
- direct `browser-interp` ordinary tool-table readback 改为复用
`opfsToolTableTextLinesForTool(...)`,并继续显式保留 `I/J/Q` readback lines
- INI-named 与 explicit custom session ordinary tool-table seed/readback 调用点改为
复用 object adapter
- adapter 只转发已显式保存的 object 字段,不推导 LinuxCNC-owned tool-table 格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 ordinary OPFS tool-table load/save
result 调用点是否值得新增 `opfsToolTableResultLinesForTool(...)` object adapter
只改测试胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
十七、2026-06-14 继续执行记录browser OPFS tool-table result object adapter guard
本轮按上一条下一步建议继续收敛普通 OPFS tool-table load/save result helper 调用点
的参数展开,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `opfsToolTableResultLinesForTool(...)`,从显式 tool object locals 转发到
`opfsToolTableResultLines(...)`
- direct `browser-interp` ordinary tool-table load/save result 调用点改为复用
`opfsToolTableResultLinesForTool(...)`
- INI-named 与 explicit custom session ordinary tool-table load/save result 调用点改为
复用 `opfsToolTableResultLinesForTool(...)`
- load result 的 front angle、back angle、orientation、comment 与
`tool_index_for_tool_2=1` 等 extra lines 仍保留在调用点,保持语义边界外显;
- adapter 只转发已显式保存的 object 字段,不推导 LinuxCNC-owned tool-table 格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bind`verify_host_smokes.sh` 首次在
browser smoke 阶段因 `PermissionError: [Errno 1] Operation not permitted` 失败;
- 已按规则授权重跑 `wasm-port/tests/host/verify_host_smokes.sh`,重跑通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描普通 OPFS tool-table object helper
是否还能合并命名或减少重复 adapter如果收益不明显转向 parameter result/text 的
object adapter 收敛只改测试胶水不改变输入、OPFS path、WASM path 字符串或
保存/读取行为。
十八、2026-06-14 继续执行记录browser direct parameter object adapter guard
本轮按上一条下一步建议继续收敛 direct `browser-interp` parameter result/text helper
调用点的参数展开,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `opfsParameterResultLinesForValues(...)`,从显式 parameter value set 转发到
`opfsParameterResultLines(...)`
- 新增 `opfsParameterTextLinesForValues(...)`,从显式 parameter value set 转发到
`opfsParameterTextLines(...)`
- 新增 `opfsParameterValueSet(...)` 与 `opfsParameterValuesForValueSet(...)`
让 direct `browser-interp` parameter load/save/readback 只通过 object locals
传递;
- direct `browser-interp` 的 initial restore、save、readback text 和 backup text
调用点改为复用 parameter object adapter
- adapter 只转发已显式保存的 object 字段,不推导 LinuxCNC-owned parameter 格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bind`verify_host_smokes.sh` 首次在
browser smoke 阶段因 `PermissionError: [Errno 1] Operation not permitted` 失败;
- 已按规则授权重跑 `wasm-port/tests/host/verify_host_smokes.sh`,重跑通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 parameter 的 direct helper 是否还能
合并命名,或者转向更少层级的 `parameter result/text` adapter只改测试胶水不改变
输入、OPFS path、WASM path 字符串或保存/读取行为。
十九、2026-06-14 继续执行记录browser INI-named parameter object adapter guard
本轮按上一条下一步建议继续收敛 INI-named custom session parameter result/text
helper 调用点的参数展开,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- `iniNamedInitialParameterValues` 改为 `opfsParameterValueSet(...)`
- `iniNamedParameterValues`、`iniNamedParameterExpectedValues` 与
`iniNamedParameterReadbackValues` 改为 `opfsParameterValueSet(...)`
- INI-named custom session parameter restore/save/readback/backup 调用点改为复用
`opfsParameterResultLinesForValues(...)`、
`opfsParameterTextLinesForValues(...)` 与
`opfsParameterValuesForValueSet(...)`
- seed file 写入仍显式展开 `parameter5161/5162/5221/5399` 字段,不推导
LinuxCNC-owned parameter 文件格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 explicit custom session parameter
value groups把 `explicit*Parameter*` 数组也收敛到
`opfsParameterValueSet(...)` object adapter只改测试胶水不改变输入、OPFS path、
WASM path 字符串或保存/读取行为。
二十、2026-06-14 继续执行记录browser explicit parameter object adapter guard
本轮按上一条下一步建议继续收敛 explicit custom session parameter result/text helper
调用点的参数展开,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- `explicitInitialParameterValues` 改为 `opfsParameterValueSet(...)`
- `explicitParameterValues`、`explicitParameterExpectedValues` 与
`explicitParameterReadbackValues` 改为 `opfsParameterValueSet(...)`
- explicit custom session parameter restore/save/readback/backup 调用点改为复用
`opfsParameterResultLinesForValues(...)`、
`opfsParameterTextLinesForValues(...)` 与
`opfsParameterValuesForValueSet(...)`
- seed file 写入仍显式展开 `parameter5161/5162/5221/5399` 字段,不推导
LinuxCNC-owned parameter 文件格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描是否值得新增
`opfsParameterSeedTextForValues(...)` object adapter收敛 direct、INI-named 与
explicit parameter seed file 写入的字段展开只改测试胶水不改变输入、OPFS path、
WASM path 字符串或保存/读取行为。
二十一、2026-06-14 继续执行记录browser parameter seed object adapter guard
本轮按上一条下一步建议继续收敛 parameter seed file 写入的字段展开,范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `opfsParameterSeedTextForValues(...)`,从显式 parameter value set 转发到
`opfsParameterSeedText(...)`
- INI-named custom session parameter seed file 写入改为复用
`opfsParameterSeedTextForValues(...)`
- explicit custom session parameter seed file 写入改为复用
`opfsParameterSeedTextForValues(...)`
- adapter 只转发已显式保存的 object 字段,不推导 LinuxCNC-owned parameter 文件
格式;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct/generated parameter fixture
helpers 是否也能复用 `opfsParameterValueSet(...)` 或 seed/text adapter只改测试胶水
不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
二十二、2026-06-14 继续执行记录browser direct generated parameter fixture adapter guard
本轮按上一条下一步建议继续收敛 direct generated parameter fixture helper 的
expected lines 与 seed lines范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `opfsParameterSeedLines(...)`,为 parameter seed text helper 提供结构化
seed line 列表;
- 新增 `opfsParameterSeedLinesForValues(...)`,从显式 parameter value set 转发到
`opfsParameterSeedLines(...)`
- `opfsParameterSeedText(...)` 与 `opfsParameterSeedTextForValues(...)` 改为复用
seed line helper
- direct generated `browser-direct.var` seed input 改为复用
`opfsParameterSeedLinesForValues(...)`,并继续显式保留 `<_named_param> 123`
- `restore_parameters_direct`、`save_parameters_direct`、
`saved_parameters_direct_text` 与 `saved_parameters_direct_backup` expected lines
改为复用 parameter object adapter
- `absent=<_named_param>` 与 `<_named_param> 123` 仍保留在对应调用点,保持语义边界外显;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 out-of-order 与 missing-required
generated parameter fixtures 是否能复用小型 local constants 或 existing parameter
helpers只改测试胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
二十三、2026-06-14 继续执行记录browser generated parameter fixture locals guard
本轮按上一条下一步建议继续收敛 out-of-order 与 missing-required generated
parameter fixtures范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- out-of-order generated parameter fixture input 从裸字符串改为局部 seed line 数组;
- missing-required generated parameter fixture input 从裸字符串改为
`missingRequiredParameterSeedLines` 局部常量;
- missing-required expected output 继续显式保留 `parameter_5161=3.5` 与
`parameter_5162=0`
- 未引入 parameter 格式推导,未复用不合适的 generic text helper
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct generated parameter fixture
path/name constants 是否还能更清晰地局部命名,或者转向 tool-table generated fixture
input locals只改测试胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
二十四、2026-06-14 继续执行记录browser direct generated tool-table input locals guard
本轮按上一条下一步建议转向 direct generated tool-table fixture input locals范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `browserDirectToolTableInputLines` 局部常量,承载 direct non-random generated
tool-table fixture input lines
- `writeGeneratedToolTableFixture(...)` 调用改为复用
`browserDirectToolTableInputLines.join("\n")`
- 保持 `browserDirectFinishTool`、`browserDirectRoughTool` 与后续 load/save/readback
expected lines 不变;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct generated random tool-table fixture
input lines 是否也能抽为局部常量只改测试胶水不改变输入、OPFS path、WASM path
字符串或保存/读取行为。
二十五、2026-06-14 继续执行记录browser direct generated random tool-table input locals guard
本轮按上一条下一步建议继续收敛 direct generated random tool-table fixture input
locals范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser test glue。
完成内容:
- 新增 `browserDirectRandomToolTableInputLines` 局部常量,承载 direct random
generated tool-table fixture input lines
- `writeGeneratedToolTableFixture(...)` 调用改为复用
`browserDirectRandomToolTableInputLines.join("\n")`
- 保持 `browserDirectRandomFinishTool`、`browserDirectRandomRoughTool` 与后续
load/save/readback expected lines 不变;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 browser OPFS session tool-table seed
text 是否还能抽为局部 constants或者转向 direct generated tool-table path constants
只改测试胶水不改变输入、OPFS path、WASM path 字符串或保存/读取行为。
二十六、2026-06-14 继续执行记录browser OPFS session tool-table seed text local guard
本轮按上一条下一步建议继续收敛 browser OPFS session tool-table seed text范围仍只触及
`wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `browserInterpToolTableInputText` 局部常量,承载 ordinary
`browser-interp` session 的 tool-table seed text
- `saveMachineTextFiles(...)` 中 ordinary session 的 `toolTable` 字段改为复用
`browserInterpToolTableInputText`
- 保持 `browserInterpToolTable` object、load/save/readback expected lines、
OPFS path 与 WASM path 不变;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
browser_interp_smoke=ok
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
host_wasm_opfs_browser_smokes=ok
```
备注:
- 当前 sandbox 会拦截本地 HTTP server socket bindbrowser smoke 与
`verify_host_smokes.sh` 的 browser 阶段需授权运行;
- 本轮 browser smoke 与 host smoke 均已授权运行并通过。
下一步建议:
继续小批量 browser test glue guard。优先扫描 random OPFS session tool-table seed
text 是否也能抽为局部 constants只改测试胶水不改变输入、OPFS path、WASM path
字符串或保存/读取行为。
二十七、2026-06-14 继续执行记录browser random OPFS session tool-table seed text local guard
本轮按上一条下一步建议继续收敛 browser random OPFS session tool-table seed text范围仍
只触及 `wasm-port/tests/browser/interp_smoke.html` 的 browser/OPFS test glue。
完成内容:
- 新增 `browserRandomToolTableInputText` 局部常量,承载 random
`browser-random-toolchanger` session 的 tool-table seed text
- `saveMachineTextFiles(...)` 中 random session 的 `toolTable` 字段改为复用
`browserRandomToolTableInputText`
- 保持 `browserRandomTools` object、load/save/readback expected lines、OPFS path 与
WASM path 不变;
- 未改变任何 expected 字符串、输入、OPFS path、WASM path 字符串或 save/read/load
行为;
- 未改变 staging path 模型、OPFS bridge behavior、file-service、SDK planner、
interpreter、INI、tool、parameter 或 LinuxCNC-owned runtime semantics。
验证已通过:
```bash
git diff --check
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_interp_wasm.sh
SKIP_INTERP_BUILD=1 wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
SKIP_INI_BUILD=1 SKIP_INTERP_BUILD=1 wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tests/host/verify_host_smokes.sh
```
关键输出:
```text
vendor sync up to date
standalone CNC semantics guard complete
interp_wasm_node_smoke=ok
sim_configs_wasm_node_inventory_executed=28
sim_configs_wasm_node_inventory_passed=28
sim_configs_wasm_node_inventory_skipped=131
sim_configs_wasm_node_inventory_unexpected_fail=0
browser_interp_smoke=ok
host_wasm_opfs_browser_smokes=ok
```
下一步建议:
继续小批量 browser test glue guard。优先扫描 direct/random session 的 parameter/tool-table
seed text 是否还能继续局部常量化只改测试胶水不改变输入、OPFS path、WASM path
字符串或保存/读取行为。

View File

@@ -4557,6 +4557,16 @@
];
}
function opfsParameterResultLinesForValues(operation, values) {
return opfsParameterResultLines(
operation,
values.parameter5161,
values.parameter5162,
values.parameter5221,
values.parameter5399,
);
}
function opfsParameterTextLines(separator, parameter5161, parameter5162, parameter5221, parameter5399) {
return [
`5161${separator}${parameter5161}`,
@@ -4566,13 +4576,45 @@
];
}
function opfsParameterSeedText(parameter5161, parameter5162, parameter5221, parameter5399) {
function opfsParameterTextLinesForValues(separator, values) {
return opfsParameterTextLines(
separator,
values.parameter5161,
values.parameter5162,
values.parameter5221,
values.parameter5399,
);
}
function opfsParameterSeedLines(parameter5161, parameter5162, parameter5221, parameter5399) {
return [
`5161 ${parameter5161}`,
`5162 ${parameter5162}`,
"5220 1",
`5221 ${parameter5221}`,
`5399 ${parameter5399}`,
];
}
function opfsParameterSeedText(parameter5161, parameter5162, parameter5221, parameter5399) {
return [
...opfsParameterSeedLines(parameter5161, parameter5162, parameter5221, parameter5399),
"",
].join("\n");
}
function opfsParameterSeedLinesForValues(values) {
return opfsParameterSeedLines(
values.parameter5161,
values.parameter5162,
values.parameter5221,
values.parameter5399,
);
}
function opfsParameterSeedTextForValues(values) {
return [
...opfsParameterSeedLinesForValues(values),
"",
].join("\n");
}
@@ -4589,6 +4631,15 @@
];
}
function opfsParameterValueSet(parameter5161, parameter5162, parameter5221, parameter5399) {
return {
parameter5161,
parameter5162,
parameter5221,
parameter5399,
};
}
function opfsParameterValues(parameter5161, parameter5162, parameter5221, parameter5399) {
return {
5161: parameter5161,
@@ -4599,6 +4650,15 @@
};
}
function opfsParameterValuesForValueSet(values) {
return opfsParameterValues(
values.parameter5161,
values.parameter5162,
values.parameter5221,
values.parameter5399,
);
}
function opfsToolTableResultLines(operation, toolNo, pocketNo, extraLines = []) {
return [
`tooldata_${operation}=0`,
@@ -4608,6 +4668,10 @@
];
}
function opfsToolTableResultLinesForTool(operation, tool, extraLines = []) {
return opfsToolTableResultLines(operation, tool.toolNo, tool.pocketNo, extraLines);
}
function opfsToolTableTextLines(toolNo, pocketNo, zOffset, diameter, comment, extraLines = []) {
return [
`T${toolNo}`,
@@ -4619,26 +4683,90 @@
];
}
function opfsRandomToolTableResultLines(operation, tools) {
function opfsToolTableTextLinesForTool(tool, extraLines = []) {
return opfsToolTableTextLines(
tool.toolNo,
tool.pocketNo,
tool.readbackZOffset,
tool.readbackDiameter,
tool.comment,
extraLines,
);
}
function opfsToolTableToolValues(
toolNo,
pocketNo,
zOffset,
diameter,
comment,
loadComment,
readbackZOffset,
readbackDiameter,
) {
return {
toolNo,
pocketNo,
zOffset,
diameter,
comment,
loadComment,
readbackZOffset,
readbackDiameter,
};
}
function toolTableResultLines(tools) {
return tools.flatMap((tool) => tool.resultLines);
}
function directToolTableResultLines(operation, tools, extraLines = []) {
return [
...(operation === "load" ? ["tooldata_random_toolchanger=1"] : []),
`tooldata_${operation}=0`,
...tools.flatMap((tool) => tool.resultLines),
...extraLines,
...toolTableResultLines(tools),
];
}
function opfsRandomToolTableTextLines(tools) {
function toolTableTextLines(tools) {
return tools.flatMap((tool) => [
`T${tool.toolNo}`,
`P${tool.pocketNo}`,
...(tool.extraTextLines ?? []),
tool.comment,
]);
}
function directToolTableTextLines(tools) {
return toolTableTextLines(tools);
}
function opfsRandomToolTableResultLines(operation, tools) {
return [
...(operation === "load" ? ["tooldata_random_toolchanger=1"] : []),
`tooldata_${operation}=0`,
...toolTableResultLines(tools),
];
}
function opfsRandomToolTableTextLines(tools) {
return toolTableTextLines(tools);
}
function opfsToolTableSeedText(toolNo, pocketNo, zOffset, diameter, comment) {
return `T${toolNo} P${pocketNo} Z${zOffset} D${diameter} ${comment}\n`;
}
function opfsToolTableSeedTextForTool(tool) {
return opfsToolTableSeedText(
tool.toolNo,
tool.pocketNo,
tool.zOffset,
tool.diameter,
tool.comment,
);
}
function opfsCustomSessionIniText(machineId, parameterFilename, toolTableFilename) {
return [
"[EMC]",
@@ -9139,7 +9267,11 @@
const outOfOrderParameterFilePath = writeGeneratedParameterFixture(
interp,
"/work/browser-out-of-order.var",
"5220 1\n5161 2\n",
[
"5220 1",
"5161 2",
"",
].join("\n"),
);
verifyExpectedOutput(
"restore_parameters_out_of_order",
@@ -9150,10 +9282,15 @@
].join("\n"),
);
const missingRequiredParameterSeedLines = [
"5161 3.5",
"5220 1",
"",
];
const missingRequiredParameterFilePath = writeGeneratedParameterFixture(
interp,
"/work/browser-missing-required.var",
"5161 3.5\n5220 1\n",
missingRequiredParameterSeedLines.join("\n"),
);
verifyExpectedOutput(
"restore_parameters_missing_required",
@@ -9169,51 +9306,40 @@
interp,
"/work/browser-direct.var",
[
"5161 10.5",
"5162 20.25",
"5220 1",
"5221 2.25",
"5399 44",
...opfsParameterSeedLinesForValues(
opfsParameterValueSet("10.5", "20.25", "2.25", "44"),
),
"<_named_param> 123",
"",
].join("\n"),
);
const browserDirectInitialParameterValues = opfsParameterValueSet("10.5", "20.25", "2.25", "44");
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"),
opfsParameterResultLinesForValues("restore", browserDirectInitialParameterValues).join("\n"),
);
const browserDirectParameterValues = opfsParameterValueSet(12.34, 56.78, 9.87, 66.6);
const browserDirectParameterExpectedValues = opfsParameterValueSet("12.34", "56.78", "9.87", "66.6");
const browserDirectParameterReadbackValues = opfsParameterValueSet(
"12.340000",
"56.780000",
"9.870000",
"66.600000",
);
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"),
interp.saveParameters(
browserParameterFilePath,
opfsParameterValuesForValueSet(browserDirectParameterValues),
),
opfsParameterResultLinesForValues("save", browserDirectParameterExpectedValues).join("\n"),
);
verifyExpectedOutput(
"saved_parameters_direct_text",
interp.readTextFile(browserParameterFilePath),
[
"5161\t12.340000",
"5162\t56.780000",
"5221\t9.870000",
"5399\t66.600000",
...opfsParameterTextLinesForValues("\t", browserDirectParameterReadbackValues),
"absent=<_named_param>",
].join("\n"),
);
@@ -9221,29 +9347,26 @@
"saved_parameters_direct_backup",
interp.readTextFile(`${browserParameterFilePath}.bak`),
[
"5161 10.5",
"5162 20.25",
"5221 2.25",
"5399 44",
...opfsParameterTextLinesForValues(" ", browserDirectInitialParameterValues),
"<_named_param> 123",
].join("\n"),
);
const browserDirectToolTableInputLines = [
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser direct finish tool",
"T5 P9 X1 Y2 Z3 ;browser direct rough tool",
"",
];
const browserToolTablePath = writeGeneratedToolTableFixture(
interp,
"/work/browser-direct-tool.tbl",
[
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser direct finish tool",
"T5 P9 X1 Y2 Z3 ;browser direct rough tool",
"",
].join("\n"),
browserDirectToolTableInputLines.join("\n"),
);
verifyExpectedOutput(
"load_tool_table_direct",
interp.loadToolTable(browserToolTablePath),
[
"tooldata_load=0",
"tooldata_last_index=2",
const browserDirectFinishTool = {
toolNo: "2",
pocketNo: "7",
comment: ";browser direct finish tool",
resultLines: [
"tool_1.toolno=2",
"tool_1.pocketno=7",
"tool_1.z=3.125",
@@ -9252,47 +9375,57 @@
"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",
],
extraTextLines: [
"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 browserDirectRoughTool = {
toolNo: "5",
pocketNo: "9",
comment: ";browser direct rough tool",
resultLines: [
"tool_2.toolno=5",
"tool_2.pocketno=9",
"tool_2.comment=browser direct rough tool",
],
};
const browserDirectTools = [browserDirectFinishTool, browserDirectRoughTool];
verifyExpectedOutput(
"load_tool_table_direct",
interp.loadToolTable(browserToolTablePath),
directToolTableResultLines("load", browserDirectTools, [
"tooldata_last_index=2",
"tool_index_for_tool_2=1",
]).join("\n"),
);
verifyExpectedOutput(
"save_tool_table_direct",
interp.saveToolTable(browserToolTablePath),
directToolTableResultLines("save", [
{ resultLines: ["tool_1.toolno=2"] },
{ resultLines: ["tool_2.toolno=5"] },
]).join("\n"),
);
verifyExpectedOutput(
"saved_tool_table_direct_text",
interp.readTextFile(browserToolTablePath),
directToolTableTextLines(browserDirectTools).join("\n"),
);
const browserDirectRandomToolTableInputLines = [
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser direct random finish tool",
"T5 P9 X1 Y2 Z3 ;browser direct random rough tool",
"",
];
const browserRandomToolTablePath = writeGeneratedToolTableFixture(
interp,
"/work/browser-direct-random-tool.tbl",
[
"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"),
browserDirectRandomToolTableInputLines.join("\n"),
);
const browserDirectRandomFinishTool = {
toolNo: "2",
@@ -9345,10 +9478,11 @@
const browserInterpMachineId = "browser-interp";
const browserInterpWasmPaths = opfsBrowserSessionWasmPaths("browser");
const browserInterpInitialParameterValues = ["10.5", "20.25", "2.25", "44"];
const browserInterpInitialParameterValues = opfsParameterValueSet("10.5", "20.25", "2.25", "44");
const browserInterpToolTableInputText = "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser finish tool\n";
const browserInterpTextPaths = await saveMachineTextFiles(browserInterpMachineId, {
ini: `[EMC]\nMACHINE = ${browserInterpMachineId}\n`,
toolTable: "T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser finish tool\n",
toolTable: browserInterpToolTableInputText,
parameters: browserDirectParameterSeedLines(true).join("\n"),
});
assertMachineTextStorePaths(
@@ -9372,36 +9506,43 @@
verifyOpfsLoadResult(
"opfs_restore_parameters",
loadedSession.parameters,
opfsParameterResultLines("restore", ...browserInterpInitialParameterValues),
opfsParameterResultLinesForValues("restore", browserInterpInitialParameterValues),
);
const browserInterpToolTableValues = ["2", "7", "3.125", "1.5", "browser finish tool"];
const browserInterpToolTableReadbackValues = [
const browserInterpToolTable = opfsToolTableToolValues(
"2",
"7",
"3.125",
"1.5",
";browser finish tool",
"browser finish tool",
"+3.125000",
"+1.500000",
";browser finish tool",
];
);
verifyOpfsLoadResult(
"opfs_load_tool_table",
loadedSession.toolTable,
opfsToolTableResultLines("load", browserInterpToolTableValues[0], browserInterpToolTableValues[1], [
`tool_1.z=${browserInterpToolTableValues[2]}`,
`tool_1.diameter=${browserInterpToolTableValues[3]}`,
opfsToolTableResultLinesForTool("load", browserInterpToolTable, [
`tool_1.z=${browserInterpToolTable.zOffset}`,
`tool_1.diameter=${browserInterpToolTable.diameter}`,
"tool_1.frontangle=12",
"tool_1.backangle=34",
"tool_1.orientation=4",
`tool_1.comment=${browserInterpToolTableValues[4]}`,
`tool_1.comment=${browserInterpToolTable.loadComment}`,
"tool_index_for_tool_2=1",
]),
);
const browserInterpParameterValues = [12.34, 56.78, 9.87, 66.6];
const browserInterpParameterExpectedValues = ["12.34", "56.78", "9.87", "66.6"];
const browserInterpParameterReadbackValues = ["12.340000", "56.780000", "9.870000", "66.600000"];
const browserInterpParameterValues = opfsParameterValueSet(12.34, 56.78, 9.87, 66.6);
const browserInterpParameterExpectedValues = opfsParameterValueSet("12.34", "56.78", "9.87", "66.6");
const browserInterpParameterReadbackValues = opfsParameterValueSet(
"12.340000",
"56.780000",
"9.870000",
"66.600000",
);
const savedParameters = await saveMachineParametersToOpfs(
interp,
browserInterpMachineId,
opfsParameterValues(...browserInterpParameterValues),
opfsParameterValuesForValueSet(browserInterpParameterValues),
{ wasmPath: browserInterpWasmPaths.parameters },
);
assertOpfsSavedParameterStaging(
@@ -9414,14 +9555,14 @@
verifyOpfsSaveResult(
"opfs_save_parameters",
savedParameters,
opfsParameterResultLines("save", ...browserInterpParameterExpectedValues),
opfsParameterResultLinesForValues("save", browserInterpParameterExpectedValues),
);
await verifyOpfsMachineFileReadback(
"opfs_saved_parameter_text",
browserInterpMachineId,
"parameters",
[
...opfsParameterTextLines("\t", ...browserInterpParameterReadbackValues),
...opfsParameterTextLinesForValues("\t", browserInterpParameterReadbackValues),
"absent=<_named_param>",
],
);
@@ -9429,7 +9570,7 @@
"opfs_saved_parameter_backup_text",
savedParameters.backupOpfsPath,
[
...opfsParameterTextLines(" ", ...browserInterpInitialParameterValues),
...opfsParameterTextLinesForValues(" ", browserInterpInitialParameterValues),
"<_named_param> 123",
],
);
@@ -9448,16 +9589,13 @@
verifyOpfsSaveResult(
"opfs_save_tool_table",
savedToolTable,
opfsToolTableResultLines("save", browserInterpToolTableValues[0], browserInterpToolTableValues[1]),
opfsToolTableResultLinesForTool("save", browserInterpToolTable),
);
await verifyOpfsMachineFileReadback(
"opfs_saved_tool_table_text",
browserInterpMachineId,
"toolTable",
opfsToolTableTextLines(
...browserInterpToolTableReadbackValues,
["I+12.000000", "J+34.000000", "Q4"],
),
opfsToolTableTextLinesForTool(browserInterpToolTable, ["I+12.000000", "J+34.000000", "Q4"]),
);
const browserRandomMachineId = "browser-random-toolchanger";
@@ -9487,6 +9625,11 @@
],
};
const browserRandomTools = [browserRandomFinishTool, browserRandomRoughTool];
const browserRandomToolTableInputText = [
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser random finish tool",
"T5 P9 X1 Y2 Z3 ;browser random rough tool",
"",
].join("\n");
const browserRandomTextPaths = await saveMachineTextFiles(browserRandomMachineId, {
ini: [
"[EMC]",
@@ -9496,11 +9639,7 @@
"RANDOM_TOOLCHANGER = yes",
"",
].join("\n"),
toolTable: [
"T2 P7 Z3.125 D1.5 I12 J34 Q4 ;browser random finish tool",
"T5 P9 X1 Y2 Z3 ;browser random rough tool",
"",
].join("\n"),
toolTable: browserRandomToolTableInputText,
parameters: browserDirectParameterSeedLines().join("\n"),
});
assertMachineTextStorePaths(
@@ -9575,19 +9714,26 @@
browserIniFileTextPaths,
iniFileMachineId,
);
const iniNamedInitialParameterValues = ["31.25", "62.5", "4.5", "99"];
const iniNamedInitialParameterValues = opfsParameterValueSet("31.25", "62.5", "4.5", "99");
await writeOpfsMachineFile(
iniFileMachineId,
iniFileParameterFilename,
opfsParameterSeedText(...iniNamedInitialParameterValues),
opfsParameterSeedTextForValues(iniNamedInitialParameterValues),
);
const iniNamedToolTable = opfsToolTableToolValues(
"8",
"8",
"4.5",
"0.5",
";browser custom tool",
"browser custom tool",
"+4.500000",
"+0.500000",
);
const iniNamedToolTableValues = ["8", "8", "4.5", "0.5", ";browser custom tool"];
const iniNamedToolTableLoadValues = ["8", "8", "4.5", "0.5", "browser custom tool"];
const iniNamedToolTableReadbackValues = ["8", "8", "+4.500000", "+0.500000", ";browser custom tool"];
await writeOpfsMachineFile(
iniFileMachineId,
iniFileToolTableFilename,
opfsToolTableSeedText(...iniNamedToolTableValues),
opfsToolTableSeedTextForTool(iniNamedToolTable),
);
const loadedIniFileSession = await loadMachineSessionFromOpfs(
interp,
@@ -9615,15 +9761,20 @@
verifyOpfsLoadResult(
"opfs_load_ini_named_parameter_file",
loadedIniFileSession.parameters,
opfsParameterResultLines("restore", ...iniNamedInitialParameterValues),
opfsParameterResultLinesForValues("restore", iniNamedInitialParameterValues),
);
const iniNamedParameterValues = opfsParameterValueSet(33.75, 67.5, 5.25, 199);
const iniNamedParameterExpectedValues = opfsParameterValueSet("33.75", "67.5", "5.25", "199");
const iniNamedParameterReadbackValues = opfsParameterValueSet(
"33.750000",
"67.500000",
"5.250000",
"199.000000",
);
const iniNamedParameterValues = [33.75, 67.5, 5.25, 199];
const iniNamedParameterExpectedValues = ["33.75", "67.5", "5.25", "199"];
const iniNamedParameterReadbackValues = ["33.750000", "67.500000", "5.250000", "199.000000"];
const savedIniNamedParameters = await saveMachineParametersToOpfs(
interp,
iniFileMachineId,
opfsParameterValues(...iniNamedParameterValues),
opfsParameterValuesForValueSet(iniNamedParameterValues),
opfsLoadedFileSaveOptions(loadedIniFileSession.parameters),
);
assertOpfsSavedParameterStaging(
@@ -9636,25 +9787,25 @@
verifyOpfsSaveResult(
"opfs_save_ini_named_parameter_file",
savedIniNamedParameters,
opfsParameterResultLines("save", ...iniNamedParameterExpectedValues),
opfsParameterResultLinesForValues("save", iniNamedParameterExpectedValues),
);
await verifyOpfsReadback(
"opfs_saved_ini_named_parameter_text",
loadedIniFileSession.parameters.opfsPath,
opfsParameterTextLines("\t", ...iniNamedParameterReadbackValues),
opfsParameterTextLinesForValues("\t", iniNamedParameterReadbackValues),
);
await verifyOpfsReadback(
"opfs_saved_ini_named_parameter_backup_text",
savedIniNamedParameters.backupOpfsPath,
opfsParameterTextLines(" ", ...iniNamedInitialParameterValues),
opfsParameterTextLinesForValues(" ", iniNamedInitialParameterValues),
);
verifyOpfsLoadResult(
"opfs_load_ini_named_tool_table",
loadedIniFileSession.toolTable,
opfsToolTableResultLines("load", iniNamedToolTableLoadValues[0], iniNamedToolTableLoadValues[1], [
`tool_1.z=${iniNamedToolTableLoadValues[2]}`,
`tool_1.diameter=${iniNamedToolTableLoadValues[3]}`,
`tool_1.comment=${iniNamedToolTableLoadValues[4]}`,
opfsToolTableResultLinesForTool("load", iniNamedToolTable, [
`tool_1.z=${iniNamedToolTable.zOffset}`,
`tool_1.diameter=${iniNamedToolTable.diameter}`,
`tool_1.comment=${iniNamedToolTable.loadComment}`,
]),
);
const savedIniNamedToolTable = await saveMachineToolTableToOpfs(
@@ -9672,12 +9823,12 @@
verifyOpfsSaveResult(
"opfs_save_ini_named_tool_table",
savedIniNamedToolTable,
opfsToolTableResultLines("save", iniNamedToolTableValues[0], iniNamedToolTableValues[1]),
opfsToolTableResultLinesForTool("save", iniNamedToolTable),
);
await verifyOpfsReadback(
"opfs_saved_ini_named_tool_table_text",
loadedIniFileSession.toolTable.opfsPath,
opfsToolTableTextLines(...iniNamedToolTableReadbackValues),
opfsToolTableTextLinesForTool(iniNamedToolTable),
);
const iniOverrideMachineId = "browser-ini-override-session";
@@ -9699,19 +9850,26 @@
browserIniOverrideTextPaths,
iniOverrideMachineId,
);
const explicitInitialParameterValues = ["41.25", "82.5", "6.5", "101"];
const explicitInitialParameterValues = opfsParameterValueSet("41.25", "82.5", "6.5", "101");
await writeOpfsMachineFile(
iniOverrideMachineId,
explicitParameterFilename,
opfsParameterSeedText(...explicitInitialParameterValues),
opfsParameterSeedTextForValues(explicitInitialParameterValues),
);
const explicitToolTable = opfsToolTableToolValues(
"9",
"9",
"5.5",
"0.625",
";browser explicit tool",
"browser explicit tool",
"+5.500000",
"+0.625000",
);
const explicitToolTableValues = ["9", "9", "5.5", "0.625", ";browser explicit tool"];
const explicitToolTableLoadValues = ["9", "9", "5.5", "0.625", "browser explicit tool"];
const explicitToolTableReadbackValues = ["9", "9", "+5.500000", "+0.625000", ";browser explicit tool"];
await writeOpfsMachineFile(
iniOverrideMachineId,
explicitToolTableFilename,
opfsToolTableSeedText(...explicitToolTableValues),
opfsToolTableSeedTextForTool(explicitToolTable),
);
const loadedIniOverrideSession = await loadMachineSessionFromOpfs(
interp,
@@ -9743,24 +9901,29 @@
verifyOpfsLoadResult(
"opfs_load_explicit_parameter_file",
loadedIniOverrideSession.parameters,
opfsParameterResultLines("restore", ...explicitInitialParameterValues),
opfsParameterResultLinesForValues("restore", explicitInitialParameterValues),
);
verifyOpfsLoadResult(
"opfs_load_explicit_tool_table",
loadedIniOverrideSession.toolTable,
opfsToolTableResultLines("load", explicitToolTableLoadValues[0], explicitToolTableLoadValues[1], [
`tool_1.z=${explicitToolTableLoadValues[2]}`,
`tool_1.diameter=${explicitToolTableLoadValues[3]}`,
`tool_1.comment=${explicitToolTableLoadValues[4]}`,
opfsToolTableResultLinesForTool("load", explicitToolTable, [
`tool_1.z=${explicitToolTable.zOffset}`,
`tool_1.diameter=${explicitToolTable.diameter}`,
`tool_1.comment=${explicitToolTable.loadComment}`,
]),
);
const explicitParameterValues = [51.25, 102.5, 7.5, 202];
const explicitParameterExpectedValues = ["51.25", "102.5", "7.5", "202"];
const explicitParameterReadbackValues = ["51.250000", "102.500000", "7.500000", "202.000000"];
const explicitParameterValues = opfsParameterValueSet(51.25, 102.5, 7.5, 202);
const explicitParameterExpectedValues = opfsParameterValueSet("51.25", "102.5", "7.5", "202");
const explicitParameterReadbackValues = opfsParameterValueSet(
"51.250000",
"102.500000",
"7.500000",
"202.000000",
);
const savedExplicitParameters = await saveMachineParametersToOpfs(
interp,
iniOverrideMachineId,
opfsParameterValues(...explicitParameterValues),
opfsParameterValuesForValueSet(explicitParameterValues),
opfsLoadedFileSaveOptions(loadedIniOverrideSession.parameters),
);
assertOpfsSavedParameterStaging(
@@ -9773,17 +9936,17 @@
verifyOpfsSaveResult(
"opfs_save_explicit_parameter_file",
savedExplicitParameters,
opfsParameterResultLines("save", ...explicitParameterExpectedValues),
opfsParameterResultLinesForValues("save", explicitParameterExpectedValues),
);
await verifyOpfsReadback(
"opfs_saved_explicit_parameter_text",
loadedIniOverrideSession.parameters.opfsPath,
opfsParameterTextLines("\t", ...explicitParameterReadbackValues),
opfsParameterTextLinesForValues("\t", explicitParameterReadbackValues),
);
await verifyOpfsReadback(
"opfs_saved_explicit_parameter_backup_text",
savedExplicitParameters.backupOpfsPath,
opfsParameterTextLines(" ", ...explicitInitialParameterValues),
opfsParameterTextLinesForValues(" ", explicitInitialParameterValues),
);
const savedExplicitToolTable = await saveMachineToolTableToOpfs(
interp,
@@ -9800,12 +9963,12 @@
verifyOpfsSaveResult(
"opfs_save_explicit_tool_table",
savedExplicitToolTable,
opfsToolTableResultLines("save", explicitToolTableValues[0], explicitToolTableValues[1]),
opfsToolTableResultLinesForTool("save", explicitToolTable),
);
await verifyOpfsReadback(
"opfs_saved_explicit_tool_table_text",
loadedIniOverrideSession.toolTable.opfsPath,
opfsToolTableTextLines(...explicitToolTableReadbackValues),
opfsToolTableTextLinesForTool(explicitToolTable),
);
await verifyOpfsInvalidIniSessionRejects(