#!/usr/bin/env bash # Row 79 (#1573): rerun the untyped-list mutants against a tree. Usage: # mutants.sh . Each mutant edits untypedActions in # packages/harness/src/tools.mjs, runs the harness tools test, and restores # the file from a saved copy, so the tree need not be committed. Prints # "killed" or "SURVIVED" per mutant; exit 1 if any survives, a sed doesn't # change the file, or the unmutated run fails. untyped-within-only stands in # for Dewey's mutant of that name (row 73 comment 27506). set -euo pipefail TREE="$(cd "${1:?usage: mutants.sh }" && pwd)" cd "$TREE" SRC=packages/harness/src/tools.mjs TESTS=(packages/harness/tests/tools.test.mjs) run_tests() { node --test "${TESTS[@]}" >"$1" 2>&1; } # name | sed expression MUTANTS=( 'untyped-within-only|s/^ return \[\.\.\.resolved\.limits\.authority\.withinRole, \.\.\.resolved\.limits\.authority\.crossRole\]\.filter/ return [...resolved.limits.authority.withinRole].filter/' 'untyped-cross-first|s/^ return \[\.\.\.resolved\.limits\.authority\.withinRole, \.\.\.resolved\.limits\.authority\.crossRole\]\.filter/ return [...resolved.limits.authority.crossRole, ...resolved.limits.authority.withinRole].filter/' 'untyped-keeps-typed|s/\.filter((a) => !typed\.has(a));$/.filter((a) => a === "message.send" || !typed.has(a));/' ) OUT="${OUT:-$TREE/.mutants}" mkdir -p "$OUT" run_tests "$OUT/baseline.log" || { echo "baseline run failed: $OUT/baseline.log" >&2; exit 1; } echo "baseline: pass" status=0 for m in "${MUTANTS[@]}"; do IFS='|' read -r name expr <<<"$m" cp -p "$SRC" "$OUT/orig" sed -i -e "$expr" "$SRC" if cmp -s "$OUT/orig" "$SRC"; then echo "$name: NOT APPLIED (sed matched nothing)"; status=1; continue fi diff -u "$OUT/orig" "$SRC" >"$OUT/$name.diff" || true if run_tests "$OUT/$name.log"; then echo "$name: SURVIVED"; status=1 else echo "$name: killed ($(grep -E '^✖' "$OUT/$name.log" | grep -v 'failing tests' | sed 's/ ([0-9.]*ms)$//' | sort -u | tr '\n' ';'))" fi cp -p "$OUT/orig" "$SRC" cmp -s "$OUT/orig" "$SRC" || { echo "restore failed: $SRC" >&2; exit 1; } rm -f "$OUT/orig" done exit "$status"