# # Most of these tests were inspired by: # http://www.gnu.org/software/hello/manual/autoconf/Shell-Substitutions.html # exec >&2 set +e FAIL= fail() { echo " failed: $1" FAIL=41 } warn() { echo " warning: $1" [ -n "$FAIL" ] || FAIL=42 } name=foo.o.o ext=.o [ "${name#foo.o}" = ".o" ] || fail 3 spacey="this has * and spaces" case $spacey in *) spaceout=$name$spacey ;; esac [ "$spaceout" = "$name$spacey" ] || fail 4 n() { echo "$#$@"; } f=" - " out=$(n - ""$f"" -) [ "$out" = "5- - -" ] || warn 5 n1() { echo $#; } n2() { n1 "$@"; } t1=$(n1) t2=$(n2) [ "$t1" = "0" ] || fail 6 [ "$t2" = "0" ] || fail 7 n1() { for i in "$@"; do echo $i; done; } n2() { for i in ${1+"$@"}; do echo $i; done; } t1=$(n1 "Hello World" "!") t2=$(n2 "Hello World" "!") WANT="Hello World !" [ "$t1" = "$WANT" ] || fail 8 [ "$t2" = "$WANT" ] || fail 9 n() { echo ${10}; } t1=$(n 1 2 3 4 5 6 7 8 9 xx yy) [ "$t1" = "xx" ] || fail 10 chicken1=`echo " $spacey" | sed s/a/./g` chicken2="`echo " $spacey" | sed s/a/./g`" chicken3=$(echo " $spacey" | sed s/a/./g) chicken4="$(echo " $spacey" | sed s/a/./g)" [ "$chicken1" = " this h.s * .nd sp.ces" ] || fail 11 [ "$chicken2" = " this h.s * .nd sp.ces" ] || fail 12 [ "$chicken3" = " this h.s * .nd sp.ces" ] || fail 13 [ "$chicken4" = " this h.s * .nd sp.ces" ] || fail 14 f1= f2=goo g1= g2=goo out=$(echo ${f1:-foo} ${f2:-foo} ${g1:=foo} ${g2:=foo}) : ${f1:-roo} ${f2:-roo} ${g1:=roo} ${g2:=roo} [ "$out" = "foo goo foo goo" ] || fail 16 [ "$f1$f2$g1$g2" = "gooroogoo" ] || fail 17 unset a t1=$(echo ${a-b c}) t2=$(echo ${a-'b c'}) t3=$(echo "${a-b c}") t4=$(echo "${a-"b c"}") t5=$(cat <broken echo "`printf 'foo\r\n'`"" bar" | diff -q - broken || fail 59 # # This one is too obnoxious. dash and ash pass the test, but nothing else does, # and this case is just too dumb to care about. Just don't do that! # #t=`echo $(case x in x) echo hello;; esac)` #[ "$t" = "hello" ] || fail 60 x=5 t1=$(($x + 4)) t2=$(echo $(( 010 + 0x10 ))) [ "$t1" = "9" ] || fail 61 [ "$t2" = "24" ] || fail 62 t=$(echo hello ^ cat) [ "$t" = "hello ^ cat" ] || fail 65 t1=$(for d in this-glob-does-*-not-exist; do echo "$d"; done) t2=$(for d in this-glob-does-*-not-exist; do echo "$d"; done) # http://www.gnu.org/software/hello/manual/autoconf/Assignments.html false || foo=bar; [ "$?" = 0 ] || fail 71 foo=`exit 1`; [ "$?" != 0 ] || fail 72 # http://www.gnu.org/software/hello/manual/autoconf/Shell-Functions.html f1() { echo 1; } f2(){ echo 2;} f3()(echo 3) f4()if true; then echo 4; fi f5() ( exit 5 ) [ "$(f1)" = 1 ] || fail 81 [ "$(f2)" = 2 ] || fail 82 [ "$(f3)" = 3 ] || fail 83 [ "$(f4)" = 4 ] || fail 84 f5 && fail 85 f6() ( f6b() { return 1; } set -e f6b fail 86 ) f6 f7() { :; }; f7=; f7 || fail 87 a= f8() { echo $a; }; t8=$(a=1 f8) [ "$t8" = "1" ] || fail 88 # http://www.gnu.org/software/hello/manual/autoconf/Limitations-of-Builtins.html . /dev/null || fail 90 (! : | :) && fail 91 || true (! { :; }) && fail 92 || true t3=none case frog.c in (*.c) t3=c ;; (*) t3=all ;; esac [ "$t3" = "c" ] || fail 93 t4=$(echo '\n' | wc -l) [ "$t4" -eq 1 ] || warn 94 f5() { for arg; do echo $arg done } t5=$(f5 a=5 b c) [ "$t5" = "a=5 b c" ] || fail 95 t6=$(printf -- '%d %d' 5 6) [ "$t6" = "5 6" ] || fail 96 echo 'word\ game stuff' >shellfile read t7a t7b