Files
interactive-env/tests/run_tests.sh
2026-03-10 00:14:14 -05:00

76 lines
1.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# Discovers and runs all test_*.sh files, printing a combined summary.
#
# Usage:
# ./tests/run_tests.sh # run all suites
# ./tests/run_tests.sh [file] # run a specific suite
set -uo pipefail
TESTS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# ---- Colors (self-contained) ----
_R='\033[0;31m'; _G='\033[0;32m'; _B='\033[1m'; _D='\033[2m'; _N='\033[0m'
total_pass=0
total_fail=0
failed_suites=()
run_suite() {
local file="$1"
local name
name="$(basename "$file")"
printf "\n${_B}══════ %s ══════${_N}\n" "$name"
local output exit_code=0
output=$(bash "$file" 2>&1) || exit_code=$?
echo "$output"
# Count results — strip ANSI codes first so the unicode chars are findable
local stripped p f
stripped=$(printf '%s' "$output" | sed 's/\x1b\[[0-9;]*[mGKHF]//g')
p=$(printf '%s\n' "$stripped" | grep -c '✓' || true)
f=$(printf '%s\n' "$stripped" | grep -c '✗' || true)
total_pass=$((total_pass + p))
total_fail=$((total_fail + f))
if [[ $exit_code -ne 0 ]]; then
failed_suites+=("$name")
fi
}
# Collect files to run
if [[ $# -gt 0 ]]; then
files=("$@")
else
files=("$TESTS_DIR"/test_*.sh)
fi
for f in "${files[@]}"; do
[[ -f "$f" ]] || { printf "${_R}Not found: %s${_N}\n" "$f" >&2; continue; }
run_suite "$f"
done
# ---- Aggregate summary ----
total=$((total_pass + total_fail))
printf "\n${_B}══════ Summary ══════${_N}\n"
printf "Suites run: %d\n" "${#files[@]}"
printf "Tests: %d total, " "$total"
if [[ $total_fail -eq 0 ]]; then
printf "${_G}%d passed${_N}\n" "$total_pass"
printf "\n${_G}All tests passed.${_N}\n"
exit 0
else
printf "${_G}%d passed${_N}, ${_R}%d failed${_N}\n" "$total_pass" "$total_fail"
printf "\n${_R}Failed suites:${_N}\n"
for s in "${failed_suites[@]}"; do
printf " - %s\n" "$s"
done
exit 1
fi