#!/usr/bin/env bash # lib/assert.sh — assertions that record evidence per the spec. # # Each assertion appends one record to: # $PROOF_REPORT_DIR/raw/cases/.jsonl # # Each line is a self-describing JSON object — case ID, claim, expected, # actual, result {pass|fail|skip}, optional evidence pointers. Cases # call multiple assertions; run_proof.sh aggregates JSONL → summary. # # Functions: # proof_assert_eq # proof_assert_ne # proof_assert_contains # proof_assert_lt # passes if a < b # proof_assert_gt # passes if a > b # proof_assert_status # proof_assert_json_eq # proof_skip # # All return 0 (case scripts decide their own halt-on-fail policy). _proof_record() { local case_id="$1" claim="$2" result="$3" expected="$4" actual="$5" detail="$6" local out="${PROOF_REPORT_DIR}/raw/cases/${case_id}.jsonl" mkdir -p "$(dirname "$out")" # JSON-escape the variable inputs. local e_claim e_expected e_actual e_detail e_claim=$(printf '%s' "$claim" | jq -Rs .) e_expected=$(printf '%s' "$expected" | jq -Rs .) e_actual=$(printf '%s' "$actual" | jq -Rs .) e_detail=$(printf '%s' "$detail" | jq -Rs .) local ts ts=$(date -u -Iseconds) cat >> "$out" < b)}'; then _proof_record "$case_id" "$claim" pass "${a} > ${b}" "${a}" "" return 0 fi _proof_record "$case_id" "$claim" fail "${a} > ${b}" "${a}" "${a} is not greater than ${b}" return 0 } # proof_assert_status compares the status from a previously-recorded # probe against an expected value. Probe must have run via lib/http.sh. proof_assert_status() { local case_id="$1" claim="$2" expected="$3" probe_name="$4" local actual actual=$(proof_status_of "$case_id" "$probe_name" 2>/dev/null || echo missing) proof_assert_eq "$case_id" "$claim" "$expected" "$actual" } # proof_assert_json_eq: jq-based equality on response body or a file. # body_or_file: if starts with @, read from file; otherwise treat as # literal JSON string. proof_assert_json_eq() { local case_id="$1" claim="$2" jq_path="$3" expected="$4" source="$5" local actual if [[ "$source" == @* ]]; then actual=$(jq -r "$jq_path" "${source#@}" 2>/dev/null || echo "") else actual=$(printf '%s' "$source" | jq -r "$jq_path" 2>/dev/null || echo "") fi proof_assert_eq "$case_id" "$claim" "$expected" "$actual" } proof_skip() { local case_id="$1" claim="$2" reason="$3" _proof_record "$case_id" "$claim" skip "" "" "$reason" return 0 }