#!/bin/bash

set -euo pipefail

ROOT=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)
TEST_DIR="$ROOT/test/shell.d"

shopt -s nullglob
tests=()
for test in "$TEST_DIR"/*-test.sh; do
  [[ $(basename "$test") == "base-test.sh" ]] && continue
  tests+=("$test")
done
shopt -u nullglob

if (( ${#tests[@]} == 0 )); then
  echo "No shell tests found in $TEST_DIR" >&2
  exit 1
fi

# Keep going after a failing file. A test file exits at its first failed
# assertion, so aborting the run there too would hide every file after it --
# one packaging failure was masking 114 of 134 files.
output=$(mktemp)
trap 'rm -f "$output"' EXIT
failed=()
skipped=()
for test in "${tests[@]}"; do
  printf '==> %s\n' "${test#$ROOT/}"
  bash "$test" | tee "$output" || failed+=("${test#$ROOT/}")
  if grep -q '^ok - .* # SKIP$' "$output"; then
    skipped+=("${test#$ROOT/}")
  fi
done

if (( ${#skipped[@]} > 0 )); then
  printf '\nSkipped checks in %d of %d test files:\n' "${#skipped[@]}" "${#tests[@]}"
  printf '  %s\n' "${skipped[@]}"
fi

if (( ${#failed[@]} > 0 )); then
  printf '\n%d of %d test files failed:\n' "${#failed[@]}" "${#tests[@]}" >&2
  printf '  %s\n' "${failed[@]}" >&2
  exit 1
fi

if (( ${#skipped[@]} == 0 )); then
  printf '\nAll %d test files passed.\n' "${#tests[@]}"
else
  printf '\n%d test files completed without failures; %d had skipped checks.\n' "${#tests[@]}" "${#skipped[@]}"
fi
