packages feed

keiro-dsl-0.15.0.0: test/aggregate-scalar-expression-mutation-test.sh

#!/usr/bin/env bash
# Mutation sentinels for the authoritative inline scalar transducer.
set -euo pipefail

TRANSDUCER="keiro-dsl/test/conformance-scalar-expressions/Generated/AggregateScalarExpressions/ScalarAccount/Transducer.hs"
HOLES="keiro-dsl/test/conformance-scalar-expressions/AggregateScalarExpressions/ScalarAccount/Holes.hs"
FIXTURE="keiro-dsl/test/fixtures/aggregate-scalar-expressions-v2.keiro"
CONFORMANCE_ROOT="keiro-dsl/test/conformance-scalar-expressions"

BACKUP_DIR="$(mktemp -d "${TMPDIR:-/tmp}/keiro-scalar-mutation.XXXXXX")"
case "$BACKUP_DIR" in
  *keiro-scalar-mutation.*) ;;
  *) echo "FAIL: unexpected backup path: $BACKUP_DIR"; exit 1 ;;
esac

cp "$TRANSDUCER" "$BACKUP_DIR/Transducer.hs"
cp "$HOLES" "$BACKUP_DIR/Holes.hs"
cp "$FIXTURE" "$BACKUP_DIR/fixture.keiro"
cp -R "$CONFORMANCE_ROOT" "$BACKUP_DIR/conformance-root"

restore_all() {
  cp -R "$BACKUP_DIR/conformance-root/." "$CONFORMANCE_ROOT/"
  cp "$BACKUP_DIR/fixture.keiro" "$FIXTURE"
}

cleanup() {
  restore_all
  rm -rf "$BACKUP_DIR/conformance-root"
  rm -f "$BACKUP_DIR/Transducer.hs" "$BACKUP_DIR/Holes.hs" "$BACKUP_DIR/fixture.keiro" "$BACKUP_DIR/mutation.log"
  rmdir "$BACKUP_DIR"
}
trap cleanup EXIT

restore_file() {
  cp "$BACKUP_DIR/$1" "$2"
}

expect_red() {
  local label="$1"
  shift
  echo "== mutate: $label =="
  set +e
  "$@" >"$BACKUP_DIR/mutation.log" 2>&1
  mutation_status=$?
  set -e
  if [[ "$mutation_status" -eq 0 ]]; then
    sed -n '1,240p' "$BACKUP_DIR/mutation.log"
    echo "FAIL: mutation stayed green: $label"
    exit 1
  fi
  echo "PASS: mutation turned its owning check red: $label"
}

run_conformance() {
  cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
}

echo "== baseline: scalar expression checks are green =="
run_conformance >/dev/null
cabal test keiro-dsl-test --test-option=--match --test-option='scalar expressions' >/dev/null

sed -i.sed-bak \
  's/d.requested .- B.reg @"capacity"/K.TApp2 (-) (d.requested) (B.reg @"capacity")/' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "Natural monus becomes partial subtraction" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Transducer.hs "$TRANSDUCER"

sed -i.sed-bak \
  '/^        B.requireGuard \$/c\
        B.requireGuard K.PTop' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "generated guard is bypassed" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
cabal run -v0 keiro-dsl -- scaffold "$FIXTURE" --out keiro-dsl/test/conformance-scalar-expressions >/dev/null
run_conformance >/dev/null
cmp "$BACKUP_DIR/Transducer.hs" "$TRANSDUCER"
restore_file Transducer.hs "$TRANSDUCER"

sed -i.sed-bak \
  's/K.lit (2 :: Integer)/K.lit (3 :: Integer)/' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "generated write operand changes" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Transducer.hs "$TRANSDUCER"

sed -i.sed-bak \
  '/^    implementation hole$/a\
    guard cmd.balance >= 0' \
  "$FIXTURE"
rm -f "$FIXTURE.sed-bak"
expect_red "Hole ownership coexists with a DSL guard" \
  cabal run -v0 keiro-dsl -- check "$FIXTURE"
restore_file fixture.keiro "$FIXTURE"

sed -i.sed-bak \
  '/^        B.emit wireClosedEvent (ClosedEventTermFields$/,/^          })$/c\
        B.noEmit' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "Hole transition violates its declared event envelope" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Transducer.hs "$TRANSDUCER"

sed -i.sed-bak \
  's/B.goto ScalarAccountClosed/B.goto ScalarAccountReviewed/' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "Hole transition violates its declared target envelope" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Transducer.hs "$TRANSDUCER"

sed -i.sed-bak \
  's/transition2ReviewedCloseHoleFoldVersion/omittedTransition2ReviewedCloseHoleFoldVersion/g' \
  "$HOLES"
rm -f "$HOLES.sed-bak"
expect_red "Hole fold version is omitted" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Holes.hs "$HOLES"

sed -i.sed-bak \
  's/verifyTransition "transition2ReviewedClose" HoleOwned ScalarAccountReviewed 0/pure ("transition2ReviewedClose", HoleOwned, S.VerifiedSatisfiable)/' \
  "$TRANSDUCER"
rm -f "$TRANSDUCER.sed-bak"
expect_red "opaque Hole is falsely reported verified" cabal test keiro-dsl-conformance-aggregate-scalar-expressions --test-show-details=direct
restore_file Transducer.hs "$TRANSDUCER"

restore_all
run_conformance >/dev/null
git diff --check
echo "PASS: all scalar expression mutations were detected and exact files restored"