111 lines
1.8 KiB
Bash
Executable File
111 lines
1.8 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
CC_COMMAND='g++ -Wall -Wextra -Werror -pedantic -D__PROGTEST__ -Wdouble-promotion -Wfloat-conversion'
|
|
|
|
RED="\e[31m"
|
|
GREEN="\e[32m"
|
|
YELLOW="\e[33m"
|
|
RESET="\e[0m"
|
|
|
|
DIFF_COMMAND="diff --color"
|
|
|
|
check_all=false
|
|
|
|
for arg in "$@"; do
|
|
case "$arg" in
|
|
--all|-a)
|
|
check_all=true
|
|
;;
|
|
--gitlab|-g)
|
|
# Disable colored output, because alpine diff is missing --color flag
|
|
DIFF_COMMAND="diff"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
|
|
|
|
EXIT_STATUS=0
|
|
|
|
_log() {
|
|
# 0 => Okay / Green
|
|
# 1 => Warn / Yellow
|
|
# 2 => Fail / Red
|
|
local log_level="$1"
|
|
local log_message="$2"
|
|
|
|
local log_color=""
|
|
local log_level_name=""
|
|
case "$log_level" in
|
|
0)
|
|
log_color="$GREEN"
|
|
log_level_name="OKAY"
|
|
;;
|
|
1)
|
|
log_color="$YELLOW"
|
|
log_level_name="WARN"
|
|
;;
|
|
2)
|
|
log_color="$RED"
|
|
log_level_name="FAIL"
|
|
;;
|
|
esac
|
|
|
|
printf "[${log_color}${log_level_name}${RESET}] %s\n" "$log_message"
|
|
}
|
|
|
|
_test_dir() {
|
|
local dir="$1"
|
|
|
|
if ! cd "$dir" > /dev/null; then
|
|
_log 2 "Couldn't cd into $dir"
|
|
return 1
|
|
fi
|
|
|
|
local dir_name="${PWD##*/}"
|
|
|
|
if [[ ! -f ./main.c ]]; then
|
|
_log 1 "No main.c file in $dir_name"
|
|
return 1
|
|
fi
|
|
|
|
if [[ ! -d ./test_data ]]; then
|
|
_log 1 "No test_data directory in $dir_name"
|
|
return 1
|
|
fi
|
|
|
|
if ! eval "$CC_COMMAND main.c"; then
|
|
_log 2 "Failed to compile code in $dir_name"
|
|
EXIT_STATUS=1
|
|
return 1
|
|
fi
|
|
|
|
failed_inputs=0
|
|
for input in test_data/*_in.txt; do
|
|
|
|
input_file=${input//*\/}
|
|
test_case_number=${input_file%%_in.txt}
|
|
|
|
if ! $DIFF_COMMAND <(./a.out < "test_data/${test_case_number}_in.txt") "test_data/${test_case_number}_out.txt"; then
|
|
EXIT_STATUS=1
|
|
((failed_inputs++))
|
|
_log 2 "$dir (#$test_case_number)"
|
|
fi
|
|
done
|
|
|
|
if ((failed_inputs == 0)); then
|
|
_log 0 "$dir_name"
|
|
fi
|
|
}
|
|
|
|
if ! $check_all; then
|
|
_test_dir .
|
|
else
|
|
for dir in homework-* exercise-*; do
|
|
_test_dir "$dir"
|
|
cd .. > /dev/null
|
|
done
|
|
fi
|
|
|
|
exit $EXIT_STATUS
|