apenwarr-redo/minimal/do.test
Avery Pennarun 686c381109 Fix more inconsistent behaviour with symlinks in paths.
Both redo and minimal/do were doing slightly weird things with
symlinked directories, especially when combined with "..".  For
example, if x is a link to ., then x/x/x/x/../y should resolve to
"../y", which is quite non-obvious.

Added some tests to make sure this stays fixed.
2018-12-17 16:17:37 +00:00

176 lines
3.5 KiB
Bash
Executable file

#!/bin/sh
. ./do
set -e
NAME=$(basename "$0")
TESTNUM=0
SECT=root
SECTION()
{
SECT=$1
TESTNUM=0
printf "\nTesting \"$1\" in $0:\n"
}
no_nl()
{
echo "$1" | {
out=
while read -r line; do
out="$out$line "
done
printf "%s" "${out% }"
}
}
check_s()
{
local want="$1" got="$2" cmd="$3"
want_s=$(no_nl "$want")
got_s=$(no_nl "$got")
[ -z "$cmd" ] && cmd=$got
TESTNUM=$((TESTNUM + 1))
if [ "$want" != "$got" ]; then
printf "\n<<< expected:\n%s\n=== got:\n%s\n>>>\n" "$want" "$got"
printf "! %s:%d '%.40s' = %s FAILED\n" "$SECT" "$TESTNUM" "$want_s" "$cmd"
exit 1
else
printf "! %s:%d '%.40s' = %s ok\n" "$SECT" "$TESTNUM" "$want_s" "$cmd"
fi
}
check()
{
local want="$1" got= rv=
shift
rv=0
got=$("$@") || rv=$?
if [ "$rv" -ne 0 ]; then
check_s "<returned 0>" "<returned $rv>"
else
check_s "$want" "$got" "$*"
fi
}
retval()
{
set +e
"$@" >&2
local rv=$?
set -e
echo "$rv"
return 0
}
SECTION _starts_ends_with
check "0" retval true
check "1" retval false
check "0" retval _startswith "x.test" "x."
check "1" retval _startswith "x.test" "y."
check "1" retval _startswith "" " "
check "1" retval _startswith "x.test" "x*"
check "1" retval _startswith "do.test" "do*"
check "0" retval _endswith "x.test" ".test"
check "1" retval _endswith "x.test" ".best"
check "1" retval _endswith "" " "
check "1" retval _endswith "x.test" "*.test"
check "1" retval _endswith "do.test" "*.test"
SECTION _dirsplit
_dirsplit "/a/b/c"
check_s "/a/b/" "$_dirsplit_dir"
check_s "c" "$_dirsplit_base"
_dirsplit "/a/b/c/"
check_s "/a/b/c/" "$_dirsplit_dir"
check_s "" "$_dirsplit_base"
_dirsplit "/"
check_s "/" "$_dirsplit_dir"
check_s "" "$_dirsplit_base"
SECTION _relpath
x=$PWD/x
check "a/b/c" _relpath "$x/a/b/c" "$x"
check "../a/b/c" _relpath "$x/../a/b/c" "$x"
check "" _relpath "$x" "$x"
check "a/b/c" _relpath a/b/c "/"
check "a/b/c" _relpath /a/b/c "/"
check "" _relpath / "/"
check "../lib" _relpath /usr/lib "/usr/bin"
check "../lib/" _relpath /usr/lib/ "/usr/bin"
check "../.." _relpath / "/usr/bin"
check ".." _relpath .. "$PWD/fakedir"
check "../" _relpath ../ "$PWD/fakedir"
check "../fakedir" _relpath ../fakedir "$PWD/fakedir"
SECTION _normpath
check "/usr/lib" _normpath /usr/../usr/bin/../lib "$x"
check "/" _normpath /a/b/c/../../.. "$x"
check "/" _normpath / "$x"
check "../a" _normpath ../a "$x"
check "../a/b" _normpath ../a/b "$x/fakedir"
check ".." _normpath .. "$x/fakedir"
check "tuv" _normpath a/b/../../tuv "/"
check "" _normpath a/b/../.. "/"
check ".." _normpath ../ "$x"
check ".." _normpath .. "$x"
SECTION _realpath
rm -rf y
mkdir y
ln -s . y/x
check "/usr/__does_not/b" _realpath "/usr/__does_not/a/../b" "$x"
check "foo" _realpath "y/x/x/x/x/x/../foo" "$PWD"
check "$(/bin/pwd)/foo" _realpath "$PWD/y/x/x/x/x/x/../foo" "$PWD"
check "foo/blam" _realpath "y/x/x/x/x/x/../foo/spam/../blam" "$PWD"
check "$(/bin/pwd)/foo/blam" _realpath "$PWD/y/x/x/../foo/spam/../blam" "$PWD"
SECTION _find_dofile
check "test.do" _find_dofiles test
check "test.do" _find_dofile test
want="x.y.zz.do
default.y.zz.do
default.zz.do"
check "$want" _find_dofiles x.y.zz
want="x.y.zz.do
default.y.zz.do
default.zz.do
default.do
../default.y.zz.do
../default.zz.do"
(cd fakedir && check "$want" _find_dofiles x.y.zz)
(cd fakedir && check "../default.zz.do" _find_dofile x.y.zz)
set +e
got=$(_find_dofiles x.y.z)
rv=$?
set -e
check_s "1" "$rv"
top_want="x.y.z.do
default.y.z.do
default.z.do
default.do
../default.y.z.do
../default.z.do
../default.do"
check_s "$top_want" "$(echo "$got" | head -n 7)" "_find_dofiles x.y.z"
exit 0