From 4d27cea46bb559b77aa75502a134830ed6f4c7af Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Tue, 20 Jan 2026 23:00:20 +0100 Subject: [PATCH 1/3] feat: basic foundations for functional testing --- tests/functional/run-tests.sh | 189 ++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 tests/functional/run-tests.sh diff --git a/tests/functional/run-tests.sh b/tests/functional/run-tests.sh new file mode 100644 index 0000000..b549067 --- /dev/null +++ b/tests/functional/run-tests.sh @@ -0,0 +1,189 @@ +#!/bin/bash + +echo WIP: vous pourriez regretter de lancer ce script +exit 2 + + +################### +# Variables # +################### + +executable="../../src/42sh" +errors_count=0 # TODO take into account + + + +################## +# 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 # +################## + +# TODO output handling + +# @arg test name +# @arg input string +# @arg expected output +# @arg expected return code +test_cmd() { + + # Check input + if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then + echo $BRed "\n\n" "Issue in the testsuite: test_cmd: One or more argument is empty" $Color_off + exit 2 + fi + + echo $BBlue "=== $1 ===" $Color_off + + $executable -c "$2" + actual_code=$? + + if [[ "$actual_code" -ne "$4" ]]; then + echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off + fi + + echo $BBlue "===================" $Color_off "\n" +} + +# @arg test name +# @arg input script +# @arg expected output +# @arg expected return code +test_script() { + + # Check input + if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then + echo $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 $BRed "\n\n" "Issue in the testsuite: test_script: Second argument is not a file" $Color_off + exit 2 + fi + + + echo $BBlue "=== $1 ===" $Color_off + + $executable "$2" + actual_code=$? + + if [[ "$actual_code" -ne "$4" ]]; then + echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off + fi + + echo $BBlue "===================" $Color_off "\n" +} + +# @arg test name +# @arg input file +# @arg expected output +# @arg expected return code +test_stdin() { + # Check input + if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then + echo $BRed "\n\n" "Issue in the testsuite: test_stdin: One or more argument is empty" $Color_off + exit 2 + fi + if [[ ! -f "$2" ]]; then + echo $BRed "\n\n" "Issue in the testsuite: test_stdin: Second argument is not a file" $Color_off + exit 2 + fi + + + echo $BBlue "===== $1 =====" $Color_off + + $executable < "$2" + actual_code=$? + + if [[ "$actual_code" -ne "$4" ]]; then + echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off + fi + + echo $BBlue "===================" $Color_off "\n" + +} + + +# *********************************************************** +################# +# Tests # +################# + + From 402b1614b5b8173f45050a858ecaf889aeae3bbd Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Wed, 21 Jan 2026 19:17:29 +0100 Subject: [PATCH 2/3] feat: Extended base tools for testing and made a basic test --- tests/functional/run-tests.sh | 137 +++++++++++++++++++++------------- 1 file changed, 86 insertions(+), 51 deletions(-) diff --git a/tests/functional/run-tests.sh b/tests/functional/run-tests.sh index b549067..14a68b4 100644 --- a/tests/functional/run-tests.sh +++ b/tests/functional/run-tests.sh @@ -9,7 +9,11 @@ exit 2 ################### executable="../../src/42sh" -errors_count=0 # TODO take into account +errors_count=0 +total_tests=0 +tmp_script="/tmp/test_script.sh" +output="/tmp/42sh_tests.output" +ref_output="/tmp/42sh_tests_ref.output" @@ -96,40 +100,91 @@ On_IWhite='\033[0;107m' # White # Wrappers # ################## -# TODO output handling + +# @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" -ne "$ref_code" ]]; then + echo $BRed "FAILED" $Color_off + echo $Blue ' ' "on '$2'" $Color_off + echo ' ' "Expected code $ref_code but got $actual_code" + test_failed=1 + # Check output + elif [ diff $output $ref_output > /dev/null ]; then + echo $BRed "FAILED" $Color_off + echo $Blue ' ' "on '$2'" $Color_off + echo ' ' "Output is not the one expected" + test_failed=1 + else + echo $Blue OK $Colors_off + fi + + if [[ "$test_failed" -eq 1 ]]; then + ((errors_count++)) + fi + +} + # @arg test name # @arg input string -# @arg expected output -# @arg expected return code -test_cmd() { +test_str() { # Check input - if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then - echo $BRed "\n\n" "Issue in the testsuite: test_cmd: One or more argument is empty" $Color_off + if [[ -z "$1" || -z "$2" ]]; then + echo $BRed "\n\n" "Issue in the testsuite: test_str: One or more argument is empty" $Color_off exit 2 fi echo $BBlue "=== $1 ===" $Color_off - $executable -c "$2" - actual_code=$? + echo "$2" > $tmp_script - if [[ "$actual_code" -ne "$4" ]]; then - echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off - fi + # Arg + echo -n "\n= [ARG] " + $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 -n "\n= [SCRIPT] " + $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 -n "\n= [STDIN] " + $executable < "$tmp_script" &> $output + actual_code=$? + $ref_executable < "$2" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$tmp_script" "$actual_code" "$ref_code" echo $BBlue "===================" $Color_off "\n" } # @arg test name # @arg input script -# @arg expected output -# @arg expected return code test_script() { # Check input - if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then + if [[ -z "$1" || -z "$2" ]]; then echo $BRed "\n\n" "Issue in the testsuite: test_script: One or more argument is empty" $Color_off exit 2 fi @@ -138,52 +193,32 @@ test_script() { exit 2 fi - echo $BBlue "=== $1 ===" $Color_off - $executable "$2" + # Script + echo -n "\n= [SCRIPT] " + $executable "$tmp_script" &> $output actual_code=$? + $ref_executable "$tmp_script" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$2" "$actual_code" "$ref_code" - if [[ "$actual_code" -ne "$4" ]]; then - echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off - fi + # Stdin + echo -n "\n= [STDIN] " + $executable < "$tmp_script" &> $output + actual_code=$? + $ref_executable < "$2" &> $ref_output + ref_code=$? + ((total_tests++)) + check_result "$tmp_script" "$actual_code" "$ref_code" echo $BBlue "===================" $Color_off "\n" } -# @arg test name -# @arg input file -# @arg expected output -# @arg expected return code -test_stdin() { - # Check input - if [[ -z "$1" || -z "$2" || -z "$3" || -z "$4"]]; then - echo $BRed "\n\n" "Issue in the testsuite: test_stdin: One or more argument is empty" $Color_off - exit 2 - fi - if [[ ! -f "$2" ]]; then - echo $BRed "\n\n" "Issue in the testsuite: test_stdin: Second argument is not a file" $Color_off - exit 2 - fi - - - echo $BBlue "===== $1 =====" $Color_off - - $executable < "$2" - actual_code=$? - - if [[ "$actual_code" -ne "$4" ]]; then - echo $BRed "Test failed: expected code $4 but got $actual_code" $Color_off - fi - - echo $BBlue "===================" $Color_off "\n" - -} - - # *********************************************************** ################# # Tests # ################# - +test_str "Hello" "echo Hello there" From ed6e761f9cb40a7dddc54f7b49ed98190da2079c Mon Sep 17 00:00:00 2001 From: "Gu://em_" Date: Wed, 21 Jan 2026 22:59:33 +0100 Subject: [PATCH 3/3] feat: testsuite summary and enhanced tests look --- tests/functional/run-tests.sh | 112 +++++++++++++++++++++++----------- 1 file changed, 78 insertions(+), 34 deletions(-) mode change 100644 => 100755 tests/functional/run-tests.sh diff --git a/tests/functional/run-tests.sh b/tests/functional/run-tests.sh old mode 100644 new mode 100755 index 14a68b4..ef5030f --- a/tests/functional/run-tests.sh +++ b/tests/functional/run-tests.sh @@ -1,20 +1,20 @@ #!/bin/bash -echo WIP: vous pourriez regretter de lancer ce script -exit 2 - ################### # Variables # ################### executable="../../src/42sh" -errors_count=0 -total_tests=0 +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 ################## @@ -113,19 +113,25 @@ check_result() { test_failed=0 # Check return code - if [[ "$actual_code" -ne "$ref_code" ]]; then - echo $BRed "FAILED" $Color_off - echo $Blue ' ' "on '$2'" $Color_off - echo ' ' "Expected code $ref_code but got $actual_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 $BRed "FAILED" $Color_off - echo $Blue ' ' "on '$2'" $Color_off - echo ' ' "Output is not the one expected" + 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 $Blue OK $Colors_off + echo -e $BGreen OK $Color_Off fi if [[ "$test_failed" -eq 1 ]]; then @@ -141,17 +147,17 @@ test_str() { # Check input if [[ -z "$1" || -z "$2" ]]; then - echo $BRed "\n\n" "Issue in the testsuite: test_str: One or more argument is empty" $Color_off + echo -e $BRed "\n\n" "Issue in the testsuite: test_str: One or more argument is empty" $Color_Off exit 2 fi - echo $BBlue "=== $1 ===" $Color_off + echo -e $BBlue "================== $1 ==================" $Color_Off - echo "$2" > $tmp_script + echo -e "$2" > $tmp_script # Arg - echo -n "\n= [ARG] " - $executable -c "$2" &> $output + echo -e -n $Blue "= [ARG] " $Color_Off + timeout 2 $executable -c "$2" &> $output actual_code=$? $ref_executable -c "$2" &> $ref_output ref_code=$? @@ -159,8 +165,8 @@ test_str() { check_result "$2" "$actual_code" "$ref_code" # Script - echo -n "\n= [SCRIPT] " - $executable "$tmp_script" &> $output + echo -e -n $Blue "= [SCRIPT]" $Color_Off + timeout 2 $executable "$tmp_script" &> $output actual_code=$? $ref_executable "$tmp_script" &> $ref_output ref_code=$? @@ -168,15 +174,16 @@ test_str() { check_result "$2" "$actual_code" "$ref_code" # Stdin - echo -n "\n= [STDIN] " - $executable < "$tmp_script" &> $output + echo -e -n $Blue "= [STDIN] " $Color_Off + timeout 2 $executable < "$tmp_script" &> $output actual_code=$? - $ref_executable < "$2" &> $ref_output + $ref_executable < "$tmp_script" &> $ref_output ref_code=$? ((total_tests++)) - check_result "$tmp_script" "$actual_code" "$ref_code" + check_result "$2" "$actual_code" "$ref_code" - echo $BBlue "===================" $Color_off "\n" + echo -e "\n" + # echo -e $BBlue "===========================================" $Color_Off "\n" } # @arg test name @@ -185,19 +192,19 @@ test_script() { # Check input if [[ -z "$1" || -z "$2" ]]; then - echo $BRed "\n\n" "Issue in the testsuite: test_script: One or more argument is empty" $Color_off + 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 $BRed "\n\n" "Issue in the testsuite: test_script: Second argument is not a file" $Color_off + echo -e $BRed "\n\n" "Issue in the testsuite: test_script: Second argument is not a file" $Color_Off exit 2 fi - echo $BBlue "=== $1 ===" $Color_off + echo -e $BBlue "================== $1 ==================" $Color_Off # Script - echo -n "\n= [SCRIPT] " - $executable "$tmp_script" &> $output + echo -e -n "= [SCRIPT] " + timeout 2 $executable "$tmp_script" &> $output actual_code=$? $ref_executable "$tmp_script" &> $ref_output ref_code=$? @@ -205,15 +212,38 @@ test_script() { check_result "$2" "$actual_code" "$ref_code" # Stdin - echo -n "\n= [STDIN] " - $executable < "$tmp_script" &> $output + 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 $BBlue "===================" $Color_off "\n" + 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 + } # *********************************************************** @@ -221,4 +251,18 @@ test_script() { # 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