#!/bin/bash ## explanation : ## 1. check for arguments (files for tests) ## if found, check for validity, and launch test on them ## if not found, launch test on default file list ## 2. execute the main for-loop ## it will iterate through the commands of each files ## if commands are not separated by empty line, it concat them ## then it calls the compare function "test_minishell" with commands ## and it calls the print function with the results ## 3. the compare function "test_minishell" ## it takes the commands in argument ## it launch bash and minishell with the commands ## if multiple commands, they are executed in a row before exit the shell ## if error, it prints right away the two outputs ## 4. the print function, print results ## it's use after each files ## and at the end # COLORS RED="\001\e[0;31m\002" GREEN="\001\e[0;32m\002" YELLOW="\001\e[0;33m\002" BLUE="\001\e[0;34m\002" MAGENTA="\001\e[0;35m\002" CYAN="\001\e[0;36m\002" WHITE="\001\e[0;37m\002" B_RED="\001\e[1;31m\002" B_GREEN="\001\e[1;32m\002" B_YELLOW="\001\e[1;33m\002" B_BLUE="\001\e[1;34m\002" B_MAGENTA="\001\e[1;35m\002" B_CYAN="\001\e[1;36m\002" B_WHITE="\001\e[1;37m\002" ENDCO="\001\e[0m\002" # copy the executable to current directory cp ../../minishell . # list of tests files, by default ot in parameters if [ $# == 0 ] then list_files=" vrac.sh pipes.sh expensions.sh redirections.sh heredocs.sh exit_status.sh builtins.sh " else list_files="" for (( i = 1 ; i <= "$#" ; i++ )) do if [ -e "${!i}" ] then if [ -n "$list_files" ] then list_files+=$'\n' fi list_files+="${!i}" else echo "${!i} is not a valid file" fi done fi # globale variables UNIT_TEST=0 SUCCESS_TEST=0 TOTAL_TEST=0 TOTAL_SUCCESS=0 # function that will launch the command in bash and minishell and compare them function test_minishell { # execute commands in bash and minishell bash_execution=$( echo "$@" | bash 2>/dev/null ) minishell_execution=$( echo "$@" | ./minishell 2>/dev/null ) #compare output if [ "$bash_execution" = "$minishell_execution" ] then (( SUCCESS_TEST++ )) (( TOTAL_SUCCESS++ )) else echo -e $B_RED"ERROR :"$ENDCO echo "" echo -e $B_MAGENTA"[bash execution] :"$ENDCO echo "$@" | bash -i echo "" echo -e $B_MAGENTA"[minishell execution] :"$ENDCO echo "$@" | ./minishell echo "" fi } # function to print the results # receive parameters : file name, numerator, denominator function print_results { echo -en $B_WHITE"results for $1 : "$ENDCO if [ $2 -eq 0 ] then echo -en $B_RED $2 $ENDCO elif [ $2 -eq $3 ] then echo -en $B_GREEN $2 $ENDCO else echo -en $B_MAGENTA $2 $ENDCO fi echo -e $B_WHITE"/ $3"$ENDCO } # the main loop: go through the files and call the compare func on each commands # parse tests files line by line, grouping lines non-separated by an empty line for i in $list_files do filename=$i echo -e "\n"$B_YELLOW"test file : $i"$ENDCO command_test="" last_line="$(tail -1 $i)" UNIT_TEST=0 SUCCESS_TEST=0 while read line do if [ "$line" != "" ] then if [ "$command_test" == "" ] then command_test="$line" else command_test+=$'\n' command_test+="$line" fi if [ "$line" == "$last_line" ] then (( UNIT_TEST++ )) (( TOTAL_TEST++ )) test_minishell "$command_test" fi elif [ "$command_test" != "" ] then (( UNIT_TEST++ )) (( TOTAL_TEST++ )) test_minishell "$command_test" command_test="" fi done < $filename print_results $i $SUCCESS_TEST $UNIT_TEST done # print the total results if [ -n "$list_files" ] then echo "" print_results "all" $TOTAL_SUCCESS $TOTAL_TEST fi