#!/bin/bash cd -- "$(dirname "$0")" if test -z "$TEST"; then TEST=../test fi if echo "$TEST" | grep / > /dev/null; then b="$PREFIX $(dirname "$TEST")/[" else b="$PREFIX [" fi t="$PREFIX $TEST" report () { if test $1 = 0; then printf "\033[1;32mTest %s OK\033[m\n" "$2" else printf "\033[1;31mTest %s FAILED\033[m\n" "$2" fi } report_np () { if test $1 = 0; then printf "\033[1;32mTest %s OK (NON-STANDARD)\033[m\n" "$2" else printf "\033[1;31mTest %s FAILED (NON-STANDARD)\033[m\n" "$2" fi } report_obsharm () { if test $1 = 0; then printf "\033[1;33mTest %s (obsolescent, harmful) OK (NON-STANDARD)\033[m\n" "$2" else printf "\033[1;31mTest %s (obsolescent, harmful) FAILED (NON-STANDARD)\033[m\n" "$2" fi } obsharmless () { printf "\033[1;32mTest %s (obsolescent, harmful) NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1" } report_harm () { if test $1 = 0; then printf "\033[1;33mTest %s (harmful) OK (NON-STANDARD)\033[m\n" "$2" else printf "\033[1;31mTest %s (harmful) FAILED (NON-STANDARD)\033[m\n" "$2" fi } harmless () { printf "\033[1;32mTest %s (harmful) NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1" } nosupport () { printf "\033[1;33mTest %s NOT SUPPORTED (NON-STANDARD)\033[m\n" "$1" } supported () { $t "$@" 2> /dev/null test $? -lt 2 } xsleep () { python3 < /dev/null A=$? $b -e . \] -e . 2> /dev/null B=$? $b -e . \] && test $A -eq 2 && test $B -eq 2 report $? "bracket" } bflag () { T -b /dev/sda && F -b /dev/null report $? "bflag" } cflag () { T -c /dev/null && F -c /dev/sda report $? "cflag" } dflag () { T -d . && F -d test report $? "dflag" } eflag () { ln -sf /erefdsghw4th42hwrgb tmp T -e /dev/sda && T -e /dev/null && T -e /dev && T -e test && T -e . && F -e /erefdsghw4th42hwrgb && F -e tmp report $? "eflag" rm tmp } fflag () { ln -sf test tmp T -f test && F -f . && F -f /dev/null && T -f tmp report $? "fflag" rm tmp } gflag () { touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp1 tmp2 chmod 5600 tmp1 chmod 2600 tmp2 F -g tmp1 && T -g tmp2 report $? "gflag" rm tmp1 tmp2 } hflag_1 () { touch tmp; rm tmp ln -sf / tmp T -h tmp && F -h / report $? "hflag_1" rm tmp } hflag_2 () { touch tmp; rm tmp ln -sf /3tgrgtrghwhgsh tmp T -h tmp && F -h / report $? "hflag_2" rm tmp } kflag () { touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp1 tmp2 chmod 6600 tmp1 chmod 1600 tmp2 F -k tmp1 && T -k tmp2 report_np $? "kflag" rm tmp1 tmp2 } Lflag_1 () { touch tmp; rm tmp ln -sf / tmp T -L tmp && F -L / report $? "Lflag_1" rm tmp } Lflag_2 () { touch tmp; rm tmp ln -sf /3tgrgtrghwhgsh tmp T -L tmp && F -L / report $? "Lflag_2" rm tmp } nflag () { T -n . && F -n '' report $? "nflag" } pflag () { touch tmp; rm tmp touch tmp F -p tmp r=$? rm tmp mkfifo tmp test $r = 0 && T -p tmp report $? "pflag" rm tmp } rflag () { touch tmp; rm tmp touch tmp chmod 0 tmp F -r tmp r=$? chmod o+r tmp test $r = 0 && F -r tmp r=$? chmod u+r tmp test $r = 0 && T -r tmp report $? "rflag" chmod u+w tmp rm tmp } sflag () { touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp1 echo x > tmp2 F -s tmp1 && T -s tmp2 report $? "sflag" rm tmp1 tmp2 } tflag () { T -t 0 < /dev/tty && T -t 4 4>> /dev/tty && F -t 0 < test report $? "tflag" } uflag () { touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp1 tmp2 chmod 3600 tmp1 chmod 4600 tmp2 F -u tmp1 && T -u tmp2 report $? "uflag" rm tmp1 tmp2 } wflag () { touch tmp; rm tmp touch tmp chmod 0 tmp F -w tmp r=$? chmod o+w tmp test $r = 0 && F -w tmp r=$? chmod u+w tmp test $r = 0 && T -w tmp report $? "wflag" rm tmp } xflag_f () { touch tmp; rm tmp touch tmp chmod 0 tmp F -x tmp r=$? chmod o+x tmp test $r = 0 && F -x tmp r=$? chmod u+x tmp test $r = 0 && T -x tmp report $? "xflag_f" chmod u+w tmp rm tmp T -x . } xflag_d () { T -x . report $? "xflag_d" } zflag () { T -z '' && F -z . report $? "zflag" } string () { touch tmp; rm tmp T x && F && F '' && T -1 && T -e && T -n && T -z && $t --help > tmp && ! test -s tmp && $t --version > tmp && ! test -s tmp && $b --help \] > tmp && ! test -s tmp && $b --version \] > tmp && ! test -s tmp && ! $t -- -e . 2> /dev/null report $? "string" rm tmp } eq_sign () { T a = a && F a = b && F 1 = 01 && T a=b report $? "eq_sign" } eqeq_sign () { $t a == b 2> /dev/null if test $? -eq 2; then nosupport "eqeq_sign (redundant)" else T a == a && F a == b && F 1 == 01 && T a=b report_np $? "eqeq_sign (redundant)" fi } ne_sign () { T a != b && F a != a && T 1 != 01 && T a!=a report $? "ne_sign" } eq_flag () { T 1 -eq 1 && T 1 -eq 01 && F 1 -eq 0 && FX a -eq a 2> /dev/null && T -1 -eq -1 && T 1 -eq +1 report $? "eq_flag" } ne_flag () { T 1 -ne 2 && F 1 -ne 1 && F 1 -ne 01 && FX a -ne b 2> /dev/null && T -1 -ne -2 report $? "ne_flag" } gt_flag () { T 2 -gt 1 && T 02 -gt 1 && F 1 -gt 2 && FX b -gt a 2> /dev/null && T -1 -gt -2 && F 1 -gt 1 report $? "gt_flag" } ge_flag () { T 2 -ge 1 && T 02 -ge 1 && F 1 -ge 2 && FX b -ge a 2> /dev/null && FX a -ge a 2> /dev/null && T -1 -ge -2 && T 1 -ge 1 && T 1 -ge +1 report $? "ge_flag" } lt_flag () { T 1 -lt 2 && T 1 -lt 02 && F 2 -lt 1 && FX a -lt b 2> /dev/null && T -2 -lt -1 && F 1 -lt 1 report $? "lt_flag" } le_flag () { T 1 -le 2 && T 1 -le 02 && F 2 -le 1 && FX a -le b 2> /dev/null && FX a -le a 2> /dev/null && T -2 -le -1 && T 1 -le 1 && T +1 -le 1 report $? "le_flag" } ef_flag () { touch tmp; rm tmp touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp link tmp tmp1 touch tmp2 T tmp -ef tmp1 && F tmp -ef tmp2 r=$? rm tmp1 ln -s tmp tmp1 test $r = 0 && T tmp -ef tmp1 report_np $? "ef_flag" rm tmp tmp1 tmp2 } nt_flag () { touch tmp; rm tmp touch tmp T tmp -nt /usr && F /usr -nt tmp report_np $? "nt_flag" rm tmp } ot_flag () { touch tmp; rm tmp touch tmp F tmp -ot /usr && T /usr -ot tmp report_np $? "ot_flag" rm tmp } aflag () { if ! supported '' -a ''; then obsharmless "aflag" else T a -a b && F a -a '' && FAIL a -ab 2> /dev/null && FX a -a 2> /dev/null && FX -a a 2> /dev/null && T -z '' -a -n x && F -z '' -a -n '' && F -z x -a -n x && F -z x -a -n '' report_obsharm $? "aflag" fi } oflag () { if ! supported '' -o ''; then obsharmless "oflag" else T a -o b && T a -o '' && F '' -o '' && FAIL a -ob 2> /dev/null && FX -o a 2> /dev/null && FX a -o 2> /dev/null && T -z '' -o -n x && T -z '' -o -n '' && T -z x -o -n x && F -z x -o -n '' report_obsharm $? "oflag" fi } excl () { T ! -n '' && FAIL !-n '' 2> /dev/null report $? "excl" } excl_prec () { if ! supported ! '' -a ''; then obsharmless "excl_prec" else T -z '' -a ! -n '' && T ! -n '' -a -z '' && F ! '' -a '' report_obsharm $? "excl_prec (questionable)" fi } oflag_aflag () { if ! supported xx -o xx -a xx; then obsharmless "oflag_aflag" else T xx -o xx -a xx && T xx -o xx -a '' && T xx -o '' -a xx && T xx -o '' -a '' && T '' -o xx -a xx && F '' -o xx -a '' && F '' -o '' -a xx && F '' -o '' -a '' report_obsharm $? "oflag_aflag" fi } parenthesis () { if ! supported '(' -e / ')'; then obsharmless "parenthesis" else T xx -o \( xx -a xx \) && T xx -o \( xx -a '' \) && T xx -o \( '' -a xx \) && T xx -o \( '' -a '' \) && T '' -o \( xx -a xx \) && F '' -o \( xx -a '' \) && F '' -o \( '' -a xx \) && F '' -o \( '' -a '' \) && T \( xx -a xx \) && F \(xx = xx\) report_obsharm $? "parenthesis" fi } multiexcl () { T ! ! ! "" 2> /dev/null && F ! ! "" 2> /dev/null report $? "multiexcl" } multiexcl_many () { T ! ! ! ! ! "" 2> /dev/null report_np $? "multiexcl_many" } bigint () { T 999999999999999999999999999999999999999999999999 -gt 1 2> /dev/null && T 11 -gt 2 && T 9 -gt 1 && T 0 -eq 0 && T -1 -eq -1 && T -1 -lt 0 && T -1 -lt 1 && T 0 -gt -1 && T 0 -eq 0 && T 0 -lt 1 && T 1 -gt -1 && T 1 -gt 0 && T 1 -eq 1 report $? "bigint" } prec () { touch -- -eq; rm -- -eq touch -- -eq T -f -eq 2> /dev/null && T -f = -f 2> /dev/null report $? "prec" rm -- -eq } np_prec () { if ! supported '' -a ''; then obsharmless "np_prec" else T -n -a -n 2> /dev/null report_obsharm $? "np_prec" fi } Sflag () { touch tmp1; rm tmp1 touch tmp2; rm tmp2 touch tmp2 python3 < ''; then harmless "gt_sign" else F '' \> '' && F '' \> a && T a \> '' && F a \> a && F a \> b && T b \> a && F A \> a && T a \> A && F A \> b && T b \> A && T z \> aa && F aa \> z report_harm $? "gt_sign" fi } ge_sign () { if ! supported '' \>= ''; then harmless "ge_sign" else T '' \>= '' && F '' \>= a && T a \>= '' && T a \>= a && F a \>= b && T b \>= a && F A \>= a && T a \>= A && F A \>= b && T b \>= A && T z \>= aa && F aa \>= z report_harm $? "ge_sign" fi } Nflag () { if ! supported -N "$0"; then harmless "Nflag" else if test -e tmp; then rm tmp fi F -N tmp r1=$? touch tmp xsleep 1.001 touch -m tmp T -N tmp r2=$? touch -a tmp F -N tmp r3=$? # And for good measure { rm tmp touch tmp ; touch -a tmp F -N tmp r4=$? xsleep 0.01 rm tmp touch tmp ; touch -a tmp F -N tmp r5=$? # } test $r1 = 0 && test $r2 = 0 && test $r3 = 0 && test $r4 = 0 && test $r5 = 0 report_harm $? "Nflag" rm tmp fi } if test $# = 0; then set bracket bflag cflag dflag eflag fflag gflag hflag_1 hflag_2 kflag Lflag_1 Lflag_2 nflag \ pflag rflag sflag tflag uflag wflag xflag_f xflag_d zflag string eq_sign ne_sign eq_flag \ ne_flag gt_flag ge_flag lt_flag le_flag ef_flag nt_flag ot_flag aflag oflag excl Eflag \ excl_prec oflag_aflag parenthesis multiexcl multiexcl_many bigint prec np_prec Sflag \ not_eq_not eq_parenthesis eqeq_sign lt_sign le_sign gt_sign ge_sign Nflag fi ( for f in $@; do $f done ) | tee result ! grep FAILED < result > /dev/null ret=$? if test $ret != 0; then if test $(grep FAILED < result | grep -v NON-STANDARD | wc -l) = 0; then ret=1 else ret=2 fi fi rm result exit $ret