99 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			1.6 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"
 | |
| 
 | |
| if [[ "$1" =~ --all|-a ]]; then
 | |
| 	check_all=true
 | |
| else
 | |
| 	check_all=false
 | |
| fi
 | |
| 
 | |
| 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 --color <(./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
 | 
