2nd_Sem_Bogachev/2025.05.23/tests/seva_test.sh
2025-05-22 18:52:04 +03:00

149 lines
5.4 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Скрипт для автотестирования задач 1-10 с однонаправленным списком строк
# Исполняемые файлы: a01.out, a02.out, ..., a10.out
# Ошибки сохраняются в error.txt
# Установка прав на исполнение
chmod +x a*.out
echo "Компилирую программу:"
make clean
make
echo "Программа скомпилирована"
# Очищаем файлы результатов и ошибок
> res.txt
> error.txt
# Функция для вывода разделителя
print_separator() {
echo "=================" >> res.txt
}
# Функция для записи ошибки
log_error() {
local task_num=$1
local test_file=$2
local message=$3
echo "Задача: $task_num | Файл: $test_file | Ошибка: $message" >> error.txt
}
# Функция для запуска теста с обработкой ошибок
run_test() {
local task_num=$1
local max_print=$2
local filename=$3
local binary="./a$(printf "%02d" $task_num).out"
# Проверяем существование исполняемого файла
if [ ! -f "$binary" ]; then
echo "Исполняемый файл $binary не найден!" >> res.txt
log_error $task_num $filename "Исполняемый файл $binary не найден"
return 1
fi
# Проверяем существование входного файла
if [ ! -f "$filename" ]; then
echo "Входной файл $filename не найден!" >> res.txt
log_error $task_num $filename "Входной файл не найден"
return 1
fi
# Запускаем программу и перехватываем ошибки
echo "Запуск: $binary $max_print $filename" >> res.txt
output=$(timeout 10s $binary $max_print $filename 2>&1)
status=$?
case $status in
0)
# Успешное выполнение
echo "$output" >> res.txt
;;
136|139)
# Ошибка SEGFAULT (SIGSEGV)
echo "ОШИБКА: SEGFAULT (нарушение сегментации)" >> res.txt
log_error $task_num $filename "SEGFAULT (нарушение сегментации)"
;;
8|136|137|139)
# FPE (SIGFPE) или другие сигналы
echo "ОШИБКА: FPE (ошибка вычисления с плавающей точкой)" >> res.txt
log_error $task_num $filename "FPE (ошибка вычисления с плавающей точкой)"
;;
124)
# Таймаут
echo "ОШИБКА: Таймаут выполнения (программа зависла)" >> res.txt
log_error $task_num $filename "Таймаут выполнения (программа зависла)"
;;
*)
# Другие ошибки
echo "ОШИБКА: Программа завершилась с кодом $status" >> res.txt
log_error $task_num $filename "Программа завершилась с кодом $status"
;;
esac
}
test="test"
# Создаем тестовые файлы с данными
create_test_files() {
# Тестовый файл 1 - несколько строк разной длины
echo -e "apple\nbanana\napple\ncherry\ndate\napple\nfig\ngrape" > ${test}1.txt
# Тестовый файл 2 - строки с повторениями
echo -e "one\none\ntwo\ntwo\ntwo\nthree\nfour\nfour" > test2.txt
# Тестовый файл 3 - возрастающая последовательность
echo -e "a\nb\nc\nd\ne\nf\ng\nh" > test3.txt
# Тестовый файл 4 - убывающая последовательность
echo -e "h\ng\nf\ne\nd\nc\nb\na" > test4.txt
# Тестовый файл 5 - случайные строки
echo -e "cat\ndog\ncat\nbird\nfish\nbird\ndog\ncat" > test5.txt
# Тестовый файл 6 - пустой файл
echo -n "" > test6.txt
# Тестовый файл 7 - одна строка
echo "single" > test7.txt
# Тестовый файл 8 - длинные строки
echo -e "very_long_string_1234567890\nshort\nmedium_length_string_123" > test8.txt
}
delete_test_files() {
for n in {1..8} ; do
rm "${test}$n.txt"
done ;
}
# Создаем тестовые файлы
create_test_files
# Запуск тестов для всех задач (1-10)
for task_num in {1..10}; do
print_separator
echo "=== ЗАДАЧА $task_num ===" >> res.txt
print_separator
# Тестируем на всех тестовых файлах
for test_file in test{1..8}.txt; do
echo "Тестируемый файл: $test_file" >> res.txt
echo "Максимум выводимых элементов: 5" >> res.txt
run_test $task_num 5 $test_file
echo "" >> res.txt # Добавляем пустую строку между тестами
done
echo "" >> res.txt # Добавляем пустую строку между задачами
done
delete_test_files
make clean
# Выводим количество ошибок
error_count=$(wc -l < error.txt)
echo "Найдено ошибок: $error_count" | tee -a res.txt