Bash · 4267 bytes Raw Blame History
1 #!/bin/sh
2 # =====================================
3 # Fortsh Builtin Test Runner
4 # =====================================
5 # Runs all individual builtin test suites and aggregates results.
6 # Can be called standalone or from the main run_all_tests.sh
7
8 # Portable timeout: macOS lacks GNU timeout
9 if command -v timeout >/dev/null 2>&1; then
10 run_with_timeout() { timeout "$@"; }
11 elif command -v gtimeout >/dev/null 2>&1; then
12 run_with_timeout() { gtimeout "$@"; }
13 else
14 # POSIX fallback using temp file for output capture compatibility
15 run_with_timeout() {
16 _rwt_secs="$1"; shift
17 _rwt_tmp=$(mktemp /tmp/fortsh_timeout.XXXXXX)
18 ( "$@" ) > "$_rwt_tmp" 2>&1 &
19 _rwt_pid=$!
20 ( sleep "$_rwt_secs"; kill "$_rwt_pid" 2>/dev/null ) &
21 _rwt_wd=$!
22 wait "$_rwt_pid" 2>/dev/null
23 _rwt_rc=$?
24 kill "$_rwt_wd" 2>/dev/null
25 wait "$_rwt_wd" 2>/dev/null
26 cat "$_rwt_tmp"
27 rm -f "$_rwt_tmp"
28 return $_rwt_rc
29 }
30 fi
31
32 RED='\033[0;31m'
33 GREEN='\033[0;32m'
34 YELLOW='\033[1;33m'
35 BLUE='\033[0;34m'
36 CYAN='\033[0;36m'
37 BOLD='\033[1m'
38 NC='\033[0m'
39
40 VERBOSE=0
41 for arg in "$@"; do
42 case "$arg" in
43 -v|--verbose) VERBOSE=1 ;;
44 esac
45 done
46
47 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
48 FORTSH_BIN="${FORTSH_BIN:-$SCRIPT_DIR/../../bin/fortsh}"
49 export FORTSH_BIN
50
51 if [ ! -x "$FORTSH_BIN" ]; then
52 printf "${RED}ERROR${NC}: fortsh binary not found at %s\n" "$FORTSH_BIN"
53 printf "Please run 'make' first or set FORTSH_BIN environment variable\n"
54 exit 1
55 fi
56
57 TOTAL_PASSED=0
58 TOTAL_FAILED=0
59 TOTAL_SKIPPED=0
60 SUITES_PASSED=0
61 SUITES_FAILED=0
62 FAILED_SUITES=""
63
64 for test_file in "$SCRIPT_DIR"/test_*.sh; do
65 [ ! -x "$test_file" ] && continue
66 suite_name=$(basename "$test_file")
67 # Skip the shared harness
68 [ "$suite_name" = "test_harness.sh" ] && continue
69 # test_exec.sh hangs — exec replaces the process and the harness loses the child
70 [ "$suite_name" = "test_exec.sh" ] && continue
71
72 if [ "$VERBOSE" -eq 1 ]; then
73 printf "\n${CYAN}── %s ──${NC}\n" "$suite_name"
74 output=$(run_with_timeout 120 "$test_file" 2>&1)
75 exit_code=$?
76 echo "$output"
77 else
78 output=$(run_with_timeout 120 "$test_file" 2>&1)
79 exit_code=$?
80 fi
81
82 # Strip ANSI codes for parsing
83 clean=$(echo "$output" | sed 's/\x1b\[[0-9;]*m//g')
84 passed=$(echo "$clean" | grep -i "^Passed:" | tail -1 | awk '{print $2}')
85 failed=$(echo "$clean" | grep -i "^Failed:" | tail -1 | awk '{print $2}')
86 skipped=$(echo "$clean" | grep -i "^Skipped:" | tail -1 | awk '{print $2}')
87
88 passed=${passed:-0}
89 failed=${failed:-0}
90 skipped=${skipped:-0}
91
92 TOTAL_PASSED=$((TOTAL_PASSED + passed))
93 TOTAL_FAILED=$((TOTAL_FAILED + failed))
94 TOTAL_SKIPPED=$((TOTAL_SKIPPED + skipped))
95
96 if [ "$exit_code" -eq 0 ]; then
97 printf "${GREEN}${NC} %-30s ${GREEN}%d passed${NC}" "$suite_name" "$passed"
98 [ "$skipped" -gt 0 ] && printf " ${YELLOW}%d skipped${NC}" "$skipped"
99 printf "\n"
100 SUITES_PASSED=$((SUITES_PASSED + 1))
101 else
102 printf "${RED}${NC} %-30s ${GREEN}%d passed${NC} ${RED}%d failed${NC}" "$suite_name" "$passed" "$failed"
103 [ "$skipped" -gt 0 ] && printf " ${YELLOW}%d skipped${NC}" "$skipped"
104 printf "\n"
105 SUITES_FAILED=$((SUITES_FAILED + 1))
106 FAILED_SUITES="${FAILED_SUITES} - ${suite_name}\n"
107 fi
108 done
109
110 printf "\n==========================================\n"
111 printf "BUILTIN TEST RESULTS\n"
112 printf "==========================================\n"
113 printf "Passed: %d\n" "$TOTAL_PASSED"
114 printf "Failed: %d\n" "$TOTAL_FAILED"
115 printf "Skipped: %d\n" "$TOTAL_SKIPPED"
116 printf "Total: %d\n" "$((TOTAL_PASSED + TOTAL_FAILED + TOTAL_SKIPPED))"
117 printf "==========================================\n"
118
119 if [ $((TOTAL_PASSED + TOTAL_FAILED)) -gt 0 ]; then
120 PASS_RATE=$((TOTAL_PASSED * 100 / (TOTAL_PASSED + TOTAL_FAILED)))
121 printf "Pass rate: %d%%\n" "$PASS_RATE"
122 fi
123
124 if [ "$SUITES_FAILED" -gt 0 ]; then
125 printf "\n${RED}Failed suites:${NC}\n"
126 printf "%b" "$FAILED_SUITES"
127 printf "==========================================\n"
128 fi
129
130 if [ "$TOTAL_FAILED" -eq 0 ]; then
131 printf "ALL BUILTIN TESTS PASSED!\n"
132 exit 0
133 else
134 exit 1
135 fi