#!/bin/bash # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Test configuration temp_file="lab518.output" program="./lab518" # Test counters total_tests=0 passed_tests=0 # Cleanup function cleanup() { rm -f "$temp_file" } # Error trap trap cleanup EXIT ERR # Function to print test results print_result() { local test_name="$1" local result="$2" local message="$3" total_tests=$((total_tests + 1)) if [ "$result" = "PASS" ]; then echo -e "${GREEN}[PASS]${NC} $test_name: $message" passed_tests=$((passed_tests + 1)) else echo -e "${RED}[FAIL]${NC} $test_name: $message" fi } # Function to print test section header print_section() { echo -e "\n${BLUE}=== $1 ===${NC}" } # Test 1: Program compilation/existence if [ ! -f "$program" ]; then print_section "Test 1: Program Availability" print_result "Program Existence" "FAIL" "Program $program not found" exit 1 fi # Test 2: Basic Magic Square Test (4x4 valid magic square) print_section "Basic Magic Square Test" # Test with known valid 4x4 magic square basic_input="4\n16 3 2 13\n 5 10 11 8\n 9 6 7 12\n 4 15 14 1" resp=$(echo -e "$basic_input" | "$program" 2>&1) exit_code=$? # Print the output echo "$resp" echo if [ $exit_code -ne 0 ]; then print_result "Basic Execution" "FAIL" "Program exited with code $exit_code" exit 1 else print_result "Basic Execution" "PASS" "Program executed successfully" fi # Check if output contains required prompts and analysis if [[ "$resp" == *"What is the order of the square to be tested"* ]]; then print_result "Order Prompt" "PASS" "Program prompts for square order" else print_result "Order Prompt" "FAIL" "Program missing order prompt" fi if [[ "$resp" == *"Please enter the"* && "$resp" == *"values for the magic square"* ]]; then print_result "Values Prompt" "PASS" "Program prompts for matrix values" else print_result "Values Prompt" "FAIL" "Program missing values prompt" fi if [[ "$resp" == *"Row Check"* ]]; then print_result "Row Analysis" "PASS" "Program analyzes row sums" else print_result "Row Analysis" "FAIL" "Program missing row sum analysis" fi if [[ "$resp" == *"Column Check"* ]]; then print_result "Column Analysis" "PASS" "Program analyzes column sums" else print_result "Column Analysis" "FAIL" "Program missing column sum analysis" fi if [[ "$resp" == *"Diagonal Check"* ]]; then print_result "Diagonal Analysis" "PASS" "Program analyzes diagonal sums" else print_result "Diagonal Analysis" "FAIL" "Program missing diagonal sum analysis" fi # Check for final conclusion if [[ "$resp" == *"The given matrix is a magic square"* ]]; then print_result "Magic Square Detection" "PASS" "Program correctly identifies magic square" else print_result "Magic Square Detection" "FAIL" "Program missing or incorrect conclusion" fi # Function to run adversarial test run_adversarial_test() { local test_name="$1" local input="$2" local expected_pattern="$3" local should_crash="$4" if [ "$should_crash" = "true" ]; then # Test for crash scenarios timeout 5s bash -c "echo -e '$input' | $program" > /dev/null 2>&1 exit_code=$? if [ $exit_code -eq 124 ]; then print_result "$test_name" "FAIL" "Program hung (timeout)" elif [ $exit_code -ne 0 ]; then print_result "$test_name" "FAIL" "Program crashed (exit code $exit_code)" else print_result "$test_name" "PASS" "Program handled edge case without crashing" fi else # Test for expected output patterns output=$(timeout 5s bash -c "echo -e '$input' | $program" 2>&1) exit_code=$? if [ $exit_code -eq 124 ]; then print_result "$test_name" "FAIL" "Program hung (timeout)" elif [ $exit_code -ne 0 ]; then print_result "$test_name" "FAIL" "Program crashed (exit code $exit_code)" elif [[ "$output" == *"$expected_pattern"* ]]; then print_result "$test_name" "PASS" "Expected output found: $expected_pattern" else print_result "$test_name" "FAIL" "Expected '$expected_pattern' not found in output" fi fi } # Adversarial Testing Section print_section "Adversarial Tests" # Test edge cases that should expose bugs run_adversarial_test "Sequential Numbers" "3\n1 2 3\n4 5 6\n7 8 9" "Row sums differ" false run_adversarial_test "Zero in Matrix" "3\n0 1 2\n3 4 5\n6 7 8" "" true run_adversarial_test "Negative Numbers" "3\n-1 0 1\n2 3 4\n5 6 7" "" true run_adversarial_test "Numbers Out of Range" "3\n10 11 12\n13 14 15\n16 17 18" "" true run_adversarial_test "Duplicate Numbers" "3\n1 1 1\n2 2 2\n3 3 3" "Not all expected numbers are present" false run_adversarial_test "Missing Numbers" "3\n1 2 4\n5 6 7\n8 9 10" "Not all expected numbers are present" false run_adversarial_test "All Same Numbers" "3\n5 5 5\n5 5 5\n5 5 5" "Not all expected numbers are present" false run_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 run_adversarial_test "Large Numbers" "3\n999999 1000000 1000001\n1000002 1000003 1000004\n1000005 1000006 1000007" "" true # Test summary print_section "Test Summary" echo -e "${BLUE}Tests passed: $passed_tests/$total_tests${NC}" if [ $passed_tests -eq $total_tests ]; then echo -e "${GREEN}All tests passed!${NC}" exit 0 else echo -e "${RED}Some tests failed!${NC}" exit 1 fi