Files
42_INT_07_minishell/tests/unit_tests/test_unit.sh
2021-12-03 07:00:39 +01:00

162 lines
3.7 KiB
Bash

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