# regression tests for the tr utilitiy KEEP "*.dat" function DATA { typeset f integer i typeset -i8 n for f do test -f $f && continue case $f in chars.dat) typeset -i8 o for ((o = 0; o < 256; o++)) do print -f "\\${o#8#}" done ;; lower.dat) for a in '[' a b c d e f g h i j k l m n o p q r s t u v w x y z ']' do print "$a" done ;; nul.dat) print -- '[a\000b\007c\014d\015e\016f\n\000x\015]' ;; nul1.dat) print -- '[a\000b\007c\014de\016f\n\000x]' ;; nul2.dat) print -- '[ab\007c\014de\016f\nx]' ;; nul3.dat) print -- '[a\nb\007c\fd\ne\016f\n\nx\n]' ;; nul4.dat) print -- '[a\nb\nc\nd\ne\016f\n\nx\n]' ;; nul5.dat) print -- '\0bc123' ;; upper.dat) for a in '[' A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ']' do print "$a" done ;; zero.dat) for ((n = 0; n < 256; n++)) do print -f '\0' done ;; esac > $f done } TEST 01 'simple translation' EXEC aaa xyz INPUT - $'abcxyz' OUTPUT - $'zbcxyz' EXEC 'a-a' 'z' EXEC 'a-b' 'z' OUTPUT - $'zzcxyz' EXEC 'abc' 'AB-' OUTPUT - $'AB-xyz' EXEC 'ab-' 'ABC' OUTPUT - $'ABcxyz' EXEC 'ab-' 'ABC' INPUT - $'ab-xyz' OUTPUT - $'ABCxyz' EXEC '[a-a]' 'z' INPUT - $'abcxyz' OUTPUT - $'zbcxyz' EXEC '[a-b]' 'z' OUTPUT - $'zzcxyz' EXEC '[abc]' '[AB-]' OUTPUT - $'ABCxyz' EXEC AAA XYZ INPUT - $'ABCXYZ' OUTPUT - $'ZBCXYZ' EXEC 'A-A' 'Z' EXEC 'A-B' 'Z' OUTPUT - $'ZZCXYZ' EXEC 'ABC' 'ab-' OUTPUT - $'ab-XYZ' EXEC 'AB-' 'abc' OUTPUT - $'abCXYZ' EXEC 'AB-' 'abc' INPUT - $'AB-XYZ' OUTPUT - $'abcXYZ' EXEC '[A-A]' 'Z' INPUT - $'ABCXYZ' OUTPUT - $'ZBCXYZ' EXEC '[A-B]' 'Z' OUTPUT - $'ZZCXYZ' EXEC '[ABC]' '[ab-]' OUTPUT - $'abcXYZ' EXEC '[ab-]' '[ABC]' INPUT - $'abcxyz' OUTPUT - ERROR - $'tr: [ab-]: invalid source string' EXIT 1 EXEC '[ab-]' '[ABC]' EXEC '[ab-]' '[AB-]' EXEC '[AB-]' '[abc]' ERROR - $'tr: [AB-]: invalid source string' EXEC '[AB-]' '[abc]' EXEC '[AB-]' '[ab-]' TEST 02 'case conversion' DO DATA lower.dat upper.dat EXEC INPUT lower.dat SAME OUTPUT lower.dat EXEC INPUT upper.dat SAME OUTPUT upper.dat EXEC abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ EXEC a-z A-Z EXEC '[a-z]' '[A-Z]' EXEC '[:lower:]' '[:upper:]' EXEC '[[:lower:]]' '[[:upper:]]' EXEC abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ INPUT lower.dat EXEC abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ EXEC a-z A-Z EXEC '[a-z]' '[A-Z]' EXEC '[:lower:]' '[:upper:]' EXEC '[[:lower:]]' '[[:upper:]]' EXEC ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz SAME OUTPUT lower.dat EXEC A-Z a-z EXEC '[A-Z]' '[a-z]' EXEC '[:upper:]' '[:lower:]' EXEC '[[:upper:]]' '[[:lower:]]' EXEC ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz INPUT upper.dat EXEC A-Z a-z EXEC '[A-Z]' '[a-z]' EXEC '[:upper:]' '[:lower:]' EXEC '[[:upper:]]' '[[:lower:]]' TEST 03 'NUL combinations' DO DATA zero.dat nul.dat nul1.dat nul2.dat nul3.dat nul4.dat EXEC -d '\000' SAME INPUT zero.dat OUTPUT - EXEC -d '[\015]' SAME INPUT nul.dat SAME OUTPUT nul1.dat EXEC -d '[\015\000]' SAME OUTPUT nul2.dat EXEC -d '[\000\015]' EXEC '[\015\000]' '[\n]' SAME OUTPUT nul3.dat EXEC '[\000\015]' '[\n]' EXEC '\000-\015' '\n' SAME OUTPUT nul4.dat EXEC '[\000-\015]' '[\n]' EXEC '[\000-\015]' '\n' EXEC '\000-\015' '[\n]' SAME OUTPUT nul4.dat EXEC '[\000-\015]' '[\n]' TEST 04 'squeeze' EXEC -cs '[a-zA-Z0-9]' '[\n*]' INPUT - $'one two\nthree-four!five\n six\rseven\t\t\n---eight---' OUTPUT - $'one\ntwo\nthree\nfour\nfive\nsix\nseven\neight' EXEC -cs '[a-zA-Z0-9]' '\n' EXEC -cs '[a-zA-Z0-9]' '[\n*]' INPUT - $'@@@one two\nthree-four!five\n six\rseven\t\t\n---eight---' OUTPUT - $'\none\ntwo\nthree\nfour\nfive\nsix\nseven\neight' EXEC -cs '[a-zA-Z0-9]' '\n' EXEC -s '\n' '\n' INPUT - $'a\n\n\nb\nc\n\n\nd\n\ne' OUTPUT - $'a\nb\nc\nd\ne' EXEC -s '\n' EXEC -s '\n' '\n' INPUT - $'\n\n\na\n\n\nb\nc\n\n\nd\n\ne' OUTPUT - $'\na\nb\nc\nd\ne' EXEC -s '\n' EXEC abc '[%*]xyz' INPUT - $'abc' OUTPUT - $'xyz' EXEC abc '[%*0]xyz' EXEC abc '[%*1]xyz' OUTPUT - $'%xy' EXEC abc '[%*2]xyz' OUTPUT - $'%%x' EXEC abc '[%*3]xyz' OUTPUT - $'%%%' EXEC abc '[%*4]xyz' OUTPUT - $'%%%' TEST 05 'diagnostics' IGNORE OUTPUT ERROR EXEC '[a-z' INPUT - EXIT [12] EXEC 'z-a' EXEC 'b-a' EXEC '[:foo:]' TEST 06 'gnu tr tests' EXEC 'abcd' '[@*]' INPUT - $'abcd' OUTPUT - $'@@@@' EXEC 'abcd' '[]*]' INPUT - $'abcd' OUTPUT - $']]]]' EXEC 'abc' '[%*]yz' INPUT - $'aabbcc' OUTPUT - $'%%yyzz' EXEC 'abc' '[%*]yzx' INPUT - $'aabbcc' OUTPUT - $'yyzzxx' EXEC 'abc' 'xy[%*]' INPUT - $'aabbcc' OUTPUT - $'xxyy%%' EXEC 'abc' 'xy[%*]z' INPUT - $'aabbcc' OUTPUT - $'xxyyzz' EXEC '' '[.*]' INPUT - $'abc' OUTPUT - $'abc' EXEC -t 'abcd' 'xy' INPUT - $'abcde' OUTPUT - $'xycde' EXEC 'abcd' 'xy' OUTPUT - $'xyyye' EXEC 'abcd' 'x[y*]' TEST 07 '-s' EXEC -s 'a-p' '%[.*]' INPUT - $'abcdefghijklmnop' OUTPUT - $'%.' EXEC -s 'a-p' '%[.*]$' OUTPUT - $'%.$' EXEC -s 'a-p' '[.*]$' OUTPUT - $'.$' EXEC -s 'a-p' '%[.*]' OUTPUT - $'%.' EXEC -s '[a-z]' INPUT - $'aabbcc' OUTPUT - $'abc' EXEC -s '[a-c]' EXEC -s '[a-b]' OUTPUT - $'abcc' EXEC -s '[b-c]' OUTPUT - $'aabc' EXEC -s '[\0-\5]' INPUT - $'\0\0a\1\1b\2\2\2c\3\3\3d\4\4\4\4e\5\5' OUTPUT - $'\0a\1b\2c\3d\4e\5' TEST 08 '-d' EXEC -d '[=[=]' INPUT - $'[[[[[[[]]]]]]]]' OUTPUT - $']]]]]]]]' EXEC -d '[=]=]' OUTPUT - $'[[[[[[[' EXEC -d '[:digit:]' INPUT - $'a0b1c2d3e4f5g6h7i8j9k' OUTPUT - $'abcdefghijk' EXEC -d '[:xdigit:]' INPUT - $'w0x1y2z3456789acbdefABCDEFz' OUTPUT - $'wxyzz' EXEC -d '[:xdigit:]' INPUT - $'0123456789acbdefABCDEF' OUTPUT - $'' EXEC -d '[:digit:]' INPUT - $'0123456789' EXEC -d '[:lower:]' INPUT - $'abcdefghijklmnopqrstuvwxyz' EXEC -d '[:upper:]' INPUT - $'ABCDEFGHIJKLMNOPQRSTUVWXYZ' EXEC -d '[:lower:][:upper:]' INPUT - $'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' EXEC -d '[:alpha:]' INPUT - $'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' EXEC -d '[:alnum:]' INPUT - $'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' EXEC -d '[:alnum:]' INPUT - $'.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.' OUTPUT - $'..' EXEC -ds '[:alnum:]' '.' OUTPUT - $'.' TEST 09 '-s combinations' EXEC -cs '[:alnum:]' '\n' INPUT - $'The big black fox jumped over the fence.' OUTPUT - $'The\nbig\nblack\nfox\njumped\nover\nthe\nfence' EXEC -cs '[:alnum:]' '[\n*]' EXEC -ds 'b' 'a' INPUT - $'aabbaa' OUTPUT - $'a' EXEC -ds '[:xdigit:]' 'Z' INPUT - $'ZZ0123456789acbdefABCDEFZZ' OUTPUT - $'Z' EXEC -ds '\350' '\345' INPUT -n - $'\300\301\377\345\345\350\345' OUTPUT -n - $'\300\301\377\345' EXEC -s 'abcdefghijklmn' '[:*016]' INPUT - $'abcdefghijklmnop' OUTPUT - $':op' EXEC -d 'a-z' INPUT - $'abc $code' OUTPUT - $' $' EXEC -ds 'a-z' '$.' INPUT - $'a.b.c $$$$code\\' OUTPUT - $'. $\\' TEST 10 'ranges and classes' EXEC 'a-a' 'z' INPUT - $'abc' OUTPUT - $'zbc' EXEC '[:lower:]' '[:upper:]' INPUT - $'abcxyzABCXYZ' OUTPUT - $'ABCXYZABCXYZ' EXEC '[:upper:]' '[:lower:]' OUTPUT - $'abcxyzabcxyz' EXEC 'a[=*2][=c=]' 'xyyz' INPUT - $'a=c' OUTPUT - $'xyz' EXEC '[:*3][:digit:]' 'a-m' INPUT - $':1239' OUTPUT - $'cefgm' EXEC 'a[b*512]c' '1[x*]2' INPUT - $'abc' OUTPUT - $'1x2' EXEC 'a[b*513]c' '1[x*]2' EXEC 'a\-z' 'A-Z' INPUT - $'abc-z' OUTPUT - $'AbcBC' EXEC 0-4 _ INPUT - $'a1-q2589z' OUTPUT - $'a_-q_589z' EXEC 0-4- _ INPUT - $'a1-q2589z' OUTPUT - $'a__q_589z' EXEC 0-4-9 _ INPUT - $'a1-q2589z' OUTPUT - $'a__q_58_z' TEST 11 'from ross' EXEC -cs '[:upper:][:digit:]' '[Z*]' EXEC -dcs '[:alnum:]' '[:digit:]' EXEC -dc '[:lower:]' EXEC -dc '[:upper:]' EXEC -cs '[:upper:]' '[X*]' INPUT -n - $'AMZamz123.-+AMZ' OUTPUT -n - $'AMZXAMZ' EXEC -dcs '[:lower:]' 'n-rs-z' INPUT -n - $'amzAMZ123.-+amz' OUTPUT -n - $'amzamz' EXEC -ds '[:xdigit:]' '[:alnum:]' INPUT - $'.ZABCDEFGzabcdefg.0123456788899.GG' OUTPUT - $'.ZGzg..G' TEST 12 'gnu complains about these' DO DATA nul5.dat EXEC 'a' '' INPUT - $'abc123' SAME OUTPUT nul5.dat EXEC -cs '[:upper:]' 'X[Y*]' OUTPUT -n - $'Y' EXEC -cs '[:cntrl:]' 'X[Y*]' OUTPUT - $'Y' TEST 13 'unlucky char sign extension?' EXEC $'\x8d' $'\n' INPUT -n - $'x\x8d' OUTPUT - $'x'