#!/usr/bin/env bash # # lib.sh — shared helpers for E2E test suite. # # Test functions set a global $FAILURES counter and $FAILED list so the # caller can exit non-zero after all suites have run. # # Sourced by run.sh — do NOT execute directly. # FAILURES=0 PASSES=0 FAILED_TESTS="" assert_eq() { local desc="$1" expected="$2" actual="$3" if [[ "$expected" == "$actual" ]]; then printf ' \033[1;32mPASS\033[0m %s\n' "$desc" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s\n' "$desc" printf ' expected: %q\n' "$expected" printf ' actual: %q\n' "$actual" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } assert_contains() { local desc="$1" haystack="$2" needle="$3" if [[ "$haystack" == *"$needle"* ]]; then printf ' \033[1;32mPASS\033[0m %s\n' "$desc" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s\n' "$desc" printf ' haystack did not contain: %q\n' "$needle" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } assert_not_contains() { local desc="$1" haystack="$2" needle="$3" if [[ "$haystack" != *"$needle"* ]]; then printf ' \033[1;32mPASS\033[0m %s\n' "$desc" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s\n' "$desc" printf ' haystack unexpectedly contained: %q\n' "$needle" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } assert_match() { local desc="$1" haystack="$2" regex="$3" if [[ "$haystack" =~ $regex ]]; then printf ' \033[1;32mPASS\033[0m %s\n' "$desc" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s\n' "$desc" printf ' did not match regex: %s\n' "$regex" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } assert_file_exists() { local desc="$1" path="$2" if [[ -e "$path" ]]; then printf ' \033[1;32mPASS\033[0m %s\n' "$desc" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s\n' "$desc" printf ' file not found: %s\n' "$path" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } assert_gt() { local desc="$1" a="$2" b="$3" if (( a > b )); then printf ' \033[1;32mPASS\033[0m %s (%s > %s)\n' "$desc" "$a" "$b" ((++PASSES)) else printf ' \033[1;31mFAIL\033[0m %s (%s <= %s)\n' "$desc" "$a" "$b" ((++FAILURES)) FAILED_TESTS+="$desc; " fi } summary() { echo printf -- '---\n' printf 'passes: %d\n' "$PASSES" printf 'failures: %d\n' "$FAILURES" if [[ -n "$FAILED_TESTS" ]]; then printf 'failed: %s\n' "$FAILED_TESTS" fi if (( FAILURES > 0 )); then return 1 fi }