#!/usr/bin/env bash set -euo pipefail cd "$(dirname "$0")" # LinuxCNC source basis: Node smoke only verifies the wasm/API bridge around # source-backed LinuxCNC RS274 and switchkins/remap fixtures; it must not grow # independent G-code or kinematics behavior. missing=() minimum_steps=${WASM_NODE_SMOKE_MIN_STEPS:-50} if ! [[ "$minimum_steps" =~ ^[1-9][0-9]*$ ]]; then echo "WASM_NODE_SMOKE_MIN_STEPS must be a positive integer: $minimum_steps" >&2 exit 1 fi require_command() { local command_name=$1 if ! command -v "$command_name" >/dev/null 2>&1; then missing+=("$command_name") fi } require_file() { local file_path=$1 if [[ ! -f "$file_path" ]]; then missing+=("$file_path") elif [[ ! -r "$file_path" || ! -s "$file_path" ]]; then missing+=("readable non-empty $file_path") fi } report_missing_prerequisites() { echo "WASM Node smoke prerequisites are missing: ${missing[*]}." >&2 echo "Run ./build-wasm.sh after activating emsdk to generate web/public/cnc_sim.js and web/public/cnc_sim.wasm." >&2 } required_files=( test-web-wasm-node-smoke.cjs web/public/cnc_sim.js web/public/cnc_sim.wasm web/public/linuxcnc_switchkins_remap_config_cases.json web/src/app.js web/src/wasm-core.js ) for required in \ node \ "${required_files[@]}" do if [[ "$required" == node ]]; then require_command node else require_file "$required" fi done if ((${#missing[@]} > 0)); then report_missing_prerequisites exit 1 fi if ! node - <<'JS' const fs = require("fs"); const cases = JSON.parse(fs.readFileSync("web/public/linuxcnc_switchkins_remap_config_cases.json", "utf8")); if (!Array.isArray(cases) || cases.length === 0) { throw new Error("expected non-empty LinuxCNC switchkins config case JSON"); } for (const [index, configCase] of cases.entries()) { if ( !configCase || typeof configCase.field !== "string" || typeof configCase.value !== "string" || !Number.isInteger(configCase.m428) || !Number.isInteger(configCase.m429) || !Number.isInteger(configCase.m430) ) { throw new Error(`invalid LinuxCNC switchkins config case at index ${index}`); } } JS then echo "WASM Node smoke switchkins config case JSON check failed" >&2 exit 1 fi node_log=$(mktemp "${TMPDIR:-/tmp}/cnc_sim_node_smoke.XXXXXX.log") cleanup() { rm -f "$node_log" } trap cleanup EXIT echo "running WASM Node smoke" echo "WASM Node smoke node version: $(node --version)" if ! node --check test-web-wasm-node-smoke.cjs >"$node_log" 2>&1; then echo "WASM Node smoke syntax check failed" >&2 sed -n '1,80p' "$node_log" >&2 exit 1 fi for web_module in web/public/cnc_sim.js web/src/wasm-core.js web/src/app.js; do if ! node --check "$web_module" >"$node_log" 2>&1; then echo "WASM Node smoke web module syntax check failed for $web_module" >&2 sed -n '1,80p' "$node_log" >&2 exit 1 fi done if ! node test-web-wasm-node-smoke.cjs >"$node_log" 2>&1; then echo "WASM Node smoke failed" >&2 sed -n '1,120p' "$node_log" >&2 exit 1 fi passed_steps=$(grep -o 'web wasm node smoke passed ([0-9][0-9]* steps)' "$node_log" | tail -n 1 | grep -o '[0-9][0-9]*' || true) if [[ -z "$passed_steps" ]]; then echo "WASM Node smoke did not report a completed step count" >&2 sed -n '1,120p' "$node_log" >&2 exit 1 fi if ((passed_steps < minimum_steps)); then echo "WASM Node smoke covered $passed_steps steps, expected at least $minimum_steps" >&2 sed -n '1,120p' "$node_log" >&2 exit 1 fi cat "$node_log"