#!/usr/bin/env bash
# Control for prohibition-as-query: the compiler records, the checker decides.
set -uo pipefail
ELC="${1:?usage: prohibition_query.sh <elc>}"
LANG_DIR="${2:-$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)}"
W=$(mktemp -d); trap 'rm -rf "$W"' EXIT; F=0
chk(){ [ "$2" = "$3" ] && printf '  ok    %s\n' "$1" || { printf '  FAIL  %s\n    expected %s got %s\n' "$1" "$2" "$3"; F=$((F+1)); }; }

cat > "$W/p.el" <<'EOF'
@decorator("prohibits_outside", "raw_sql")
fn repository() {}

fn sneaky() -> Int { raw_sql("DROP") return 1 }

@repository
fn allowed() -> Int { raw_sql("SELECT") return 2 }

fn main() { println("ok") }
EOF
EL_RELATIONS_OUT="$W/rel.txt" "$ELC" "$W/p.el" >/dev/null 2>&1
"$LANG_DIR/tools/check/prohibitions.sh" "$W/rel.txt" > "$W/out.txt" 2>&1; rc=$?
chk "a violation outside the boundary is caught" "1" "$rc"
chk "the offending fn is named" "1" "$(grep -c 'sneaky is not one' "$W/out.txt")"
chk "a call inside the boundary is NOT flagged" "0" "$(grep -c 'allowed is not one' "$W/out.txt")"

cat > "$W/q.el" <<'EOF'
@decorator("prohibits_outside", "raw_sql")
fn repository() {}

@repository
fn only_allowed() -> Int { raw_sql("SELECT") return 1 }

fn main() { println("ok") }
EOF
EL_RELATIONS_OUT="$W/rel2.txt" "$ELC" "$W/q.el" >/dev/null 2>&1
"$LANG_DIR/tools/check/prohibitions.sh" "$W/rel2.txt" >/dev/null 2>&1
chk "a clean program exits 0" "0" "$?"
echo; echo "  4 assertions, $((4-F)) passed, $F failed"; exit $F
