aboutsummaryrefslogtreecommitdiff
path: root/spec/cli/run_all_tests.sh
blob: 8e5fb6d66f6c86d4c87a7ac15568c18a0793978a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#!/bin/bash
# Main test runner for YueScript CLI
# Runs all CLI test suites

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

echo -e "${BLUE}======================================"
echo "YueScript CLI Test Suite"
echo "======================================${NC}"
echo ""

# Check if yue binary exists
YUE_BIN="${YUE_BIN:-./bin/debug/yue}"
if [ ! -f "$YUE_BIN" ]; then
    echo -e "${RED}Error: yue binary not found at $YUE_BIN${NC}"
    echo "Please build the project first:"
    echo "  make debug"
    echo "Or set YUE_BIN environment variable"
    exit 1
fi

# Track overall results
TOTAL_SUITES=0
PASSED_SUITES=0
FAILED_SUITES=0

# Track test case statistics
TOTAL_TESTS=0
TOTAL_PASSED=0
TOTAL_FAILED=0

# Array to store suite results
declare -a SUITE_NAMES
declare -a SUITE_PASSED
declare -a SUITE_FAILED
declare -a SUITE_STATUS

# Function to run a test suite
run_test_suite() {
    local suite_name="$1"
    local suite_file="$2"

    TOTAL_SUITES=$((TOTAL_SUITES + 1))
    echo ""
    echo -e "${BLUE}Running: $suite_name${NC}"
    echo "======================================"

    # Run the test suite and capture output
    local output
    output=$(bash "$suite_file" 2>&1)
    local exit_code=$?

    # Echo the output
    echo "$output"

    # Parse test statistics from output using awk
    # Look for lines like "Total tests: 7", "Passed: 7", "Failed: 0"
    # Remove ANSI color codes before parsing
    local clean_output=$(echo "$output" | sed 's/\x1b\[[0-9;]*m//g')
    local suite_total=$(echo "$clean_output" | grep -E "Total tests:" | tail -1 | awk '{print $NF}')
    local suite_passed=$(echo "$clean_output" | grep -E "Passed:" | tail -1 | awk '{print $NF}')
    local suite_failed=$(echo "$clean_output" | grep -E "Failed:" | tail -1 | awk '{print $NF}')

    # Default to 0 if not found
    suite_total=${suite_total:-0}
    suite_passed=${suite_passed:-0}
    suite_failed=${suite_failed:-0}

    # Validate that they are numbers
    [[ ! "$suite_total" =~ ^[0-9]+$ ]] && suite_total=0
    [[ ! "$suite_passed" =~ ^[0-9]+$ ]] && suite_passed=0
    [[ ! "$suite_failed" =~ ^[0-9]+$ ]] && suite_failed=0

    # Store results
    SUITE_NAMES+=("$suite_name")
    SUITE_PASSED+=($suite_passed)
    SUITE_FAILED+=($suite_failed)

    # Update totals
    TOTAL_TESTS=$((TOTAL_TESTS + suite_total))
    TOTAL_PASSED=$((TOTAL_PASSED + suite_passed))
    TOTAL_FAILED=$((TOTAL_FAILED + suite_failed))

    if [ $exit_code -eq 0 ]; then
        echo -e "${GREEN}✓ $suite_name PASSED${NC}"
        PASSED_SUITES=$((PASSED_SUITES + 1))
        SUITE_STATUS+=("PASS")
        return 0
    else
        echo -e "${RED}✗ $suite_name FAILED${NC}"
        FAILED_SUITES=$((FAILED_SUITES + 1))
        SUITE_STATUS+=("FAIL")
        return 1
    fi
}

# Run all test suites
run_test_suite "Basic Options Test" "$SCRIPT_DIR/test_basic_options.sh"
run_test_suite "Compilation Test" "$SCRIPT_DIR/test_compilation.sh"
run_test_suite "Error Handling Test" "$SCRIPT_DIR/test_error_handling.sh"
run_test_suite "Execution Test" "$SCRIPT_DIR/test_execution.sh"

# Print detailed summary
echo ""
echo -e "${BLUE}═══════════════════════════════════════════════════════════"
echo "           YueScript CLI Test Results Summary"
echo "═══════════════════════════════════════════════════════════${NC}"
echo ""

# Print per-suite statistics
echo -e "${CYAN}Test Suite Details:${NC}"
echo "┌──────────────────────────────┬───────┬────────┬────────┬─────────┐"
echo "│ Test Suite                   │ Total │ Passed │ Failed │ Status  │"
echo "├──────────────────────────────┼───────┼────────┼────────┼─────────┤"

for ((i=0; i<TOTAL_SUITES; i++)); do
    name="${SUITE_NAMES[$i]}"
    passed="${SUITE_PASSED[$i]}"
    failed="${SUITE_FAILED[$i]}"
    total=$((passed + failed))
    status="${SUITE_STATUS[$i]}"

    # Format suite name (truncate if too long)
    name_display=$(printf "%.28s" "$name")
    printf "│ %-28s │ %5d │ %6d │ %6d │ " "$name_display" $total $passed $failed

    if [ "$status" = "PASS" ]; then
        echo -e "${GREEN}PASS  ${NC}│"
    else
        echo -e "${RED}FAIL  ${NC}│"
    fi
done

echo "└──────────────────────────────┴───────┴────────┴────────┴─────────┘"
echo ""

# Print overall statistics
echo -e "${CYAN}Overall Statistics:${NC}"
echo "┌────────────────────────────────────────────────────────────┐"
printf "│  Total Test Suites:   %3d                                     │\n" $TOTAL_SUITES
printf "│  Passed Test Suites:  %3d                                     │\n" $PASSED_SUITES
printf "│  Failed Test Suites:  %3d                                     │\n" $FAILED_SUITES
echo "├────────────────────────────────────────────────────────────┤"
printf "│  Total Test Cases:    %3d                                     │\n" $TOTAL_TESTS
printf "│  Passed Test Cases:   %3d                                     │\n" $TOTAL_PASSED
printf "│  Failed Test Cases:   %3d                                     │\n" $TOTAL_FAILED
echo "└────────────────────────────────────────────────────────────┘"

# Calculate pass rate
if [ $TOTAL_TESTS -gt 0 ]; then
    pass_rate=$((TOTAL_PASSED * 100 / TOTAL_TESTS))
    printf "  Overall Pass Rate: "
    if [ $pass_rate -eq 100 ]; then
        echo -e "${GREEN}${pass_rate}%%${NC}"
    elif [ $pass_rate -ge 80 ]; then
        echo -e "${YELLOW}${pass_rate}%%${NC}"
    else
        echo -e "${RED}${pass_rate}%%${NC}"
    fi
fi
echo ""

# Final verdict
echo -e "${BLUE}═══════════════════════════════════════════════════════════"
echo "                    Final Verdict"
echo "═══════════════════════════════════════════════════════════${NC}"

if [ $FAILED_SUITES -eq 0 ]; then
    echo -e "${GREEN}  ✓ All test suites passed!${NC}"
    echo -e "${GREEN}  ✓ All $TOTAL_TESTS test cases passed!${NC}"
    exit 0
else
    echo -e "${RED}  ✗ $FAILED_SUITES test suite(s) failed${NC}"
    echo -e "${RED}  ✗ $TOTAL_FAILED test case(s) failed${NC}"
    exit 1
fi