tenseleyflow/bensch / d97abf7

Browse files

extract builtin test runner

Source: fortsh/tests/builtins/run_builtin_tests.sh
Authored by espadonne
SHA
d97abf776141641644beba6089a3f2878405541d
Parents
009ce4c
Tree
8a4e39e

1 changed file

StatusFile+-
A suites/builtins/run_builtin_tests.sh 135 0
suites/builtins/run_builtin_tests.shadded
@@ -0,0 +1,135 @@
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