149 lines
5.4 KiB
Bash
Executable file
149 lines
5.4 KiB
Bash
Executable file
#!/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
|
||
|