Files

140 lines
5.4 KiB
Bash

#!/usr/bin/env bash
# CHECK-q85 -- a lane module no collected cell reads is now a graded fault in
# beam's gate, and the six modules the census found invisible have cells
# (volt, 2026-11-02).
#
# Five legs:
# selftest check_coverage.py's own 13 cells: import / chain / path-literal
# coverage, an uncovered module named, a waiver with a reason, a
# waiver with none, a waiver naming a gone file, a waiver left
# over a covered module, a gate-invoked module, no-tests and
# unparseable-test rc 2, and the mutation cell (delete the one
# test -> 0 becomes 1)
# live the lane reads 0 today, and one planted module makes it 1 with
# the name printed, then 0 again when the plant is removed
# before the same tool over the lane at HEAD (no repair): rc 1, and the
# names it prints are the pre-repair census
# mutant Q85's unpinned docstring claim: M-JUL (the Julian leap branch
# dropped) reds test_zeller_dow; the unmutated copy is green
# gate the lane's own CHECK reads 0 with the coverage leg inside it
#
# Exit codes: 0 all legs passed, 1 a fault, 2 could not grade.
set -u
set -o pipefail
cd "$(dirname "${BASH_SOURCE[0]}")" || exit 2
ROOT="$(pwd)"
LANE="$ROOT/wizard-work/beam"
COV="$LANE/check_coverage.py"
WORK="$(mktemp -d "${TMPDIR:-/tmp}/check-q85.XXXXXX")" || exit 2
trap 'rm -rf "$WORK"' EXIT
passed=0
failed=0
ungradable=0
row() { printf ' %-11s %s\n' "$1" "$2"; }
if [ ! -f "$COV" ]; then
echo "CHECK-q85: no $COV -- cannot grade" >&2
exit 2
fi
# --- leg 1: the tool's selftest ---------------------------------------------
python3 "$COV" --selftest >"$WORK/st.out" 2>&1
st=$?
if [ "$st" -eq 0 ]; then
row selftest "PASS $(tail -n 1 "$WORK/st.out")"
passed=$((passed + 1))
else
row selftest "FAULT rc=$st (want 0)"
cat "$WORK/st.out"
failed=$((failed + 1))
fi
# --- leg 2: the live lane, and one planted module ---------------------------
mkdir -p "$WORK/live"
cp -a "$LANE/." "$WORK/live/"
( cd "$WORK/live" && python3 check_coverage.py >"$WORK/live1.out" 2>&1 )
l1=$?
printf '"""a module no collected test reads."""\n\n\ndef stray():\n return 1\n' \
>"$WORK/live/stray_module.py"
( cd "$WORK/live" && python3 check_coverage.py >"$WORK/live2.out" 2>&1 )
l2=$?
rm -f "$WORK/live/stray_module.py"
( cd "$WORK/live" && python3 check_coverage.py >"$WORK/live3.out" 2>&1 )
l3=$?
if [ "$l1" -eq 0 ] && [ "$l2" -eq 1 ] && [ "$l3" -eq 0 ] \
&& grep -q "UNCOVERED \+stray_module" "$WORK/live2.out"; then
row live "PASS lane 0, planted module 1 (named), removed 0"
passed=$((passed + 1))
else
row live "FAULT lane rc=$l1 (want 0), planted rc=$l2 (want 1), removed rc=$l3 (want 0)"
grep -E "UNCOVERED|^coverage:" "$WORK/live1.out" "$WORK/live2.out" "$WORK/live3.out"
failed=$((failed + 1))
fi
# --- leg 3: the census the repair answers -----------------------------------
# The no-repair baseline is e3f4875, the commit this repair closes against;
# grading it with this tool must go red and name the uncovered modules.
mkdir -p "$WORK/before"
git -C "$ROOT" archive e3f4875 wizard-work/beam | tar -x -C "$WORK/before" 2>"$WORK/tar.err"
tar_rc=$?
cp "$COV" "$WORK/before/wizard-work/beam/check_coverage.py"
( cd "$WORK/before/wizard-work/beam" && python3 check_coverage.py >"$WORK/before.out" 2>&1 )
b=$?
names="$(grep -c 'UNCOVERED ' "$WORK/before.out")"
if [ "$tar_rc" -eq 0 ] && [ "$b" -eq 1 ] && [ "$names" -ge 6 ]; then
row before "PASS pre-repair lane rc=1, $names module(s) named: $(grep 'UNCOVERED ' "$WORK/before.out" | awk '{print $2}' | tr '\n' ' ')"
passed=$((passed + 1))
elif [ "$tar_rc" -ne 0 ]; then
row before "UNGRADABLE git archive rc=$tar_rc"
cat "$WORK/tar.err"
ungradable=$((ungradable + 1))
else
row before "FAULT HEAD lane rc=$b (want 1), $names module(s) named (want >= 6)"
tail -3 "$WORK/before.out"
failed=$((failed + 1))
fi
# --- leg 4: the M-JUL mutant dies ------------------------------------------
mkdir -p "$WORK/mut"
cp -a "$LANE/." "$WORK/mut/"
( cd "$WORK/mut" && python3 -m unittest test_zeller_dow >"$WORK/m1.out" 2>&1 )
m1=$?
sed -i 's/^ leap = _julian_leap(y) if julian else _gregorian_leap(y)$/ leap = _gregorian_leap(y)/' \
"$WORK/mut/zeller_dow.py"
mutated="$(grep -c '^ leap = _gregorian_leap(y)$' "$WORK/mut/zeller_dow.py")"
( cd "$WORK/mut" && python3 -m unittest test_zeller_dow >"$WORK/m2.out" 2>&1 )
m2=$?
if [ "$m1" -eq 0 ] && [ "$mutated" -eq 1 ] && [ "$m2" -eq 1 ] \
&& grep -q "test_julian_leap_branch_is_the_witness" "$WORK/m2.out"; then
row mutant "PASS clean 0, M-JUL 1 (julian-branch cell names itself)"
passed=$((passed + 1))
else
row mutant "FAULT clean rc=$m1 (want 0), mutated rc=$m2 (want 1), patched lines=$mutated"
tail -5 "$WORK/m2.out"
failed=$((failed + 1))
fi
# --- leg 5: the lane gate, with the leg inside it ---------------------------
bash "$LANE/CHECK" >"$WORK/gate.out" 2>&1
g=$?
if [ "$g" -eq 0 ]; then
row gate "PASS $(grep -E '^lane: [0-9]+ file' "$WORK/gate.out" | head -1)"
passed=$((passed + 1))
elif [ "$g" -eq 2 ]; then
row gate "UNGRADABLE rc=2"
tail -5 "$WORK/gate.out"
ungradable=$((ungradable + 1))
else
row gate "FAULT rc=$g"
tail -15 "$WORK/gate.out"
failed=$((failed + 1))
fi
echo
echo "q85: $passed leg(s) passed, $failed fault(s), $ungradable ungradable"
[ "$failed" -eq 0 ] || exit 1
[ "$ungradable" -eq 0 ] || exit 2
exit 0