packages feed

keiro-dsl-0.17.0.0: test/process-reaction-mutation-test.sh

#!/usr/bin/env bash
# Mutation proof for Language-6 process reactions and typed timers.
set -euo pipefail

REACTIONS_SPEC="keiro-dsl/test/fixtures/process-reactions.keiro"
REACTIONS_OUT="keiro-dsl/test/conformance-process-reactions"
REACTIONS_TEST="keiro-dsl:keiro-dsl-conformance-process-reactions"
TIMERS_SPEC="keiro-dsl/test/fixtures/process-timers.keiro"
TIMERS_OUT="keiro-dsl/test/conformance-process-timers"
TIMERS_TEST="keiro-dsl:keiro-dsl-conformance-process-timers"
EXE="$(cabal list-bin keiro-dsl 2>/dev/null)"
MUT="$(mktemp).keiro"
LOG="$(mktemp).log"

restore_all() {
  "$EXE" scaffold "$REACTIONS_SPEC" --out "$REACTIONS_OUT" >/dev/null 2>&1 || true
  "$EXE" scaffold "$TIMERS_SPEC" --out "$TIMERS_OUT" >/dev/null 2>&1 || true
  rm -f "$MUT" "$LOG"
}
trap restore_all EXIT

expect_runtime_failure() {
  local label="$1"
  local source="$2"
  local output="$3"
  local component="$4"

  "$EXE" scaffold "$MUT" --out "$output" >/dev/null 2>&1
  if cabal test "$component" --test-show-details=direct >"$LOG" 2>&1; then
    echo "FAIL: $label mutation was not caught"
    exit 1
  fi
  echo "ok: $label mutation reddened generated conformance"
  "$EXE" scaffold "$source" --out "$output" >/dev/null 2>&1
  cabal test "$component" >/dev/null 2>&1
}

echo "== baseline reaction conformance =="
restore_all
cabal test "$REACTIONS_TEST" "$TIMERS_TEST" >/dev/null 2>&1

sed 's/input.severity == Severity.Sev1/input.severity != Severity.Sev1/' "$REACTIONS_SPEC" >"$MUT"
expect_runtime_failure "guard operator" "$REACTIONS_SPEC" "$REACTIONS_OUT" "$REACTIONS_TEST"

sed 's/schedule escalation fireAt input.raisedAt + 5m { incidentId detail }/schedule escalation fireAt input.raisedAt + 5m { incidentId }/' "$TIMERS_SPEC" >"$MUT"
if "$EXE" check "$MUT" >"$LOG" 2>&1; then
  echo "FAIL: dynamic payload binding mutation was not caught"
  exit 1
fi
grep -F 'ProcessSchedulePayloadIncomplete' "$LOG" >/dev/null
echo "ok: missing dynamic payload binding was rejected"

sed 's/fire dispatch Incident@correlationId EscalateIncident/fire dispatch Incident@correlationId RemindIncident/' "$TIMERS_SPEC" >"$MUT"
expect_runtime_failure "dispatched command" "$TIMERS_SPEC" "$TIMERS_OUT" "$TIMERS_TEST"

sed 's/incident-escalation-timer:/incident-escalation-timer-mutated:/' "$TIMERS_SPEC" >"$MUT"
expect_runtime_failure "timer identity prefix" "$TIMERS_SPEC" "$TIMERS_OUT" "$TIMERS_TEST"

echo "PASS: reaction guards, payload bindings, dispatch commands, and timer identities are pinned"