import assert from "node:assert/strict"; import { access, readFile } from "node:fs/promises"; import { join } from "node:path"; import { GMOCAPY_ICON_REGISTRY_BOUNDARY, getGmoccapyIcon, listGmoccapyIconRegistryEntries, } from "../../app/src/ui/gmoccapy-icon-registry.js"; const repoRoot = new URL("../../..", import.meta.url).pathname.replace(/\/$/, ""); const manifestPath = join(repoRoot, "web-rtcp-5axis-sim-plan/app/src/ui-reference/gmoccapy-button-icons.json"); const manifest = JSON.parse(await readFile(manifestPath, "utf8")); const manifestIconNames = new Set(manifest.entries.map((entry) => entry.iconName).filter(Boolean)); const registryEntries = listGmoccapyIconRegistryEntries(); assert.equal(GMOCAPY_ICON_REGISTRY_BOUNDARY, "gmoccapy_icon_registry_from_working3_manifest_core_ui_subset"); assert.equal(registryEntries.length >= 40, true); const required = [ ["tbtn_estop", "active", "main_switch_on"], ["tbtn_estop", "inactive", "main_switch_off"], ["tbtn_on", "active", "power_on"], ["rbt_manual", "active", "mode_manual_active"], ["rbt_mdi", "active", "mode_mdi_active"], ["rbt_auto", "active", "mode_auto_active"], ["btn_load", "default", "open_file"], ["btn_reload", "default", "refresh"], ["btn_run", "default", "play"], ["btn_stop", "default", "stop"], ["tbtn_pause", "active", "pause_active"], ["btn_step", "default", "step"], ["btn_homing", "default", "ref_all"], ["btn_tool", "default", "hsk_mill_tool"], ["btn_touch", "default", "touch_off"], ["rbt_forward", "active", "spindle_right_on"], ["rbt_reverse", "active", "spindle_left_on"], ["rbt_stop", "active", "spindle_stop_on"], ["tbtn_flood", "active", "coolant_flood_active"], ["tbtn_mist", "inactive", "coolant_mist_inactive"], ["rbt_view_x", "default", "tool_axis_x"], ["rbt_view_y", "default", "tool_axis_y"], ["rbt_view_z", "default", "tool_axis_z"], ["rbt_view_p", "default", "tool_axis_p"], ["tbtn_view_tool_path", "default", "toolpath"], ["tbtn_view_dimension", "default", "dimensions"], ]; for (const [buttonId, variant, expectedIconName] of required) { const icon = getGmoccapyIcon(buttonId, variant); assert.equal(icon.iconName, expectedIconName, `${buttonId}/${variant}`); assert.equal(icon.fallback, false, `${buttonId}/${variant} should use an asset`); assert.equal(icon.semanticBoundary, GMOCAPY_ICON_REGISTRY_BOUNDARY); assert.equal(manifestIconNames.has(icon.iconName), true, `${icon.iconName} missing from manifest`); assert.match(icon.path, /\/assets\/gmoccapy-icons\//); await access(new URL(icon.path)); } const fallback = getGmoccapyIcon("unknown_button", "active"); assert.equal(fallback.iconName, "text_fallback"); assert.equal(fallback.fallback, true); console.log("gmoccapy_icon_registry_smoke=ok");