test-518.sh
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