mirror of
https://github.com/obra/superpowers.git
synced 2026-07-07 02:09:04 +08:00
fix(skills): scope card falsification match to the Expected section
This commit is contained in:
@@ -34,6 +34,19 @@ warn() { echo "warn: $1"; }
|
|||||||
# design spec: markdown re-wrapping must not defeat the verbatim check.)
|
# design spec: markdown re-wrapping must not defeat the verbatim check.)
|
||||||
normalize() { tr -s '[:space:]' ' ' | sed -e 's/^ //' -e 's/ $//'; }
|
normalize() { tr -s '[:space:]' ' ' | sed -e 's/^ //' -e 's/ $//'; }
|
||||||
|
|
||||||
|
# Text of the card's Expected section only (case-insensitive heading match,
|
||||||
|
# any ##+ level; section ends at the next heading or EOF).
|
||||||
|
expected_section() {
|
||||||
|
awk '
|
||||||
|
/^#{2,}[[:space:]]/ {
|
||||||
|
low = tolower($0)
|
||||||
|
if (low ~ /^#+[[:space:]]*expected[[:space:]]*$/) { insec = 1; next }
|
||||||
|
if (insec) exit
|
||||||
|
}
|
||||||
|
insec { print }
|
||||||
|
' "$1"
|
||||||
|
}
|
||||||
|
|
||||||
# --- extract the first table under the (case-insensitive) heading ----------
|
# --- extract the first table under the (case-insensitive) heading ----------
|
||||||
TABLE="$(awk '
|
TABLE="$(awk '
|
||||||
/^#{1,6}[[:space:]]/ {
|
/^#{1,6}[[:space:]]/ {
|
||||||
@@ -104,10 +117,10 @@ while [ "$i" -lt "$ROWS" ]; do
|
|||||||
fail "missing card file: $f"
|
fail "missing card file: $f"
|
||||||
i=$((i + 1)); continue
|
i=$((i + 1)); continue
|
||||||
fi
|
fi
|
||||||
hay="$(normalize < "$f")"
|
hay="$(expected_section "$f" | normalize)"
|
||||||
case "$hay" in
|
case "$hay" in
|
||||||
*"$falsif"*) : ;;
|
*"$falsif"*) : ;;
|
||||||
*) fail "$f: falsification line not present verbatim.
|
*) fail "$f: falsification line not present verbatim in the ## Expected section.
|
||||||
expected (normalized): $falsif" ;;
|
expected (normalized): $falsif" ;;
|
||||||
esac
|
esac
|
||||||
grep -q '\*\*What this covers\*\*' "$f" || fail "$f: missing **What this covers**"
|
grep -q '\*\*What this covers\*\*' "$f" || fail "$f: missing **What this covers**"
|
||||||
|
|||||||
@@ -119,6 +119,29 @@ assert_exit 1 "reworded falsification -> exit 1" \
|
|||||||
"$CHECKER" "$TEST_ROOT/t3/spec.md" "$TEST_ROOT/t3/cards"
|
"$CHECKER" "$TEST_ROOT/t3/spec.md" "$TEST_ROOT/t3/cards"
|
||||||
assert_out_contains "widget-status-flags" "failure names the card"
|
assert_out_contains "widget-status-flags" "failure names the card"
|
||||||
|
|
||||||
|
echo "verbatim line outside Expected does not count"
|
||||||
|
make_spec "$TEST_ROOT/t3b"; make_cards "$TEST_ROOT/t3b/cards"
|
||||||
|
cat > "$TEST_ROOT/t3b/cards/widget-show-table.md" <<'EOF'
|
||||||
|
# widget-show-table: table renders with TOTAL
|
||||||
|
|
||||||
|
**What this covers**: If stdout's last line is not `TOTAL` followed by the two-decimal sum (20.85 for the seed fixture), or the TOTAL row is absent entirely, the scenario FAILS.
|
||||||
|
|
||||||
|
## Pre-state
|
||||||
|
A built widget binary.
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
1. Run `widget show`.
|
||||||
|
|
||||||
|
## Expected
|
||||||
|
The widget prints a friendly banner and exits zero.
|
||||||
|
|
||||||
|
## Cleanup
|
||||||
|
Nothing to clean.
|
||||||
|
EOF
|
||||||
|
assert_exit 1 "line only outside Expected -> exit 1" \
|
||||||
|
"$CHECKER" "$TEST_ROOT/t3b/spec.md" "$TEST_ROOT/t3b/cards"
|
||||||
|
assert_out_contains "widget-show-table" "failure names the card"
|
||||||
|
|
||||||
echo "missing card file"
|
echo "missing card file"
|
||||||
make_spec "$TEST_ROOT/t4"; make_cards "$TEST_ROOT/t4/cards"
|
make_spec "$TEST_ROOT/t4"; make_cards "$TEST_ROOT/t4/cards"
|
||||||
rm "$TEST_ROOT/t4/cards/widget-show-table.md"
|
rm "$TEST_ROOT/t4/cards/widget-show-table.md"
|
||||||
|
|||||||
Reference in New Issue
Block a user