about summary refs log tree commit diff stats
path: root/js/scripting-lang/baba-yaga-c/test_stdlib.sh
blob: 6c136744c9ac99badc9ff9e99446e0c86c70eb2e (plain) (blame)
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
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
#!/bin/bash

# Comprehensive Standard Library Test Suite for Baba Yaga C Implementation

echo "=== Baba Yaga Standard Library Test Suite ==="
echo ""

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

# Function to run a test
run_test() {
    local expression=$1
    local expected=$2
    local test_name=$3
    
    echo -n "Testing $test_name... "
    
    local output
    local exit_code
    output=$(./bin/baba-yaga "$expression;" 2>&1)
    exit_code=$?
    
    if [ $exit_code -eq 0 ] && [ "$(echo -n "$output")" = "$expected" ]; then
        echo -e "${GREEN}PASS${NC} (got: $output)"
        return 0
    else
        echo -e "${RED}FAIL${NC}"
        echo -e "${RED}Expected:${NC} $expected"
        echo -e "${RED}Got:${NC} $output"
        return 1
    fi
}

# Function to run an error test
run_error_test() {
    local expression=$1
    local test_name=$2
    
    echo -n "Testing $test_name (should fail)... "
    
    local output
    local exit_code
    output=$(./bin/baba-yaga "$expression;" 2>&1)
    exit_code=$?
    
    if [ $exit_code -eq 0 ] && echo "$output" | grep -q "Error:"; then
        echo -e "${GREEN}PASS${NC} (correctly failed with error message)"
        return 0
    else
        echo -e "${RED}FAIL${NC}"
        echo -e "${RED}Expected:${NC} Error message"
        echo -e "${RED}Got:${NC} $output"
        return 1
    fi
}

# Counters
total_tests=0
passed_tests=0
failed_tests=0

echo "Running Arithmetic Function Tests..."
echo "==================================="

# Basic arithmetic tests
arithmetic_tests=(
    "add 5 3|8|Add Function"
    "subtract 10 3|7|Subtract Function"
    "multiply 6 7|42|Multiply Function"
    "divide 15 3|5|Divide Function"
    "modulo 10 3|1|Modulo Function"
    "pow 2 3|8|Power Function"
    "negate 5|-5|Negate Function"
    "add 0 0|0|Add Zero"
    "multiply 0 5|0|Multiply by Zero"
    "divide 0 5|0|Divide Zero by Number"
    "pow 5 0|1|Power to Zero"
    "pow 1 100|1|Power of One"
)

for test in "${arithmetic_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Arithmetic Error Tests..."
echo "================================="

# Arithmetic error tests
arithmetic_error_tests=(
    "divide 10 0:Division by Zero"
    "modulo 10 0:Modulo by Zero"
    "add 5:Too Few Arguments for Add"
    "add 1 2 3:Too Many Arguments for Add"
    "divide 5:Too Few Arguments for Divide"
    "divide 1 2 3:Too Many Arguments for Divide"
)

for test in "${arithmetic_error_tests[@]}"; do
    IFS=':' read -r expression name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_error_test "$expression" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Comparison Function Tests..."
echo "==================================="

# Comparison tests
comparison_tests=(
    "equals 5 5|true|Equality True"
    "equals 5 6|false|Equality False"
    "not_equals 5 6|true|Inequality True"
    "not_equals 5 5|false|Inequality False"
    "less 3 5|true|Less Than True"
    "less 5 3|false|Less Than False"
    "less 5 5|false|Less Than Equal"
    "less_equal 5 5|true|Less Equal True"
    "less_equal 3 5|true|Less Equal True"
    "less_equal 5 3|false|Less Equal False"
    "greater 10 5|true|Greater Than True"
    "greater 5 10|false|Greater Than False"
    "greater 5 5|false|Greater Than Equal"
    "greater_equal 5 5|true|Greater Equal True"
    "greater_equal 10 5|true|Greater Equal True"
    "greater_equal 5 10|false|Greater Equal False"
)

for test in "${comparison_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Logical Function Tests..."
echo "================================="

# Logical tests
logical_tests=(
    "and true true|true|And True True"
    "and true false|false|And True False"
    "and false true|false|And False True"
    "and false false|false|And False False"
    "or true true|true|Or True True"
    "or true false|true|Or True False"
    "or false true|true|Or False True"
    "or false false|false|Or False False"
    "xor true true|false|Xor True True"
    "xor true false|true|Xor True False"
    "xor false true|true|Xor False True"
    "xor false false|false|Xor False False"
    "not true|false|Not True"
    "not false|true|Not False"
)

for test in "${logical_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Higher-Order Function Tests..."
echo "======================================"

# Higher-order function tests
higher_order_tests=(
    "apply add 5 3|8|Apply Add Function"
    "apply multiply 4 5|20|Apply Multiply Function"
    "compose add 5 multiply 2|15|Compose Add and Multiply"
)

for test in "${higher_order_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running IO Function Tests..."
echo "============================"

# IO function tests (basic functionality)
io_tests=(
    "..out 42|42|Output Function"
    "..out hello|hello|Output String"
    "..assert true|true|Assert True"
    "..assert false|false|Assert False"
)

for test in "${io_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Type Error Tests..."
echo "=========================="

# Type error tests
type_error_tests=(
    "add 5 true:Type Mismatch Add"
    "equals 5 hello:Type Mismatch Equals"
    "less true false:Type Mismatch Less"
    "and 5 3:Type Mismatch And"
    "not 42:Type Mismatch Not"
)

for test in "${type_error_tests[@]}"; do
    IFS=':' read -r expression name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_error_test "$expression" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "Running Edge Case Tests..."
echo "========================="

# Edge case tests
edge_case_tests=(
    "add 0.1 0.2|0.3|Floating Point Addition"
    "multiply 0.5 0.5|0.25|Floating Point Multiplication"
    "divide 1 3|0.3333333333333333|Floating Point Division"
    "pow 2 0.5|1.4142135623730951|Square Root"
    "pow 2 -1|0.5|Negative Power"
    "modulo 5.5 2|1.5|Floating Point Modulo"
)

for test in "${edge_case_tests[@]}"; do
    IFS='|' read -r expression expected name <<< "$test"
    total_tests=$((total_tests + 1))
    
    if run_test "$expression" "$expected" "$name"; then
        passed_tests=$((passed_tests + 1))
    else
        failed_tests=$((failed_tests + 1))
    fi
done

echo ""
echo "=== Test Summary ==="
echo "Total tests: $total_tests"
echo -e "Passed: ${GREEN}$passed_tests${NC}"
echo -e "Failed: ${RED}$failed_tests${NC}"

if [ $failed_tests -eq 0 ]; then
    echo -e "${GREEN}All standard library tests passed!${NC}"
    exit 0
else
    echo -e "${RED}Some standard library tests failed.${NC}"
    exit 1
fi