#!/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" 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