#!/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