cpp lab 518 improved test script
test-518.sh
172 lines 5.7 kB view raw
1#!/bin/bash 2 3# Colors for output 4RED='\033[0;31m' 5GREEN='\033[0;32m' 6YELLOW='\033[1;33m' 7BLUE='\033[0;34m' 8NC='\033[0m' # No Color 9 10# Test configuration 11temp_file="lab518.output" 12program="./lab518" 13 14# Test counters 15total_tests=0 16passed_tests=0 17 18# Cleanup function 19cleanup() { 20 rm -f "$temp_file" 21} 22 23# Error trap 24trap cleanup EXIT ERR 25 26# Function to print test results 27print_result() { 28 local test_name="$1" 29 local result="$2" 30 local message="$3" 31 32 total_tests=$((total_tests + 1)) 33 34 if [ "$result" = "PASS" ]; then 35 echo -e "${GREEN}[PASS]${NC} $test_name: $message" 36 passed_tests=$((passed_tests + 1)) 37 else 38 echo -e "${RED}[FAIL]${NC} $test_name: $message" 39 fi 40} 41 42# Function to print test section header 43print_section() { 44 echo -e "\n${BLUE}=== $1 ===${NC}" 45} 46 47# Test 1: Program compilation/existence 48if [ ! -f "$program" ]; then 49 print_section "Test 1: Program Availability" 50 print_result "Program Existence" "FAIL" "Program $program not found" 51 exit 1 52fi 53 54# Test 2: Basic Magic Square Test (4x4 valid magic square) 55print_section "Basic Magic Square Test" 56 57# Test with known valid 4x4 magic square 58basic_input="4\n16 3 2 13\n 5 10 11 8\n 9 6 7 12\n 4 15 14 1" 59resp=$(echo -e "$basic_input" | "$program" 2>&1) 60exit_code=$? 61 62# Print the output 63echo "$resp" 64echo 65 66if [ $exit_code -ne 0 ]; then 67 print_result "Basic Execution" "FAIL" "Program exited with code $exit_code" 68 exit 1 69else 70 print_result "Basic Execution" "PASS" "Program executed successfully" 71fi 72 73# Check if output contains required prompts and analysis 74if [[ "$resp" == *"What is the order of the square to be tested"* ]]; then 75 print_result "Order Prompt" "PASS" "Program prompts for square order" 76else 77 print_result "Order Prompt" "FAIL" "Program missing order prompt" 78fi 79 80if [[ "$resp" == *"Please enter the"* && "$resp" == *"values for the magic square"* ]]; then 81 print_result "Values Prompt" "PASS" "Program prompts for matrix values" 82else 83 print_result "Values Prompt" "FAIL" "Program missing values prompt" 84fi 85 86if [[ "$resp" == *"Row Check"* ]]; then 87 print_result "Row Analysis" "PASS" "Program analyzes row sums" 88else 89 print_result "Row Analysis" "FAIL" "Program missing row sum analysis" 90fi 91 92if [[ "$resp" == *"Column Check"* ]]; then 93 print_result "Column Analysis" "PASS" "Program analyzes column sums" 94else 95 print_result "Column Analysis" "FAIL" "Program missing column sum analysis" 96fi 97 98if [[ "$resp" == *"Diagonal Check"* ]]; then 99 print_result "Diagonal Analysis" "PASS" "Program analyzes diagonal sums" 100else 101 print_result "Diagonal Analysis" "FAIL" "Program missing diagonal sum analysis" 102fi 103 104# Check for final conclusion 105if [[ "$resp" == *"The given matrix is a magic square"* ]]; then 106 print_result "Magic Square Detection" "PASS" "Program correctly identifies magic square" 107else 108 print_result "Magic Square Detection" "FAIL" "Program missing or incorrect conclusion" 109fi 110 111 112 113# Function to run adversarial test 114run_adversarial_test() { 115 local test_name="$1" 116 local input="$2" 117 local expected_pattern="$3" 118 local should_crash="$4" 119 120 if [ "$should_crash" = "true" ]; then 121 # Test for crash scenarios 122 timeout 5s bash -c "echo -e '$input' | $program" > /dev/null 2>&1 123 exit_code=$? 124 if [ $exit_code -eq 124 ]; then 125 print_result "$test_name" "FAIL" "Program hung (timeout)" 126 elif [ $exit_code -ne 0 ]; then 127 print_result "$test_name" "FAIL" "Program crashed (exit code $exit_code)" 128 else 129 print_result "$test_name" "PASS" "Program handled edge case without crashing" 130 fi 131 else 132 # Test for expected output patterns 133 output=$(timeout 5s bash -c "echo -e '$input' | $program" 2>&1) 134 exit_code=$? 135 136 if [ $exit_code -eq 124 ]; then 137 print_result "$test_name" "FAIL" "Program hung (timeout)" 138 elif [ $exit_code -ne 0 ]; then 139 print_result "$test_name" "FAIL" "Program crashed (exit code $exit_code)" 140 elif [[ "$output" == *"$expected_pattern"* ]]; then 141 print_result "$test_name" "PASS" "Expected output found: $expected_pattern" 142 else 143 print_result "$test_name" "FAIL" "Expected '$expected_pattern' not found in output" 144 fi 145 fi 146} 147 148# Adversarial Testing Section 149print_section "Adversarial Tests" 150 151# Test edge cases that should expose bugs 152run_adversarial_test "Sequential Numbers" "3\n1 2 3\n4 5 6\n7 8 9" "Row sums differ" false 153run_adversarial_test "Zero in Matrix" "3\n0 1 2\n3 4 5\n6 7 8" "" true 154run_adversarial_test "Negative Numbers" "3\n-1 0 1\n2 3 4\n5 6 7" "" true 155run_adversarial_test "Numbers Out of Range" "3\n10 11 12\n13 14 15\n16 17 18" "" true 156run_adversarial_test "Duplicate Numbers" "3\n1 1 1\n2 2 2\n3 3 3" "Not all expected numbers are present" false 157run_adversarial_test "Missing Numbers" "3\n1 2 4\n5 6 7\n8 9 10" "Not all expected numbers are present" false 158run_adversarial_test "All Same Numbers" "3\n5 5 5\n5 5 5\n5 5 5" "Not all expected numbers are present" false 159run_adversarial_test "Valid 5x5 Magic Square" "5\n17 24 1 8 15\n23 5 7 14 16\n4 6 13 20 22\n10 12 19 21 3\n11 18 25 2 9" "The given matrix is a magic square" false 160run_adversarial_test "Large Numbers" "3\n999999 1000000 1000001\n1000002 1000003 1000004\n1000005 1000006 1000007" "" true 161 162# Test summary 163print_section "Test Summary" 164echo -e "${BLUE}Tests passed: $passed_tests/$total_tests${NC}" 165 166if [ $passed_tests -eq $total_tests ]; then 167 echo -e "${GREEN}All tests passed!${NC}" 168 exit 0 169else 170 echo -e "${RED}Some tests failed!${NC}" 171 exit 1 172fi