diff --git a/tests/functional/run-tests.sh b/tests/functional/run-tests.sh new file mode 100755 index 0000000..ef5030f --- /dev/null +++ b/tests/functional/run-tests.sh @@ -0,0 +1,268 @@ +#!/bin/bash + + +################### +# Variables # +################### + +executable="../../src/42sh" +ref_executable="dash" + +tmp_script="/tmp/test_script.sh" +output="/tmp/42sh_tests.output" +ref_output="/tmp/42sh_tests_ref.output" + +total_tests=0 +errors_count=0 +timeouts_count=0 + + +################## +# Colors # +################## + +# Reset +Color_Off='\033[0m' # Text Reset + +# Regular Colors +Black='\033[0;30m' # Black +Red='\033[0;31m' # Red +Green='\033[0;32m' # Green +Yellow='\033[0;33m' # Yellow +Blue='\033[0;34m' # Blue +Purple='\033[0;35m' # Purple +Cyan='\033[0;36m' # Cyan +White='\033[0;37m' # White + +# Bold +BBlack='\033[1;30m' # Black +BRed='\033[1;31m' # Red +BGreen='\033[1;32m' # Green +BYellow='\033[1;33m' # Yellow +BBlue='\033[1;34m' # Blue +BPurple='\033[1;35m' # Purple +BCyan='\033[1;36m' # Cyan +BWhite='\033[1;37m' # White + +# Underline +UBlack='\033[4;30m' # Black +URed='\033[4;31m' # Red +UGreen='\033[4;32m' # Green +UYellow='\033[4;33m' # Yellow +UBlue='\033[4;34m' # Blue +UPurple='\033[4;35m' # Purple +UCyan='\033[4;36m' # Cyan +UWhite='\033[4;37m' # White + +# Background +On_Black='\033[40m' # Black +On_Red='\033[41m' # Red +On_Green='\033[42m' # Green +On_Yellow='\033[43m' # Yellow +On_Blue='\033[44m' # Blue +On_Purple='\033[45m' # Purple +On_Cyan='\033[46m' # Cyan +On_White='\033[47m' # White + +# High Intensity +IBlack='\033[0;90m' # Black +IRed='\033[0;91m' # Red +IGreen='\033[0;92m' # Green +IYellow='\033[0;93m' # Yellow +IBlue='\033[0;94m' # Blue +IPurple='\033[0;95m' # Purple +ICyan='\033[0;96m' # Cyan +IWhite='\033[0;97m' # White + +# Bold High Intensity +BIBlack='\033[1;90m' # Black +BIRed='\033[1;91m' # Red +BIGreen='\033[1;92m' # Green +BIYellow='\033[1;93m' # Yellow +BIBlue='\033[1;94m' # Blue +BIPurple='\033[1;95m' # Purple +BICyan='\033[1;96m' # Cyan +BIWhite='\033[1;97m' # White + +# High Intensity backgrounds +On_IBlack='\033[0;100m' # Black +On_IRed='\033[0;101m' # Red +On_IGreen='\033[0;102m' # Green +On_IYellow='\033[0;103m' # Yellow +On_IBlue='\033[0;104m' # Blue +On_IPurple='\033[0;105m' # Purple +On_ICyan='\033[0;106m' # Cyan +On_IWhite='\033[0;107m' # White + + + +################## +# Wrappers # +################## + + +# @arg test command +# @arg actual code +# @arg ref code +check_result() { + + command="$1" + actual_code="$2" + ref_code="$3" + + test_failed=0 + + # Check return code + if [[ "$actual_code" -eq 124 ]]; then + echo -e $BRed "TIMEOUT" $Color_Off + echo -e ' ' "on '$command'" + echo -e ' ' "Expected code $ref_code but got $actual_code" + ((timeouts_count++)) + test_failed=1 + elif [[ "$actual_code" -ne "$ref_code" ]]; then + echo -e $BRed "FAILED" $Color_Off + echo -e ' ' "on '$command'" + echo -e ' ' "Expected code $ref_code but got $actual_code" + test_failed=1 + # Check output + elif diff $output $ref_output > /dev/null; then + echo -e $BRed "FAILED" $Color_Off + echo -e ' ' "on '$command'" + echo -e ' ' "Output is not the one expected" + test_failed=1 + else + echo -e $BGreen OK $Color_Off + fi + + if [[ "$test_failed" -eq 1 ]]; then + ((errors_count++)) + fi + +} + + +# @arg test name +# @arg input string +test_str() { + + # Check input + if [[ -z "$1" || -z "$2" ]]; then + echo -e $BRed "\n\n" "Issue in the testsuite: test_str: One or more argument is empty" $Color_Off + exit 2 + fi + + echo -e $BBlue "================== $1 ==================" $Color_Off + + echo -e "$2" > $tmp_script + + # Arg + echo -e -n $Blue "= [ARG] " $Color_Off + timeout 2 $executable -c "$2" &> $output + actual_code=$? + $ref_executable -c "$2" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$2" "$actual_code" "$ref_code" + + # Script + echo -e -n $Blue "= [SCRIPT]" $Color_Off + timeout 2 $executable "$tmp_script" &> $output + actual_code=$? + $ref_executable "$tmp_script" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$2" "$actual_code" "$ref_code" + + # Stdin + echo -e -n $Blue "= [STDIN] " $Color_Off + timeout 2 $executable < "$tmp_script" &> $output + actual_code=$? + $ref_executable < "$tmp_script" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$2" "$actual_code" "$ref_code" + + echo -e "\n" + # echo -e $BBlue "===========================================" $Color_Off "\n" +} + +# @arg test name +# @arg input script +test_script() { + + # Check input + if [[ -z "$1" || -z "$2" ]]; then + echo -e $BRed "\n\n" "Issue in the testsuite: test_script: One or more argument is empty" $Color_Off + exit 2 + fi + if [[ ! -f "$2" ]]; then + echo -e $BRed "\n\n" "Issue in the testsuite: test_script: Second argument is not a file" $Color_Off + exit 2 + fi + + echo -e $BBlue "================== $1 ==================" $Color_Off + + # Script + echo -e -n "= [SCRIPT] " + timeout 2 $executable "$tmp_script" &> $output + actual_code=$? + $ref_executable "$tmp_script" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$2" "$actual_code" "$ref_code" + + # Stdin + echo -e -n "= [STDIN] " + timeout 2 $executable < "$tmp_script" &> $output + actual_code=$? + $ref_executable < "$2" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$tmp_script" "$actual_code" "$ref_code" + + echo -e "\n" + # echo -e $BBlue "===========================================" $Color_Off "\n" +} + +summarize() { + + (( passed_tests = $total_tests - $errors_count )) + (( tests_percentage = 100 * $passed_tests / $total_tests )) + + if [[ tests_percentage -gt 80 ]]; then + coverage_color=$BGreen + elif [[ tests_percentage -gt 50 ]]; then + coverage_color=$BYellow + elif [[ tests_percentage -gt 30 ]]; then + coverage_color=$BOrange + else + coverage_color=$BRed + fi + + echo -e $BWhite "\n\n""===========" $UWhite"Summary"$Color_Off "\n" + echo -e " Passed $coverage_color$passed_tests/$total_tests$Color_Off tests ($coverage_color$tests_percentage$Color_Off%)" + echo -e " Got $BRed$timeouts_count timeout(s)$Color_Off" + echo + +} + +# *********************************************************** +################# +# Tests # +################# + +echo -e "\n\n""===$BGreen TestsuitatorX Ultra Pro Max+ 365 Premium Gris Sidéral" "\n\n"$Color_Off + + +# echo +test_str "Hello" "echo Hello there" +test_str "Hello;" "echo Hello there;" +test_str "'Hello'" "echo 'Hello there'" +test_str "Hello;Hello" "echo Hello; echo Wesh attends quoi; echo pouquoi je suis une ligne en dessous" + +# programs +test_str "LS" "ls" +test_str "Le SS" "lss" + + +summarize