#!/bin/bash # simplify-ignore-test.sh — Tests for the simplify-ignore hook # # Exercises filter_file by extracting function definitions from the hook. # Run: bash hooks/simplify-ignore-test.sh set -euo pipefail PASS=0 FAIL=0 TMPDIR=$(mktemp -d) trap 'rm -rf "$TMPDIR"' EXIT export CACHE="$TMPDIR/cache" mkdir -p "$CACHE" # Extract function definitions we need hash_cmd() { if command -v shasum >/dev/null 2>&1; then shasum elif command -v sha1sum >/dev/null 2>&1; then sha1sum else printf '%s\n' "error: missing shasum or sha1sum" >&2; exit 1; fi } file_id() { printf '%s' "$1" | hash_cmd | cut -c1-16; } block_hash() { printf '%s' "$1" | hash_cmd | cut -c1-8; } escape_glob() { local s="$1" s="${s//\\/\\\\}" s="${s//\*/\\*}" s="${s//\?/\\?}" s="${s//\[/\\[}" printf '%s' "$s" } # Extract filter_file from the hook script (line 59 "filter_file()" to line 142 closing brace) eval "$(sed -n '/^filter_file()/,/^}/p' hooks/simplify-ignore.sh)" assert_eq() { local label="$1" expected="$2" actual="$3" if [ "$expected" = "$actual" ]; then PASS=$((PASS + 1)) printf ' PASS: %s\n' "$label" else FAIL=$((FAIL + 1)) printf ' FAIL: %s\n' "$label" >&2 printf ' expected: %s\n' "$(printf '%s' "$expected" | cat -v)" >&2 printf ' actual: %s\n' "$(printf '%s' "$actual" | cat -v)" >&2 fi } # ── Test 1: Single-line block produces exactly one placeholder ──────────── printf 'Test 1: Single-line block (start+end on same line)\n' rm -f "$CACHE"/* SRC="$TMPDIR/single-line.js" DEST="$TMPDIR/single-line-filtered.js" cat > "$SRC" <<'EOF' const a = 1; /* simplify-ignore-start */ const secret = 42; /* simplify-ignore-end */ const b = 2; EOF FID="test_single" filter_file "$SRC" "$DEST" "$FID" placeholder_count=$(grep -c 'BLOCK_' "$DEST") assert_eq "exactly one placeholder line" "1" "$placeholder_count" assert_eq "line before block preserved" "1" "$(grep -c 'const a = 1' "$DEST")" assert_eq "line after block preserved" "1" "$(grep -c 'const b = 2' "$DEST")" block_files=$(ls "$CACHE/${FID}".block.* 2>/dev/null | wc -l | tr -d ' ') assert_eq "one block file in cache" "1" "$block_files" block_content=$(cat "$CACHE/${FID}".block.*) assert_eq "block content matches" \ "/* simplify-ignore-start */ const secret = 42; /* simplify-ignore-end */" \ "$block_content" # ── Test 2: Multi-line block ───────────────────────────────────────────── printf '\nTest 2: Multi-line block\n' rm -f "$CACHE"/* SRC="$TMPDIR/multi-line.js" DEST="$TMPDIR/multi-line-filtered.js" cat > "$SRC" <<'EOF' const a = 1; // simplify-ignore-start const secret1 = 42; const secret2 = 99; // simplify-ignore-end const b = 2; EOF FID="test_multi" filter_file "$SRC" "$DEST" "$FID" placeholder_count=$(grep -c 'BLOCK_' "$DEST") assert_eq "exactly one placeholder for multi-line block" "1" "$placeholder_count" output_lines=$(wc -l < "$DEST" | tr -d ' ') assert_eq "output has 3 lines (before + placeholder + after)" "3" "$output_lines" # ── Test 3: Multiple blocks in one file ────────────────────────────────── printf '\nTest 3: Multiple blocks in one file\n' rm -f "$CACHE"/* SRC="$TMPDIR/multi-block.js" DEST="$TMPDIR/multi-block-filtered.js" cat > "$SRC" <<'EOF' line1 // simplify-ignore-start blockA // simplify-ignore-end line2 // simplify-ignore-start blockB // simplify-ignore-end line3 EOF FID="test_multiblock" filter_file "$SRC" "$DEST" "$FID" placeholder_count=$(grep -c 'BLOCK_' "$DEST") assert_eq "two placeholders for two blocks" "2" "$placeholder_count" block_files=$(ls "$CACHE/${FID}".block.* 2>/dev/null | wc -l | tr -d ' ') assert_eq "two block files in cache" "2" "$block_files" # ── Test 4: Reason string preserved ────────────────────────────────────── printf '\nTest 4: Reason string in placeholder\n' rm -f "$CACHE"/* SRC="$TMPDIR/reason.js" DEST="$TMPDIR/reason-filtered.js" cat > "$SRC" <<'EOF' // simplify-ignore-start: perf-critical hot_loop(); // simplify-ignore-end EOF FID="test_reason" filter_file "$SRC" "$DEST" "$FID" assert_eq "placeholder includes reason" "1" "$(grep -c 'perf-critical' "$DEST")" reason_files=$(ls "$CACHE/${FID}".reason.* 2>/dev/null | wc -l | tr -d ' ') assert_eq "reason file saved" "1" "$reason_files" assert_eq "reason content" "perf-critical" "$(cat "$CACHE/${FID}".reason.*)" # ── Test 5: Trailing newline preservation ──────────────────────────────── printf '\nTest 5: Trailing newline preservation\n' rm -f "$CACHE"/* SRC="$TMPDIR/no-trailing-nl.js" DEST="$TMPDIR/no-trailing-nl-filtered.js" printf 'line1\n// simplify-ignore-start\nsecret\n// simplify-ignore-end' > "$SRC" FID="test_trail" filter_file "$SRC" "$DEST" "$FID" # Source has no trailing newline; dest should also have no trailing newline src_has_nl=$(tail -c 1 "$SRC" | wc -l | tr -d ' ') dest_has_nl=$(tail -c 1 "$DEST" | wc -l | tr -d ' ') assert_eq "dest preserves no-trailing-newline from source" "$src_has_nl" "$dest_has_nl" # ── Test 6: No blocks → return 1 ──────────────────────────────────────── printf '\nTest 6: No blocks returns 1\n' rm -f "$CACHE"/* SRC="$TMPDIR/no-blocks.js" DEST="$TMPDIR/no-blocks-filtered.js" cat > "$SRC" <<'EOF' const a = 1; const b = 2; EOF FID="test_noblocks" rc=0 filter_file "$SRC" "$DEST" "$FID" || rc=$? assert_eq "returns 1 when no blocks found" "1" "$rc" # ── Test 7: Unclosed block emits warning and flushes ───────────────────── printf '\nTest 7: Unclosed block\n' rm -f "$CACHE"/* SRC="$TMPDIR/unclosed.js" DEST="$TMPDIR/unclosed-filtered.js" cat > "$SRC" <<'EOF' line1 // simplify-ignore-start orphan code EOF FID="test_unclosed" stderr_out=$(filter_file "$SRC" "$DEST" "$FID" 2>&1) || true assert_eq "warning emitted for unclosed block" "1" "$(printf '%s' "$stderr_out" | grep -c 'unclosed')" assert_eq "orphan code flushed to output" "1" "$(grep -c 'orphan code' "$DEST")" # ── Test 8: Single-line block with reason ──────────────────────────────── printf '\nTest 8: Single-line block with reason\n' rm -f "$CACHE"/* SRC="$TMPDIR/single-reason.js" DEST="$TMPDIR/single-reason-filtered.js" cat > "$SRC" <<'EOF' before /* simplify-ignore-start: hot-path */ x = compute(); /* simplify-ignore-end */ after EOF FID="test_single_reason" filter_file "$SRC" "$DEST" "$FID" placeholder_count=$(grep -c 'BLOCK_' "$DEST") assert_eq "exactly one placeholder for single-line+reason" "1" "$placeholder_count" assert_eq "reason in placeholder" "1" "$(grep -c 'hot-path' "$DEST")" # ── Test 9: HTML comment syntax ────────────────────────────────────────── printf '\nTest 9: HTML comment syntax\n' rm -f "$CACHE"/* SRC="$TMPDIR/html.html" DEST="$TMPDIR/html-filtered.html" cat > "$SRC" <<'EOF'