#!/usr/bin/env bash
# ============================================================================
# v1.7.1 AC6(承 v1.7.0 发布评审 §二 三空窗)—— 检查20 扩二形之判据侧腿。
#
# 承裁定 70 第五要件: 【阳性对照须接入出口码】—— 任一对照不符预期 ⇒ 显式 exit 1。
# 承在册【恒真之谓词不承证力】∧【零命中可有多重独立因 ⇒ 唯一之证 = 阳性对照 + 已知落点双面】。
#
# 对照五组:
#   ① 形①(条件守卫之跳过)置一处 ∧ 无 skip_gap ⇒ **必报**
#   ② 形②(note-only 之跳过)置一处 ∧ 无 skip_gap ⇒ **必报**
#   ③ 形③(裸 return 0,承旧形)置一处 ∧ 无 skip_gap ⇒ **必报**
#   ④ 合规(三形各伴 skip_gap)⇒ **不报**
#   ⑤ 具名豁免(内容锚命中 SKIP20_EXEMPT)⇒ **不报**
#   ★ 域(裁 02 裁二 取甲): 第 ① 组之夹具**另置于第二档**(release_gates_v1210.sh 之位)
#     ⇒ 证【域已扩至该档】(原唯本档 ⇒ 该处之 skip 出口不被覆盖)。
#
# 用法: bash scripts/tests/skip_path_registry_selftest.sh
# 退出码: 0 = 五组皆符 / 1 = 有对照未符(谓词不承证力)
# ============================================================================
set -uo pipefail

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
SRC="$REPO_ROOT/scripts/verify_release.sh"
TMP="$(mktemp -d "${TMPDIR:-/tmp}/skip20.XXXXXX")"
trap 'rm -rf "$TMP"' EXIT

PASS=0
_note() { :; }
_fail() { :; }

# ── 提取被测函数(内容锚 = 函数名 · 免行号漂)──────────────────────────
FUNC="$(sed -n '/^selfaudit_skip_paths() {/,/^}$/p' "$SRC")"
if [[ -z "$FUNC" ]]; then
    echo "[skip20-selftest] FAIL: 自 $SRC 提取 selfaudit_skip_paths() 失败(内容锚未命中)" >&2
    exit 1
fi

# ── 夹具之【声明面】(与 verify_release.sh 同源 · 逐字取之以免二源漂)───────
NULLABLE="$(sed -n 's/^SKIP20_NULLABLE_SOURCES=(\(.*\))$/\1/p' "$SRC")"
EXEMPT_RAW="$(awk '/^SKIP20_EXEMPT=\(/{f=1;next} f&&/^\)/{f=0} f{print}' "$SRC")"
if [[ -z "$NULLABLE" || -z "$EXEMPT_RAW" ]]; then
    echo "[skip20-selftest] FAIL: 自 $SRC 提取 SKIP20_NULLABLE_SOURCES / SKIP20_EXEMPT 失败" >&2
    exit 1
fi

HARNESS="$TMP/harness.sh"
cat > "$HARNESS" <<'HEOF'
fail() { echo "FAIL: $*"; }
note() { echo "NOTE: $*"; }
HEOF
printf 'SKIP20_NULLABLE_SOURCES=(%s)\n' "$NULLABLE" >> "$HARNESS"
{
    echo 'SKIP20_EXEMPT=('
    printf '%s\n' "$EXEMPT_RAW"
    echo ')'
} >> "$HARNESS"
printf '%s\n' "$FUNC" >> "$HARNESS"
echo 'selfaudit_skip_paths' >> "$HARNESS"

run_on() {  # $1...=夹具档 ⇒ 输出
    XW_SKIP20_FILES="$*" bash "$HARNESS"
}

check() {  # $1=名 $2=期望(报|不报) $3...=夹具
    local name="$1" want="$2"; shift 2
    local out; out="$(run_on "$@")"
    local got="不报"
    [[ "$out" == *"FAIL: 检查20"* ]] && got="报"
    if [[ "$got" == "$want" ]]; then
        echo "[skip20-selftest] 对照 $name ✓($got)"
    else
        echo "[skip20-selftest] FAIL: 对照 $name 期望【$want】实得【$got】——输出: $(printf '%s' "$out" | head -c 200)" >&2
        PASS=1
    fi
}

# ── 夹具①: 形①(条件守卫 · 可空源)无 skip_gap ─────────────────────────
F1="$TMP/f1.sh"
cat > "$F1" <<'EOF'
check_demo_one() {
    if [[ -n "$roadmap_ver" && "$(normalize_ver "$cargo_ver")" != "$(normalize_ver "$roadmap_ver")" ]]; then
        fail "检查2: 不一致"
    fi
}
EOF
check "①形①(守卫 · 无登记)" 报 "$F1"

# ── 夹具②: 形②(note-only 跳过)无 skip_gap ───────────────────────────
F2="$TMP/f2.sh"
cat > "$F2" <<'EOF'
check_demo_two() {
    if [[ -z "$in_progress_all" ]]; then
        note "检查5: ROADMAP 无 🚧 进行中条目(跳过)"
    fi
}
EOF
check "②形②(note-only · 无登记)" 报 "$F2"

# ── 夹具③: 形③(裸 return 0 + 前 5 行标记词)无 skip_gap ───────────────
F3="$TMP/f3.sh"
cat > "$F3" <<'EOF'
check_demo_three() {
    # 未判定之路径
    note "检查9: 未判定"
    return 0
}
EOF
check "③形③(裸 return 0 · 无登记)" 报 "$F3"

# ── 夹具④: 合规(三形各伴 skip_gap)⇒ 不报 ─────────────────────────────
F4="$TMP/f4.sh"
cat > "$F4" <<'EOF'
check_demo_four() {
    [[ -n "$roadmap_ver" ]] || skip_gap "检查2: ROADMAP 当前实施版本缺席 ⇒ 该项未判定"
    if [[ -n "$roadmap_ver" && "$(normalize_ver "$cargo_ver")" != "$(normalize_ver "$roadmap_ver")" ]]; then
        fail "检查2: 不一致"
    fi
    if [[ -z "$in_progress_all" ]]; then
        note "检查5: ROADMAP 无 🚧 进行中条目(跳过)"
        skip_gap "检查5: ROADMAP 无 🚧 进行中条目 ⇒ 本检查未判定"
    fi
    note "检查9: 未判定"
    skip_gap "检查9: 未判定"
    return 0
}
EOF
check "④合规(三形皆登记)" 不报 "$F4"

# ── 夹具⑤: 具名豁免(内容锚命中)⇒ 不报 ────────────────────────────────
F5="$TMP/f5.sh"
cat > "$F5" <<'EOF'
check_demo_five() {
    if [[ -z "$claimed" ]]; then
        note "检查1: ROADMAP.md 无 '已发布' 宣称(跳过)"
    fi
}
EOF
check "⑤具名豁免(空真)" 不报 "$F5"

# ── 域之实证(裁 02 裁二 取甲): 形② 置于【第二档】之位 ⇒ 仍必报 ─────────
F6="$TMP/release_gates_v1210_fixture.sh"
cat > "$F6" <<'EOF'
check_demo_six() {
    if [[ -z "$in_progress_all" ]]; then
        note "检查26: ROADMAP 无 🚧 进行中条目(跳过)"
    fi
}
EOF
check "⑥域扩(第二档之 skip 出口)" 报 "$F1" "$F6"

echo
if [[ "$PASS" -eq 0 ]]; then
    echo "[skip20-selftest] 检查20 阳性对照六组全符 ✓(谓词承证力 ∧ 域已扩至第二档)"
    exit 0
else
    echo "[skip20-selftest] 检查20 阳性对照【未全符】⇒ 谓词不承证力(rc=1)" >&2
    exit 1
fi