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 是否能复用现有 tool-table file block 中的 load/save/readback expected lines 是否能复用现有
`opfsToolTable*` helpers 或局部常量;只改测试胶水,不改变 direct generated file input、 `opfsToolTable*` helpers 或局部常量;只改测试胶水,不改变 direct generated file input、
WASM path 字符串或保存/读取行为。 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) { function opfsParameterTextLines(separator, parameter5161, parameter5162, parameter5221, parameter5399) {
return [ return [
`5161${separator}${parameter5161}`, `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 [ return [
`5161 ${parameter5161}`, `5161 ${parameter5161}`,
`5162 ${parameter5162}`, `5162 ${parameter5162}`,
"5220 1", "5220 1",
`5221 ${parameter5221}`, `5221 ${parameter5221}`,
`5399 ${parameter5399}`, `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"); ].join("\n");
} }
@@ -4589,6 +4631,15 @@
]; ];
} }
function opfsParameterValueSet(parameter5161, parameter5162, parameter5221, parameter5399) {
return {
parameter5161,
parameter5162,
parameter5221,
parameter5399,
};
}
function opfsParameterValues(parameter5161, parameter5162, parameter5221, parameter5399) { function opfsParameterValues(parameter5161, parameter5162, parameter5221, parameter5399) {
return { return {
5161: parameter5161, 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 = []) { function opfsToolTableResultLines(operation, toolNo, pocketNo, extraLines = []) {
return [ return [
`tooldata_${operation}=0`, `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 = []) { function opfsToolTableTextLines(toolNo, pocketNo, zOffset, diameter, comment, extraLines = []) {
return [ return [
`T${toolNo}`, `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 [ return [
...(operation === "load" ? ["tooldata_random_toolchanger=1"] : []),
`tooldata_${operation}=0`, `tooldata_${operation}=0`,
...tools.flatMap((tool) => tool.resultLines), ...extraLines,
...toolTableResultLines(tools),
]; ];
} }
function opfsRandomToolTableTextLines(tools) { function toolTableTextLines(tools) {
return tools.flatMap((tool) => [ return tools.flatMap((tool) => [
`T${tool.toolNo}`, `T${tool.toolNo}`,
`P${tool.pocketNo}`, `P${tool.pocketNo}`,
...(tool.extraTextLines ?? []),
tool.comment, 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) { function opfsToolTableSeedText(toolNo, pocketNo, zOffset, diameter, comment) {
return `T${toolNo} P${pocketNo} Z${zOffset} D${diameter} ${comment}\n`; 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) { function opfsCustomSessionIniText(machineId, parameterFilename, toolTableFilename) {
return [ return [
"[EMC]", "[EMC]",
@@ -9139,7 +9267,11 @@
const outOfOrderParameterFilePath = writeGeneratedParameterFixture( const outOfOrderParameterFilePath = writeGeneratedParameterFixture(
interp, interp,
"/work/browser-out-of-order.var", "/work/browser-out-of-order.var",
"5220 1\n5161 2\n", [
"5220 1",
"5161 2",
"",
].join("\n"),
); );
verifyExpectedOutput( verifyExpectedOutput(
"restore_parameters_out_of_order", "restore_parameters_out_of_order",
@@ -9150,10 +9282,15 @@
].join("\n"), ].join("\n"),
); );
const missingRequiredParameterSeedLines = [
"5161 3.5",
"5220 1",
"",
];
const missingRequiredParameterFilePath = writeGeneratedParameterFixture( const missingRequiredParameterFilePath = writeGeneratedParameterFixture(
interp, interp,
"/work/browser-missing-required.var", "/work/browser-missing-required.var",
"5161 3.5\n5220 1\n", missingRequiredParameterSeedLines.join("\n"),
); );
verifyExpectedOutput( verifyExpectedOutput(
"restore_parameters_missing_required", "restore_parameters_missing_required",
@@ -9169,51 +9306,40 @@
interp, interp,
"/work/browser-direct.var", "/work/browser-direct.var",
[ [
"5161 10.5", ...opfsParameterSeedLinesForValues(
"5162 20.25", opfsParameterValueSet("10.5", "20.25", "2.25", "44"),
"5220 1", ),
"5221 2.25",
"5399 44",
"<_named_param> 123", "<_named_param> 123",
"", "",
].join("\n"), ].join("\n"),
); );
const browserDirectInitialParameterValues = opfsParameterValueSet("10.5", "20.25", "2.25", "44");
verifyExpectedOutput( verifyExpectedOutput(
"restore_parameters_direct", "restore_parameters_direct",
interp.restoreParameters(browserParameterFilePath), interp.restoreParameters(browserParameterFilePath),
[ opfsParameterResultLinesForValues("restore", browserDirectInitialParameterValues).join("\n"),
"restore_parameters=0", );
"parameter_5161=10.5", const browserDirectParameterValues = opfsParameterValueSet(12.34, 56.78, 9.87, 66.6);
"parameter_5162=20.25", const browserDirectParameterExpectedValues = opfsParameterValueSet("12.34", "56.78", "9.87", "66.6");
"parameter_5221=2.25", const browserDirectParameterReadbackValues = opfsParameterValueSet(
"parameter_5399=44", "12.340000",
].join("\n"), "56.780000",
"9.870000",
"66.600000",
); );
verifyExpectedOutput( verifyExpectedOutput(
"save_parameters_direct", "save_parameters_direct",
interp.saveParameters(browserParameterFilePath, { interp.saveParameters(
5161: 12.34, browserParameterFilePath,
5162: 56.78, opfsParameterValuesForValueSet(browserDirectParameterValues),
5220: 1.0, ),
5221: 9.87, opfsParameterResultLinesForValues("save", browserDirectParameterExpectedValues).join("\n"),
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( verifyExpectedOutput(
"saved_parameters_direct_text", "saved_parameters_direct_text",
interp.readTextFile(browserParameterFilePath), interp.readTextFile(browserParameterFilePath),
[ [
"5161\t12.340000", ...opfsParameterTextLinesForValues("\t", browserDirectParameterReadbackValues),
"5162\t56.780000",
"5221\t9.870000",
"5399\t66.600000",
"absent=<_named_param>", "absent=<_named_param>",
].join("\n"), ].join("\n"),
); );
@@ -9221,29 +9347,26 @@
"saved_parameters_direct_backup", "saved_parameters_direct_backup",
interp.readTextFile(`${browserParameterFilePath}.bak`), interp.readTextFile(`${browserParameterFilePath}.bak`),
[ [
"5161 10.5", ...opfsParameterTextLinesForValues(" ", browserDirectInitialParameterValues),
"5162 20.25",
"5221 2.25",
"5399 44",
"<_named_param> 123", "<_named_param> 123",
].join("\n"), ].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( const browserToolTablePath = writeGeneratedToolTableFixture(
interp, interp,
"/work/browser-direct-tool.tbl", "/work/browser-direct-tool.tbl",
[ browserDirectToolTableInputLines.join("\n"),
"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( const browserDirectFinishTool = {
"load_tool_table_direct", toolNo: "2",
interp.loadToolTable(browserToolTablePath), pocketNo: "7",
[ comment: ";browser direct finish tool",
"tooldata_load=0", resultLines: [
"tooldata_last_index=2",
"tool_1.toolno=2", "tool_1.toolno=2",
"tool_1.pocketno=7", "tool_1.pocketno=7",
"tool_1.z=3.125", "tool_1.z=3.125",
@@ -9252,47 +9375,57 @@
"tool_1.backangle=34", "tool_1.backangle=34",
"tool_1.orientation=4", "tool_1.orientation=4",
"tool_1.comment=browser direct finish tool", "tool_1.comment=browser direct finish tool",
"tool_2.toolno=5", ],
"tool_2.pocketno=9", extraTextLines: [
"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", "Z+3.125000",
"D+1.500000", "D+1.500000",
"I+12.000000", "I+12.000000",
"J+34.000000", "J+34.000000",
"Q4", "Q4",
";browser direct finish tool", ],
"T5", };
"P9", const browserDirectRoughTool = {
";browser direct rough tool", toolNo: "5",
].join("\n"), 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( const browserRandomToolTablePath = writeGeneratedToolTableFixture(
interp, interp,
"/work/browser-direct-random-tool.tbl", "/work/browser-direct-random-tool.tbl",
[ browserDirectRandomToolTableInputLines.join("\n"),
"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"),
); );
const browserDirectRandomFinishTool = { const browserDirectRandomFinishTool = {
toolNo: "2", toolNo: "2",
@@ -9345,10 +9478,11 @@
const browserInterpMachineId = "browser-interp"; const browserInterpMachineId = "browser-interp";
const browserInterpWasmPaths = opfsBrowserSessionWasmPaths("browser"); 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, { const browserInterpTextPaths = await saveMachineTextFiles(browserInterpMachineId, {
ini: `[EMC]\nMACHINE = ${browserInterpMachineId}\n`, 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"), parameters: browserDirectParameterSeedLines(true).join("\n"),
}); });
assertMachineTextStorePaths( assertMachineTextStorePaths(
@@ -9372,36 +9506,43 @@
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_restore_parameters", "opfs_restore_parameters",
loadedSession.parameters, loadedSession.parameters,
opfsParameterResultLines("restore", ...browserInterpInitialParameterValues), opfsParameterResultLinesForValues("restore", browserInterpInitialParameterValues),
); );
const browserInterpToolTableValues = ["2", "7", "3.125", "1.5", "browser finish tool"]; const browserInterpToolTable = opfsToolTableToolValues(
const browserInterpToolTableReadbackValues = [
"2", "2",
"7", "7",
"3.125",
"1.5",
";browser finish tool",
"browser finish tool",
"+3.125000", "+3.125000",
"+1.500000", "+1.500000",
";browser finish tool", );
];
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_load_tool_table", "opfs_load_tool_table",
loadedSession.toolTable, loadedSession.toolTable,
opfsToolTableResultLines("load", browserInterpToolTableValues[0], browserInterpToolTableValues[1], [ opfsToolTableResultLinesForTool("load", browserInterpToolTable, [
`tool_1.z=${browserInterpToolTableValues[2]}`, `tool_1.z=${browserInterpToolTable.zOffset}`,
`tool_1.diameter=${browserInterpToolTableValues[3]}`, `tool_1.diameter=${browserInterpToolTable.diameter}`,
"tool_1.frontangle=12", "tool_1.frontangle=12",
"tool_1.backangle=34", "tool_1.backangle=34",
"tool_1.orientation=4", "tool_1.orientation=4",
`tool_1.comment=${browserInterpToolTableValues[4]}`, `tool_1.comment=${browserInterpToolTable.loadComment}`,
"tool_index_for_tool_2=1", "tool_index_for_tool_2=1",
]), ]),
); );
const browserInterpParameterValues = [12.34, 56.78, 9.87, 66.6]; const browserInterpParameterValues = opfsParameterValueSet(12.34, 56.78, 9.87, 66.6);
const browserInterpParameterExpectedValues = ["12.34", "56.78", "9.87", "66.6"]; const browserInterpParameterExpectedValues = opfsParameterValueSet("12.34", "56.78", "9.87", "66.6");
const browserInterpParameterReadbackValues = ["12.340000", "56.780000", "9.870000", "66.600000"]; const browserInterpParameterReadbackValues = opfsParameterValueSet(
"12.340000",
"56.780000",
"9.870000",
"66.600000",
);
const savedParameters = await saveMachineParametersToOpfs( const savedParameters = await saveMachineParametersToOpfs(
interp, interp,
browserInterpMachineId, browserInterpMachineId,
opfsParameterValues(...browserInterpParameterValues), opfsParameterValuesForValueSet(browserInterpParameterValues),
{ wasmPath: browserInterpWasmPaths.parameters }, { wasmPath: browserInterpWasmPaths.parameters },
); );
assertOpfsSavedParameterStaging( assertOpfsSavedParameterStaging(
@@ -9414,14 +9555,14 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_parameters", "opfs_save_parameters",
savedParameters, savedParameters,
opfsParameterResultLines("save", ...browserInterpParameterExpectedValues), opfsParameterResultLinesForValues("save", browserInterpParameterExpectedValues),
); );
await verifyOpfsMachineFileReadback( await verifyOpfsMachineFileReadback(
"opfs_saved_parameter_text", "opfs_saved_parameter_text",
browserInterpMachineId, browserInterpMachineId,
"parameters", "parameters",
[ [
...opfsParameterTextLines("\t", ...browserInterpParameterReadbackValues), ...opfsParameterTextLinesForValues("\t", browserInterpParameterReadbackValues),
"absent=<_named_param>", "absent=<_named_param>",
], ],
); );
@@ -9429,7 +9570,7 @@
"opfs_saved_parameter_backup_text", "opfs_saved_parameter_backup_text",
savedParameters.backupOpfsPath, savedParameters.backupOpfsPath,
[ [
...opfsParameterTextLines(" ", ...browserInterpInitialParameterValues), ...opfsParameterTextLinesForValues(" ", browserInterpInitialParameterValues),
"<_named_param> 123", "<_named_param> 123",
], ],
); );
@@ -9448,16 +9589,13 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_tool_table", "opfs_save_tool_table",
savedToolTable, savedToolTable,
opfsToolTableResultLines("save", browserInterpToolTableValues[0], browserInterpToolTableValues[1]), opfsToolTableResultLinesForTool("save", browserInterpToolTable),
); );
await verifyOpfsMachineFileReadback( await verifyOpfsMachineFileReadback(
"opfs_saved_tool_table_text", "opfs_saved_tool_table_text",
browserInterpMachineId, browserInterpMachineId,
"toolTable", "toolTable",
opfsToolTableTextLines( opfsToolTableTextLinesForTool(browserInterpToolTable, ["I+12.000000", "J+34.000000", "Q4"]),
...browserInterpToolTableReadbackValues,
["I+12.000000", "J+34.000000", "Q4"],
),
); );
const browserRandomMachineId = "browser-random-toolchanger"; const browserRandomMachineId = "browser-random-toolchanger";
@@ -9487,6 +9625,11 @@
], ],
}; };
const browserRandomTools = [browserRandomFinishTool, browserRandomRoughTool]; 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, { const browserRandomTextPaths = await saveMachineTextFiles(browserRandomMachineId, {
ini: [ ini: [
"[EMC]", "[EMC]",
@@ -9496,11 +9639,7 @@
"RANDOM_TOOLCHANGER = yes", "RANDOM_TOOLCHANGER = yes",
"", "",
].join("\n"), ].join("\n"),
toolTable: [ toolTable: 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"),
parameters: browserDirectParameterSeedLines().join("\n"), parameters: browserDirectParameterSeedLines().join("\n"),
}); });
assertMachineTextStorePaths( assertMachineTextStorePaths(
@@ -9575,19 +9714,26 @@
browserIniFileTextPaths, browserIniFileTextPaths,
iniFileMachineId, iniFileMachineId,
); );
const iniNamedInitialParameterValues = ["31.25", "62.5", "4.5", "99"]; const iniNamedInitialParameterValues = opfsParameterValueSet("31.25", "62.5", "4.5", "99");
await writeOpfsMachineFile( await writeOpfsMachineFile(
iniFileMachineId, iniFileMachineId,
iniFileParameterFilename, 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( await writeOpfsMachineFile(
iniFileMachineId, iniFileMachineId,
iniFileToolTableFilename, iniFileToolTableFilename,
opfsToolTableSeedText(...iniNamedToolTableValues), opfsToolTableSeedTextForTool(iniNamedToolTable),
); );
const loadedIniFileSession = await loadMachineSessionFromOpfs( const loadedIniFileSession = await loadMachineSessionFromOpfs(
interp, interp,
@@ -9615,15 +9761,20 @@
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_load_ini_named_parameter_file", "opfs_load_ini_named_parameter_file",
loadedIniFileSession.parameters, 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( const savedIniNamedParameters = await saveMachineParametersToOpfs(
interp, interp,
iniFileMachineId, iniFileMachineId,
opfsParameterValues(...iniNamedParameterValues), opfsParameterValuesForValueSet(iniNamedParameterValues),
opfsLoadedFileSaveOptions(loadedIniFileSession.parameters), opfsLoadedFileSaveOptions(loadedIniFileSession.parameters),
); );
assertOpfsSavedParameterStaging( assertOpfsSavedParameterStaging(
@@ -9636,25 +9787,25 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_ini_named_parameter_file", "opfs_save_ini_named_parameter_file",
savedIniNamedParameters, savedIniNamedParameters,
opfsParameterResultLines("save", ...iniNamedParameterExpectedValues), opfsParameterResultLinesForValues("save", iniNamedParameterExpectedValues),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_ini_named_parameter_text", "opfs_saved_ini_named_parameter_text",
loadedIniFileSession.parameters.opfsPath, loadedIniFileSession.parameters.opfsPath,
opfsParameterTextLines("\t", ...iniNamedParameterReadbackValues), opfsParameterTextLinesForValues("\t", iniNamedParameterReadbackValues),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_ini_named_parameter_backup_text", "opfs_saved_ini_named_parameter_backup_text",
savedIniNamedParameters.backupOpfsPath, savedIniNamedParameters.backupOpfsPath,
opfsParameterTextLines(" ", ...iniNamedInitialParameterValues), opfsParameterTextLinesForValues(" ", iniNamedInitialParameterValues),
); );
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_load_ini_named_tool_table", "opfs_load_ini_named_tool_table",
loadedIniFileSession.toolTable, loadedIniFileSession.toolTable,
opfsToolTableResultLines("load", iniNamedToolTableLoadValues[0], iniNamedToolTableLoadValues[1], [ opfsToolTableResultLinesForTool("load", iniNamedToolTable, [
`tool_1.z=${iniNamedToolTableLoadValues[2]}`, `tool_1.z=${iniNamedToolTable.zOffset}`,
`tool_1.diameter=${iniNamedToolTableLoadValues[3]}`, `tool_1.diameter=${iniNamedToolTable.diameter}`,
`tool_1.comment=${iniNamedToolTableLoadValues[4]}`, `tool_1.comment=${iniNamedToolTable.loadComment}`,
]), ]),
); );
const savedIniNamedToolTable = await saveMachineToolTableToOpfs( const savedIniNamedToolTable = await saveMachineToolTableToOpfs(
@@ -9672,12 +9823,12 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_ini_named_tool_table", "opfs_save_ini_named_tool_table",
savedIniNamedToolTable, savedIniNamedToolTable,
opfsToolTableResultLines("save", iniNamedToolTableValues[0], iniNamedToolTableValues[1]), opfsToolTableResultLinesForTool("save", iniNamedToolTable),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_ini_named_tool_table_text", "opfs_saved_ini_named_tool_table_text",
loadedIniFileSession.toolTable.opfsPath, loadedIniFileSession.toolTable.opfsPath,
opfsToolTableTextLines(...iniNamedToolTableReadbackValues), opfsToolTableTextLinesForTool(iniNamedToolTable),
); );
const iniOverrideMachineId = "browser-ini-override-session"; const iniOverrideMachineId = "browser-ini-override-session";
@@ -9699,19 +9850,26 @@
browserIniOverrideTextPaths, browserIniOverrideTextPaths,
iniOverrideMachineId, iniOverrideMachineId,
); );
const explicitInitialParameterValues = ["41.25", "82.5", "6.5", "101"]; const explicitInitialParameterValues = opfsParameterValueSet("41.25", "82.5", "6.5", "101");
await writeOpfsMachineFile( await writeOpfsMachineFile(
iniOverrideMachineId, iniOverrideMachineId,
explicitParameterFilename, 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( await writeOpfsMachineFile(
iniOverrideMachineId, iniOverrideMachineId,
explicitToolTableFilename, explicitToolTableFilename,
opfsToolTableSeedText(...explicitToolTableValues), opfsToolTableSeedTextForTool(explicitToolTable),
); );
const loadedIniOverrideSession = await loadMachineSessionFromOpfs( const loadedIniOverrideSession = await loadMachineSessionFromOpfs(
interp, interp,
@@ -9743,24 +9901,29 @@
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_load_explicit_parameter_file", "opfs_load_explicit_parameter_file",
loadedIniOverrideSession.parameters, loadedIniOverrideSession.parameters,
opfsParameterResultLines("restore", ...explicitInitialParameterValues), opfsParameterResultLinesForValues("restore", explicitInitialParameterValues),
); );
verifyOpfsLoadResult( verifyOpfsLoadResult(
"opfs_load_explicit_tool_table", "opfs_load_explicit_tool_table",
loadedIniOverrideSession.toolTable, loadedIniOverrideSession.toolTable,
opfsToolTableResultLines("load", explicitToolTableLoadValues[0], explicitToolTableLoadValues[1], [ opfsToolTableResultLinesForTool("load", explicitToolTable, [
`tool_1.z=${explicitToolTableLoadValues[2]}`, `tool_1.z=${explicitToolTable.zOffset}`,
`tool_1.diameter=${explicitToolTableLoadValues[3]}`, `tool_1.diameter=${explicitToolTable.diameter}`,
`tool_1.comment=${explicitToolTableLoadValues[4]}`, `tool_1.comment=${explicitToolTable.loadComment}`,
]), ]),
); );
const explicitParameterValues = [51.25, 102.5, 7.5, 202]; const explicitParameterValues = opfsParameterValueSet(51.25, 102.5, 7.5, 202);
const explicitParameterExpectedValues = ["51.25", "102.5", "7.5", "202"]; const explicitParameterExpectedValues = opfsParameterValueSet("51.25", "102.5", "7.5", "202");
const explicitParameterReadbackValues = ["51.250000", "102.500000", "7.500000", "202.000000"]; const explicitParameterReadbackValues = opfsParameterValueSet(
"51.250000",
"102.500000",
"7.500000",
"202.000000",
);
const savedExplicitParameters = await saveMachineParametersToOpfs( const savedExplicitParameters = await saveMachineParametersToOpfs(
interp, interp,
iniOverrideMachineId, iniOverrideMachineId,
opfsParameterValues(...explicitParameterValues), opfsParameterValuesForValueSet(explicitParameterValues),
opfsLoadedFileSaveOptions(loadedIniOverrideSession.parameters), opfsLoadedFileSaveOptions(loadedIniOverrideSession.parameters),
); );
assertOpfsSavedParameterStaging( assertOpfsSavedParameterStaging(
@@ -9773,17 +9936,17 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_explicit_parameter_file", "opfs_save_explicit_parameter_file",
savedExplicitParameters, savedExplicitParameters,
opfsParameterResultLines("save", ...explicitParameterExpectedValues), opfsParameterResultLinesForValues("save", explicitParameterExpectedValues),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_explicit_parameter_text", "opfs_saved_explicit_parameter_text",
loadedIniOverrideSession.parameters.opfsPath, loadedIniOverrideSession.parameters.opfsPath,
opfsParameterTextLines("\t", ...explicitParameterReadbackValues), opfsParameterTextLinesForValues("\t", explicitParameterReadbackValues),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_explicit_parameter_backup_text", "opfs_saved_explicit_parameter_backup_text",
savedExplicitParameters.backupOpfsPath, savedExplicitParameters.backupOpfsPath,
opfsParameterTextLines(" ", ...explicitInitialParameterValues), opfsParameterTextLinesForValues(" ", explicitInitialParameterValues),
); );
const savedExplicitToolTable = await saveMachineToolTableToOpfs( const savedExplicitToolTable = await saveMachineToolTableToOpfs(
interp, interp,
@@ -9800,12 +9963,12 @@
verifyOpfsSaveResult( verifyOpfsSaveResult(
"opfs_save_explicit_tool_table", "opfs_save_explicit_tool_table",
savedExplicitToolTable, savedExplicitToolTable,
opfsToolTableResultLines("save", explicitToolTableValues[0], explicitToolTableValues[1]), opfsToolTableResultLinesForTool("save", explicitToolTable),
); );
await verifyOpfsReadback( await verifyOpfsReadback(
"opfs_saved_explicit_tool_table_text", "opfs_saved_explicit_tool_table_text",
loadedIniOverrideSession.toolTable.opfsPath, loadedIniOverrideSession.toolTable.opfsPath,
opfsToolTableTextLines(...explicitToolTableReadbackValues), opfsToolTableTextLinesForTool(explicitToolTable),
); );
await verifyOpfsInvalidIniSessionRejects( await verifyOpfsInvalidIniSessionRejects(