mirror of
https://codeberg.org/la-chouette/minishell.git
synced 2025-12-06 07:28:09 +01:00
195 lines
5.8 KiB
Bash
Executable file
195 lines
5.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
set -uo pipefail
|
|
|
|
declare -i FAILED=0
|
|
declare -i SUCCEDED=0
|
|
declare -i RAN=0
|
|
NAME=""
|
|
|
|
failed_report()
|
|
{
|
|
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
echo $NAME
|
|
echo "++++++++++++++++++++++++++++++++++++++++++++++++++++"
|
|
echo "++++ Failed test:"
|
|
cat /tmp/input.minishell
|
|
echo "++++ Got output:"
|
|
cat /tmp/got.minishell
|
|
echo "++++ But expected:"
|
|
cat /tmp/expected.minishell
|
|
echo "++++ Diff:"
|
|
echo "(red is got, green is expected)"
|
|
diff --color=always /tmp/got.minishell /tmp/expected.minishell
|
|
echo "++++ Run this to debug:"
|
|
echo "echo '$(cat /tmp/input.minishell)' | ./minishell"
|
|
}
|
|
|
|
failed()
|
|
{
|
|
failed_report >> report.txt
|
|
echo -n "F"
|
|
FAILED+=1
|
|
}
|
|
|
|
succeded()
|
|
{
|
|
echo -n "."
|
|
SUCCEDED+=1
|
|
}
|
|
|
|
assert()
|
|
{
|
|
diff -q /tmp/got.minishell /tmp/expected.minishell > /dev/null && succeded || failed
|
|
}
|
|
|
|
when_run()
|
|
{
|
|
cat > /tmp/input.minishell
|
|
./minishell &> /tmp/got.minishell < /tmp/input.minishell
|
|
RAN+=1
|
|
NAME=$1
|
|
}
|
|
|
|
expecting()
|
|
{
|
|
cat > /tmp/expected.minishell
|
|
assert
|
|
}
|
|
|
|
setup()
|
|
{
|
|
rm -f report.txt
|
|
}
|
|
|
|
finalize()
|
|
{
|
|
echo
|
|
echo "$RAN tests ran. $SUCCEDED succeded, $FAILED failed."
|
|
if [ $SUCCEDED -eq $RAN ];
|
|
then
|
|
echo "All integration tests passed!"
|
|
else
|
|
echo "cat report.txt"
|
|
echo "to see details of failed tests"
|
|
fi
|
|
exit $FAILED
|
|
}
|
|
|
|
setup
|
|
|
|
when_run <<EOF "empty inputs returns nothing"
|
|
|
|
EOF
|
|
expecting <<EOF
|
|
EOF
|
|
|
|
when_run <<EOF "simple command is parsed"
|
|
echo hello
|
|
EOF
|
|
expecting <<EOF
|
|
╰─ t_cmdgroup
|
|
├─ t_cmdlist
|
|
│ ├─ num_cmds = 1
|
|
│ ╰─ cmd[0]
|
|
│ ├─ t_cmdlist_item
|
|
│ │ ╰─ t_pipeline
|
|
│ │ ├─ num_cmd = 1
|
|
│ │ ╰─ cmd[0]
|
|
│ │ ╰─ t_simple_cmd
|
|
│ │ ├─ words = [echo][hello]
|
|
│ │ ╰─ (no redirections)
|
|
│ ╰─ t_operator = END
|
|
╰─ (no redirections)
|
|
EOF
|
|
|
|
when_run <<EOF "single redirection is parsed"
|
|
echo hello>outfile
|
|
EOF
|
|
expecting <<EOF
|
|
╰─ t_cmdgroup
|
|
├─ t_cmdlist
|
|
│ ├─ num_cmds = 1
|
|
│ ╰─ cmd[0]
|
|
│ ├─ t_cmdlist_item
|
|
│ │ ╰─ t_pipeline
|
|
│ │ ├─ num_cmd = 1
|
|
│ │ ╰─ cmd[0]
|
|
│ │ ╰─ t_simple_cmd
|
|
│ │ ├─ words = [echo][hello]
|
|
│ │ ╰─ t_redir_list
|
|
│ │ ╰─ redirection[0]
|
|
│ │ ╰─ t_redirection
|
|
│ │ ├─ t_redir_type = REDIR_OUTPUT
|
|
│ │ ╰─ marker = [outfile]
|
|
│ ╰─ t_operator = END
|
|
╰─ (no redirections)
|
|
EOF
|
|
|
|
when_run <<EOF "redirections are parsed"
|
|
echo hello < in hi > out
|
|
EOF
|
|
expecting <<EOF
|
|
╰─ t_cmdgroup
|
|
├─ t_cmdlist
|
|
│ ├─ num_cmds = 1
|
|
│ ╰─ cmd[0]
|
|
│ ├─ t_cmdlist_item
|
|
│ │ ╰─ t_pipeline
|
|
│ │ ├─ num_cmd = 1
|
|
│ │ ╰─ cmd[0]
|
|
│ │ ╰─ t_simple_cmd
|
|
│ │ ├─ words = [echo][hello][hi]
|
|
│ │ ╰─ t_redir_list
|
|
│ │ ├─ redirection[0]
|
|
│ │ │ ╰─ t_redirection
|
|
│ │ │ ├─ t_redir_type = REDIR_INPUT
|
|
│ │ │ ╰─ marker = [in]
|
|
│ │ ╰─ redirection[1]
|
|
│ │ ╰─ t_redirection
|
|
│ │ ├─ t_redir_type = REDIR_OUTPUT
|
|
│ │ ╰─ marker = [out]
|
|
│ ╰─ t_operator = END
|
|
╰─ (no redirections)
|
|
EOF
|
|
|
|
when_run <<EOF "multiple redirections are parsed"
|
|
echo << HERE_DOC hello>outfile there < infile < infile2 >> append
|
|
EOF
|
|
expecting <<EOF
|
|
╰─ t_cmdgroup
|
|
├─ t_cmdlist
|
|
│ ├─ num_cmds = 1
|
|
│ ╰─ cmd[0]
|
|
│ ├─ t_cmdlist_item
|
|
│ │ ╰─ t_pipeline
|
|
│ │ ├─ num_cmd = 1
|
|
│ │ ╰─ cmd[0]
|
|
│ │ ╰─ t_simple_cmd
|
|
│ │ ├─ words = [echo][hello][there]
|
|
│ │ ╰─ t_redir_list
|
|
│ │ ├─ redirection[0]
|
|
│ │ │ ╰─ t_redirection
|
|
│ │ │ ├─ t_redir_type = REDIR_HERE_DOC
|
|
│ │ │ ╰─ marker = [HERE_DOC]
|
|
│ │ ├─ redirection[1]
|
|
│ │ │ ╰─ t_redirection
|
|
│ │ │ ├─ t_redir_type = REDIR_OUTPUT
|
|
│ │ │ ╰─ marker = [outfile]
|
|
│ │ ├─ redirection[2]
|
|
│ │ │ ╰─ t_redirection
|
|
│ │ │ ├─ t_redir_type = REDIR_INPUT
|
|
│ │ │ ╰─ marker = [infile]
|
|
│ │ ├─ redirection[3]
|
|
│ │ │ ╰─ t_redirection
|
|
│ │ │ ├─ t_redir_type = REDIR_INPUT
|
|
│ │ │ ╰─ marker = [infile2]
|
|
│ │ ╰─ redirection[4]
|
|
│ │ ╰─ t_redirection
|
|
│ │ ├─ t_redir_type = REDIR_APPEND
|
|
│ │ ╰─ marker = [append]
|
|
│ ╰─ t_operator = END
|
|
╰─ (no redirections)
|
|
EOF
|
|
|
|
finalize
|