#!/usr/bin/env bash set -euo pipefail ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)" TASK_WRAPPER="$ROOT_DIR/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp" SDK="$ROOT_DIR/runtime/sdk/src/linuxcnc-task-hal.js" fail() { printf 'task_status_json_contract_status=fail\n' printf 'task_status_json_contract_error=%s\n' "$1" exit 1 } require_text() { local label="$1" local file="$2" local text="$3" grep -Fq "$text" "$file" || fail "$label missing" printf 'task_status_json_contract_%s=ok\n' "$label" } reject_text() { local label="$1" local file="$2" local text="$3" if grep -Fq "$text" "$file"; then fail "$label present" fi printf 'task_status_json_contract_%s=absent\n' "$label" } if ! command -v emcc >/dev/null 2>&1 && [[ -f "$HOME/emsdk/emsdk_env.sh" ]]; then # shellcheck source=/dev/null source "$HOME/emsdk/emsdk_env.sh" >/dev/null fi if ! command -v emcc >/dev/null 2>&1; then printf 'task_status_json_contract_status=skipped_missing_emcc\n' printf 'nativeTaskReady=false\n' printf 'nativeHalSyncReady=false\n' exit 0 fi if [[ "${SKIP_TASK_HAL_BUILD:-0}" != "1" ]]; then "$ROOT_DIR/tools/build_task_hal_wasm.sh" fi node "$ROOT_DIR/tests/wasm/node/verify_task_status_json_contract.mjs" require_text schema_version "$TASK_WRAPPER" 'schemaVersion' require_text standalone_status_source "$TASK_WRAPPER" 'statusSource' require_text traj_object "$TASK_WRAPPER" 'traj' require_text task_line_fields "$TASK_WRAPPER" 'currentLine' require_text axis_array "$TASK_WRAPPER" 'axis_status_array_json' require_text joint_array "$TASK_WRAPPER" 'joint_status_array_json' require_text io_aux "$TASK_WRAPPER" 'aux' require_text io_tool "$TASK_WRAPPER" 'tool' require_text io_coolant "$TASK_WRAPPER" 'coolant' read_status_body="$( awk '/int lctask_read_status_json/{capture=1} capture{print} capture && /^}/{exit}' "$TASK_WRAPPER" )" if grep -Fq 'lcmot_read_status_json' <<<"$read_status_body"; then fail "lctask_read_status_json calls lcmot_read_status_json" fi printf 'task_status_json_contract_status_read_no_motion_json=ok\n' reject_text sdk_no_motion_semantics "$SDK" "queueFull" reject_text sdk_no_task_semantics "$SDK" "interpState" printf 'task_status_json_contract_status=ok\n'