diff options
Diffstat (limited to 'js/scripting-lang/baba-yaga-c/test_stdlib.sh')
-rwxr-xr-x | js/scripting-lang/baba-yaga-c/test_stdlib.sh | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/js/scripting-lang/baba-yaga-c/test_stdlib.sh b/js/scripting-lang/baba-yaga-c/test_stdlib.sh new file mode 100755 index 0000000..6c13674 --- /dev/null +++ b/js/scripting-lang/baba-yaga-c/test_stdlib.sh @@ -0,0 +1,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 \ No newline at end of file |